用Python实现的10种聚类算法汇总

前言

聚类是一种无监督学习问题。

它经常用来在输入数据的特征空间中寻找分组,例如基于顾客行为将消费者分组。

聚类算法有很多种,没有哪一种聚类算法适用于所有的问题。不过,有必要去探究多种聚类算法,以及每种算法的不同配置,这样在遇到问题时才能做出合适的选择。

在本文中,你将会了解如何选择合适的聚类算法,并且使用python和scikit-learn去实现它们。

目录

全文分为三大部分:

  1. 聚类问题
  2. 聚类算法
  3. 聚类算法的实例
    3.1 安装相应的包
    3.2 聚类数据集
    3.3 近邻传播
    3.4 凝聚聚类
    3.5 BIRCH聚类
    3.6 DBSCAN聚类
    3.7 K-Means聚类
    3.8 Mini-Batch K-Means聚类
    3.9 Mean Shift聚类
    3.10 OPTICS聚类
    3.11 谱聚类
    3.12 高斯混合模型

一 、聚类问题

聚类是无监督学习,可以自动发现数据中的自然分组。不像监督学习(预测模型等),聚类算法只解释输入数据,并且在特征空间中发现自然分组或者簇。

一个簇通常是特征空间中的一个集中密度区域,该范围(数据行)里的样本更加接近本簇,而不是其他簇。簇会有一个中心(质心),该中心可能是一个样本或者特征空间点,簇还会有一个边界或者范围。

聚类作为一种数据分析技术来帮助了解更多关于问题域的信息,即所谓的模式发现或知识发现。

举几个例子:

  • 系统进化树可以认为是人工聚类分析的结果;
  • 将正常数据与异常值分隔开是一种聚类问题;
  • 根据自然行为将集群进行分组,称为市场细分;

聚类还能作为一种特征工程,样本被标记上簇标签,作为新的一组特征。

对已经识别的簇判定其准确性是非常主观的,尽管有很多量化的判定规则,但可能仍需要该领域的专家来确认。

聚类算法

聚类算法有很多种。

很多算法使用相似度或者距离测量在特征空间中的例子用来发现观测到的区域的粘稠度。同样的,在规整数据之前使用聚类算法是一种很好的做法。


中心对所有的聚类分析来说是一种在被聚类的个体之间相似度或者不相似度程度的概念。一个聚类的方法能够将对象根据相似度的概念分组。

— Page 502, The Elements of Statistical Learning: Data Mining, Inference, and Prediction, 2016.

一些聚类算法需要你去指定或者猜测这个簇的数量在数据中,然而其他的需要指定在案例中可能会被考虑为“closed" 或者”connected"观察点之间的最小距离。“

因此,聚类分析是一种迭代的过程,在这个过程中确定簇的主观评价反馈到算法参数方面的改变直到一个需要的或者合适的结果被得到。

scikit-learn库提供了很多不同的聚类方法去选择。

10种最流行的算法如下列所示:
近邻传播
凝聚聚类
BIRCH聚类
DBSCAN聚类
K-Means聚类
Mini-Batch K-Means聚类
Mean Shift聚类
OPTICS聚类
谱聚类
高斯混合模型

每个算法提供了不同的方式去发现来自不同组自然数据的挑战。

没有最好的聚类算法,在不使用受控的实验条件下也不太容易发现最好的聚类算法。

再这个教程中,我们会回顾使用10种种来自于scikit-learn库最流行的算法。

实例将会提供使用这些例子并且再你自己的数据上进行使用这些方法进行测试。

我们不会探讨算法工作背后的理论,或者直接比较他们。对于这个话题比较好的起点,请看:

Clustering, scikit-learn API.

开始吧。

聚类散算法的实例

在这个章节中,我们将会回顾怎么使用在scikit-learn中10种流行的聚类算法。

这些包括一个适合这个模型的例子,和一个可视化结果的例子。

这些例子被设计成让你熟悉你自己的项目并且在你自己的数据上能够使用这些方法。

建立库

第一步,让我们来建立库。

不要跳过这一步,你需要确保你安装了最新的版本。

你可以通过pip建scikit-learn 库,如下

pip install scikit-learn

对于对你自己平台的额外的建立命令,可以从:
Installing scikit-learn找到答案

下一步,确定这个库被建立并且确定你正在使用的版本。

运行下列的脚本打印库的版本号。

import sklearn
print(sklearn.version)

运行这个脚本,你将会看到下列的版本号或者更高。

0.22.2

集簇数据集

我们将使用 make_classification() function来去创建一个二进制分类数据集。

