聚类算法)
一、聚类算法简介
-
聚类算法:
- 一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。
-
聚类算法与分类算法最大的区别:
- 聚类算法是无监督的学习算法,而分类算法属于监督的学习算法。
二、K-means算法
2.1 算法原理
中心点
也可以称之为质心
2.2 K-means算法流程
1、选择聚类的个数K
2、任意产生K个聚类,然后确定聚类中心,或者直接生成K个中心
3、对每个点确定其聚类中心点
4、再计算其聚类新中心
5、重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)
2.3 算法原理
- 欧式距离
- 曼哈顿距离
- 闵氏距离
2.4 K-means算法总结
- 事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,
- 并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类
- 重新计算每个类的质心(即为类中心)
- 重复这样的过程,直到质心不再改变,最终确定了每个样本所属的类别以及每个类的质心
- 由此每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-means算法的收敛速度比较慢
2.5 K-means算法案例
# 导入库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import MiniBatchKMeans,KMeans
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
# 生成数据集
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state =9)
# 绘制数据散点图
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
# 可视化
for index,k in enumerate((2,3,4,5)):
plt.subplot(2,2,index+1)
y_pred = MiniBatchKMeans(n_clusters=k,batch_size=200,random_state=9).fit_predict(X)
score = metrics.calinski_harabaz_score(X,y_pred)
plt.scatter(X[:,0],X[:,1],c=y_pred)
plt.text(.99,.01,('k=%d,score:%.2f'%(k,score)),
transform=plt.gca().transAxes,size=10,horizontalalignment='right')
plt.show()
三、算法效果衡量标准
3.1 SSE值:误差平方和
- 随着K值得增加,SSE值将会一直递减
- 聚类效果有可能好,有可能不好
3.2 K值确定
- 对于n个点得数据集,迭代计算K,from 1 to n
- 每次聚类完成后计算每个点到其所属得簇中心得距离得平方和
- 平方和是会逐渐减小得,直到k==n时,平方和为0,因为每个点都是它所在得簇中心本身
- 在这个平方变化过程中,会出现一个拐点也即“肘”点,下降率突然变缓时即认为是最佳的K值
3.3 轮廓系数法(Silhouette Coefficient)
-
sc范围 [-1,1]
-
越接近1越好
-
K = 2
-
K =4
-
轮廓宽度相差不大的,故选择K=4
3.4 Calinski-Harabasz Index(CH系数)
-
Calinski-Harabasz:类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好,这样的Calinski-Harabasz分数S会高,分数s高,则聚类效果越好。
-
SSB类别之间的距离,越大越好
-
SSW内内的距离,越小越好
-
CH越大越好
-
高内聚,低耦合
3.5 总结
3.5.1 肘部法
3.6 算法优点
3.7 算法缺点
四、聚类算法优化
4.1 Canopy算法配合初始聚类
-
Canopy属于一种‘粗’聚类算法,即使用一种简单、快捷的距离计算方法将数据集分为若干可重叠的子集canopy,这种算法不需要指定k值、但精度较低,可以结合K-means算法一起使用:先由Canopy算法进行粗聚类得到k个质心,再使用K-means算法进行聚类。
-
Canopy算法步骤如下:
(1)将原始样本集随机排列成样本列表L=[x1,x2,…,xm](排列好后不再更改),根据先验知识或交叉验证调参设定初始距离阈值T1、T2,且T1>T2 。
(2)从列表L中随机选取一个样本P作为第一个canopy的质心,并将P从列表中删除。
(3)从列表L中随机选取一个样本Q,计算Q到所有质心的距离,考察其中最小的距离D:
如果D≤T1,则给Q一个弱标记,表示Q属于该canopy,并将Q加入其中; 如果D≤T2,则给Q一个强标记,表示Q属于该canopy,且和质心非常接近,所以将该canopy的质心设为所有强标记样本的中心位置,并将Q从列表L中删除; 如果D>T1,则Q形成一个新的聚簇,并将Q从列表L中删除。
(4)重复第三步直到列表L中元素个数为零。
参考链接:https://blog.youkuaiyun.com/liuy9803/article/details/80779692
- 注意:
(1)‘粗’距离计算的选择对canopy的分布非常重要,如选择其中某个属性、其他外部属性、欧式距离等。
(2)当T2<D≤T1时,样本不会从列表中被删除,而是继续参与下一轮迭代,直到成为新的质心或者某个canopy的强标记成员。
(3)T1、T2的取值影响canopy的重叠率及粒度:当T1过大时,会使样本属于多个canopy,各个canopy间区别不明显;当T2过大时,会减少canopy个数,而当T2过小时,会增加canopy个数,同时增加计算时间。
(4)canopy之间可能存在重叠的情况,但是不会存在某个样本不属于任何canopy的情况。
(5)Canopy算法可以消除孤立点,即删除包含样本数目较少的canopy,往往这些canopy包含的是孤立点或噪音点。
4.2 K-means++
-
K-means++算法可以解决K-means对初始质心比较敏感的问题,算法的区别主要在于选择的初始k个质心的之间的相互距离要尽可能的远。
-
K-means++算法的流程是:
(1)从数据集中随机选择一个样本作为第一个质心;
(2)对数据集中的每个样本,计算它到所有已有质心的距离的总和D(x);
(3)采用线性概率选择出下一个聚类中心点,即D(x)较大的点成为新增质心的概率较大;
(4)重复步骤2直到找到k个聚类中心点
(5)使用得到的k个质心作为初始化质心运行K-means算法。
- K-means++算法的缺点:
(1)有可能选中离群点作为质心;
(2)计算距离质心最远的点的开销比较大;
(3)由于质心的选择过程中的内在有序性(第k个质心的选择依赖前k-1个质心的值),在扩展方面存在着性能问题。
4.3 二分K-means
-
每一步都最大限度减小了误差
-
为了克服K-means算法容易收敛于局部极小值的问题,可以使用bisecting K-means算法弱化随机初始质心的影响。该算法首先将所有的样本作为一个簇,然后根据某种规则将该簇一分为二;之后选择其中一个簇继续划分,直到达到停止条件(聚簇数量、迭代次数、最小SSE等)。
-
选择划分聚簇的规则一般有两种:
(1)选择样本量最大的簇进行划分;
(2)选择SSE值最大的簇进行划分。
伪代码如下:
将所有样本作为一个簇
当簇数目小于k时
对于每一个簇
计算总误差SSE
将给定的簇划分,对其进行k=2的K-means聚类
计算将该簇一分为二后的总误差
选择使总误差最小的那个簇进行划分操作
4.4 Kernel K-means
- 核函数K-means,数据集升维,使其线性平面可分
- 高斯核函数
4.5 K-medoids(k-中心聚类算法)
- 曼哈顿距离
- 步骤:
(1)选点:总体n个样本点中任意选取k个点作为medoids
(2)聚类:按与medoids最近的原则,将剩余n-k个点分配到当前最佳的medoids代表的类中
(3)遍历:对于第i个类中除对应medoids点外的所有其他点,按顺序计算当其为新的medoids时,代价函数的值,遍历所有的可能,选取代价函数最小时对应的点作为新的medoids
(4)迭代:重复2-3过程,直到所有的medoids点不再发生变化或已达到设定的最大迭代次数
(5)完成:产出最终确定的K个类
4.6 ISODATA
4.7 Mini Batch K-means(适合大数据的聚类算法)
4.8 总结
五、DBSCAN聚类算法
5.1 DBSCAN聚类方法简介
- 参数1 —— 半径
- 半径(EPS):表示以给定点P为中心的圆形领域的范围
- 参数2 —— 点的数量
- 以点P为中心的领域内最少点的数量(Minipts)
- 如果满足:以点P为中心,半径为EPS的领域内的点的个数不少于MiniPts,则称点P为核心点
- 抗噪性好
- 对于聚类形状捕捉敏锐
5.2 步骤
(1)将所有点标记为核心点,边界点或噪声点
(2)删除噪声点
(3)以距离在EPS之内的所有核心点之间赋予一条边
(4)每组连通的核心点形成一个簇
(5)将每个边界点都指派到一个与之关联的核心点的簇中
5.3 优缺点
5.3.1 优点
- 聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类
- 与K-means比较,不需要输入要划分的聚类个数
- 可以在需要时输入过滤噪声的参数,且聚类簇形状较稳定可靠
5.3.2 缺点
- 数据量增大时,需求较大的内存支持且I/O消耗也很大
- 当聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差,此时参数MiniPts和EPS选取困难
- 算法聚类效果依赖与距离公式选取,实际应用中常用欧式距离,对于高维数据,存在“维数灾难”
六、层次聚类
七、Mean shift聚类
八、 AP聚类
九、SOM聚类
十、谱聚类
十一、总结
本文参考:黑马程序员聚类算法视频