这个数据集有10000个例子,有两个输入的特征,每个类有一个簇。簇在二维是很明显的可视的,所以我们能画出这个数据,并且通过特定的簇描绘出这些点。这些会。

在这个测试问题中的簇是基于多元高斯,而不是所有的聚类算法能够有效的识别这些簇。因此,在这个教程中的各个方法的结果不应该被用来比较这些方法。

下面是一个例子用来创建和总结集簇数据集

synthetic classification dataset

from numpy import where
from sklearn.datasets import make_classification
from matplotlib import pyplot

define dataset

X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

create scatter plot for samples from each class

for class_value in range(2):
# get row indexes for samples with this class
row_ix = where(y == class_value)
# create scatter of these samples
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

show the plot

pyplot.show()

运行这个示例代码创造一个合成数据集,然后创造一个输入数据的散点图并且根据颜色分类。

我们可以清除的看到两个明显的不同组的数据在不同的方向,希望构成一个自动聚类算法可以检测出这些分组。

下一步,我们将开始关注于应用于这个数据集的聚类算法。

我做了最小的调整使这个方法实用这个数据集。

你能在其中一个算法中得到一个最好的结果吗?
让我在下面的评论区知道。

邻近算法
邻近算法内容为找到一系列最好的标本能够总结总的数据。


我们设计了一个方法称为”亲和传播“,采用一种在数种成对相似性措施。实值信息是在数据点之间交换直到高质量的标本和相应的簇逐渐出现。

— Clustering by Passing Messages Between Data Points, 2007.

这个技术在下列文章中被展现:
Clustering by Passing Messages Between Data Points, 2007.

它是通过相似传播类实现的,主要的参数减弱0.5至1,可能最好调整0.5至1.

完整的脚本在下面列出来。

affinity propagation clustering

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AffinityPropagation
from matplotlib import pyplot

define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

define the model

model = AffinityPropagation(damping=0.9)

fit the model

model.fit(X)

assign a cluster to each example

yhat = model.predict(X)

retrieve unique clusters

clusters = unique(yhat)

create scatter plot for samples from each cluster

for cluster in clusters:
# get row indexes for samples with this cluster
row_ix = where(yhat == cluster)
# create scatter of these samples
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

show the plot

pyplot.show()

运行例子适合该模型的训练数据集和预测一个集群中的每个示例数据集。然后创建一个散点图与集群点颜色的分配。

在这个案例中,我不能得到一个好的结果。

凝聚聚类
凝聚聚类包括联合样本直到所需要的簇被得到。

这是一个更广泛的层次聚类的方法的一部分,你可以在这里了解更多:
Hierarchical clustering, Wikipedia

它通过凝聚聚类类实现并且主要的参数配置是“n_clusters”,簇的数量的估计在data,e.g.2。

运行脚本适合该模型的训练数据集和预测一个集群中的每个示例数据集。然后创建一个散点图与集群点颜色的分配。

在这种情况下,找到一个合理的分组。

BIRCH聚类算法

BIRCH聚类算法(BIRCH是利用层次方法的平衡迭代规约和聚类)包括从簇中提取的树结构。


BIRCH持续增加簇,这些簇进入多重度量数据来在可用的资源(可用的内存以及时间约束)下生成最好的质量簇。
"
— BIRCH: An efficient data clustering method for large databases, 1996.

这个技术在下列文章中被展现:

BIRCH: An efficient data clustering method for large databases, 1996.

这个方法是通过Birch类去实现的并且主要的参数调优是“threshold” 和 “n_clusters” 超参数,后者参数提供了估计集群的数量。

完整的脚本在下列被展现。

运行脚本适合该模型的训练数据集和预测一个集群中的每个示例数据集。然后创建一个散点图与集群点颜色的分配。

在这个案例中,一个极好的分组被发现。

DBSCAN聚类

DBSCAN聚类(DBSCAN聚类是具有噪声的基于密度的聚类方法)包括发现高密度区域以及扩大这些地区周围的特征空间作为簇。


我们提出新的聚类算法DBSCAN依赖于基于密度的簇的概念,DBSCAN被设计去发现不同形状的簇。DBSCAN只需要一个输入参数,支持用户确定一个适当的值。

— A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise, 1996.

这个技术在下列文章中被展现:
A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise, 1996.

这是通过DBSCAN类实现的,主要的参数配置是“eps"和”min_samples"参数。

完整的示例脚本如下:

dbscan clustering

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN
from matplotlib import pyplot

define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

define the model

model = DBSCAN(eps=0.30, min_samples=9)

fit model and predict clusters

yhat = model.fit_predict(X)

retrieve unique clusters

clusters = unique(yhat)

create scatter plot for samples from each cluster

for cluster in clusters:
# get row indexes for samples with this cluster
row_ix = where(yhat == cluster)
# create scatter of these samples
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

show the plot

pyplot.show()

运行脚本适合该模型的训练数据集和预测一个集群中的每个示例数据集。然后创建一个散点图与集群点颜色的分配。

在这个案例中,一个可能的分组被发现,尽管更多的参数还需要调整。

K-Means聚类

K-means聚类可能是最广为人知的聚类算法,涉及到把样本分为簇以及减少在每个簇中的方差


本文主要目的是描述一个过程,这个过程是分割N维总体在k集样本的基础上。这个过程被称为”K-means“,似乎是在各类之间的方差上进行分组

— Some methods for classification and analysis of multivariate observations, 1967.

技术在下列文章中被展现:
k-means clustering, Wikipedia

主要是通过KMeans类以及主要的参数调整为“n_clusters"参数估计数据中簇的数量。

完整的脚本如下:

k-means clustering

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans
from matplotlib import pyplot

define dataset

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

define the model

model = KMeans(n_clusters=2)

fit the model

model.fit(X)

assign a cluster to each example

yhat = model.predict(X)

retrieve unique clusters

clusters = unique(yhat)

create scatter plot for samples from each cluster

for cluster in clusters:
# get row indexes for samples with this cluster
row_ix = where(yhat == cluster)
# create scatter of these samples
pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

show the plot

pyplot.show()
运行脚本适合该模型的训练数据集和预测一个集群中的每个示例数据集。然后创建一个散点图与集群点颜色的分配。

在这个案例中,一个合理的分组被找见,尽管不等同的等方差在每个维度让这个方法不适合这个数据集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器上VMWare Workstation虚拟机声卡支持

问题:联想服务器没有声卡,Windows 服务器安装了VMWare Workstation,里面的Windows 11虚拟机,我远程桌面上来,没有声卡,但是我想做 声音方面的测试就没办法。 解决办法: 服务器主机上安装虚拟机…

Java 多线程编程:线程的基本概念

在现代计算中,多线程编程是一种常见且重要的技术。Java 提供了强大的多线程支持,使得开发者可以轻松地实现并发编程。本文将详细介绍 Java 中线程的基本概念,包括线程与进程的区别以及线程的生命周期。 线程和进程 首先,让我们了…

5.4符号三角形问题

#include<iostream> #include<stdio.h> using namespace std; int half; int ssum; int cnt0;//减号的个数 int n; int p[100][100]; int countt0; void BackTrack(int s) {if(cnt>half||s*(s-1)/2-cnt>half)return ;if(s>n){countt;return ;}for(int i0;…

RabbitMq教程【精细版一】

一、引言 模块之间的耦合度过高&#xff0c;导致一个模块宕机后&#xff0c;全部功能都不能用了&#xff0c;并且同步通讯的成本过高&#xff0c;用户体验差。 RabbitMQ引言 二、RabbitMQ介绍 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。…

在安装HDFS过程中遇见Permission denied

HDFS Shell命令权限不足问题解决 问题 想必有同学在实战Shell的时候&#xff0c;遇到了&#xff1a; Permission denied: userroot, accessWRITE, inode"/":hadoop:supergroup:drwxr-xr-x 这种类似的问题。 问题的原因就是没有权限&#xff0c;那么为什么呢&#…

功能强大的声音模拟合成软件Togu Audio Line TAL-Mod 1.9.7

Togu Audio Line TAL一个虚拟模拟合成器,具有卓越的声音和几乎无限的调制能力。其特殊的振荡器模型能够创建广泛的声音,从经典的单声道到丰富的立体声引线、效果器和焊盘。路由可以使用虚拟跳线电缆来完成。只需连接调制输出以达到调制的目的。之后,您可以调整调制强度。您不…

【SQLmap】常用命令

文章目录 实际使用案例常用命令基本命令数据库指纹识别用户信息用户权限数据库枚举数据导出密码哈希操作系统命令执行文件操作代理和网络参数指定保存恢复自动搜索注入智能模式等级设置自动注入WAF 绕过杂项帮助和支持 SQLmap 是一款开源的自动化 SQL 注入检测和利用工具&#…

时间复杂度与空间复杂度(小白向)

&#x1f916;&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f31f;&#x1f680; &#x1f916;&#x1f31f; 欢迎降临张有志的未来科技实验室&#x1f916;&#x1f31f; 专栏&#xff1a;数据结构 &#x1f468;‍&#x1f4bb;&#x1f4…

你真的会udf提权???数据库权限到系统权限 内网学习 mysql的udf提权操作 ??msf你会用了吗???

我们在已经取得了数据库的账号密码过后&#xff0c;我们要进一步进行提取的操作&#xff0c;我们mysql有4钟提权的操作。 udf提权(最常用的)mof提权启动项提权反弹shell提权操作 怎么获取密码操作&#xff1a; 怎么获取密码&#xff0c;通过sql注入获取这个大家都应该知道了&a…

Python-数据分析组合可视化实例图【附完整源码】

数据分析组合可视化实例图 开篇&#xff1a;应女朋友的要求&#xff0c;于是写下了这篇详细的数据可视化代码及完整注释 一&#xff1a;柱状图、折线图横向组合网格布局 本段代码使用了pyecharts库来创建一个包含多个图表&#xff08;柱状图、折线图&#xff09;和网格布局的…

51单片机第22步_interrupt和using关键字

Keil C51中有一些关键字&#xff0c;一定要牢记&#xff0c;它和其它CPU不一样&#xff0c;所以需要记住interrupt和using关键字&#xff0c;以及它后面所跟的数字在程序中的意义。 单独提出来讲&#xff0c;我也和大家一样记不住&#xff0c;那些数字的意义太少&#xff0c;不…

第一周:李宏毅机器学习笔记

第一周学习周报 摘要一、机器学习基础理论1. 什么是机器学习&#xff1f;2. 机器学习“寻找”的函数有哪些类型&#xff1f;3. 机器学习中机器如何“寻找”函数&#xff1f;三步走3.1 第一步&#xff1a;设定函数的未知量&#xff08;Function with Unknown Parameters&#xf…

【高考志愿】冶金工程

目录 一、专业简介 1.1 专业定义 1.2 主要课程 1.3 培养目标 二、就业方向与就业前景 三、报考注意 四、行业发展趋势与前景 五、个人特质与职业规划 六、冶金工程专业排名 一、专业简介 1.1 专业定义 冶金工程&#xff0c;这是一门古老而又充满活力的普通高等学校本…

Vue3 按钮根据屏幕宽度展示折叠按钮

文章目录 一、组件封装二、使用三、最终效果(参考)四、参考 一、组件封装 ButtonFold.vue 1、获取父组件的元素&#xff0c;根据元素创建动态插槽 2、插槽中插入父元素标签。默认效果和初始状态相同。 3、当屏幕宽度缩小时&#xff0c;部分按钮通过 dropdown 的方式展示出来&a…

Sqlmap中文使用手册 - 各个参数介绍(持续更新)

目录 1. 指定输出级别2. 指定目标2.1 直接连接数据库2.2 指定目标URL2.3 从代理日志中解析目标2.4 从远程站点地图文件(.xml)中解析目标2.5 从文本中解析目标2.6 从文件加载HTTP请求2.7 将google搜索结果作为攻击目标2.8 从配置INI文件获取目标 3. 请求3.1 指定HTTP方法3.2 指定…

线程安全的懒加载单例模式

一、什么是单例模式 单例模式是一种设计模式&#xff0c;它确保某个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种模式在多种编程语言中都有实现&#xff0c;包括Java和C。单例模式的实现可以采取饿汉式或懒汉式两种方式。饿汉式是在类加载时就创建了…

springboot使用测试类报空指针异常

检查了Service注解&#xff0c;还有Autowired注解&#xff0c;还有其他注解&#xff0c;后面放心没能解决问题&#xff0c;最后使用RunWith(SpringRunner.class)解决了问题&#xff01;&#xff01; 真的是✓8了&#xff0c;烦死了这个✓8报错&#xff01;

VSCode连接远程服务器,并用Docker环境开发和调试

1. 连接服务器操作步骤 1.1 在本机安装SSH 由于我们是使用 SSH 连接远程服务器&#xff0c;因此 Windows 需要支持 SSH。可以通过安装 Git 来获取 SSH 功能&#xff0c;如何验证? 使用 Win R &#xff0c;输入 cmd 打开控制窗口&#xff0c;直接输入 ssh&#xff0c;如下提…

C语言 | Leetcode C语言题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; void cleanLand(char** grid, int gridSize, int ColSize,int row,int column) {if(grid[row][column] 1){//不等于1则清零grid[row][column] 0;}else{//不等于1则返回return ;}int newRow;int newColumn;//上if(row ! 0) //还能上{ne…

每天五分钟计算机视觉:人体姿势识别

本文重点 人体姿势识别是计算机视觉领域的一个重要研究方向,旨在通过图像或视频数据自动检测并识别出人体的各种姿势和动作。随着深度学习技术的快速发展,基于神经网络的方法在这一领域取得了显著进展。神经网络,特别是卷积神经网络(CNN)和循环神经网络(RNN),因其强大…