资料整理
跳过算法原理
Kmeans算法是基于划分的聚类算法,其优化目标是同类的点尽量近,类间的点尽量远。
需要做的是(1)给定聚类个数K(2)选择K个初始点,可以是随机值,也可以是随机的样本点(3)迭代至终止条件
经典K-means算法具体流程,基于贪心策略
(1)随机地选择k个初始点,每个点代表了一个簇的中心;
(2)对每个样本,将它分配给最近的簇;
(3)重新计算每个簇的平均值,更新为新的簇中心;
(4)不断重复2、3,直到达到某个终止条件。
这个终止条件可以是:没有(或最小数目)对象被重新分配给不同的聚类
优点:对于大型数据集也是简单高效、时间复杂度、空间复杂度低。
缺点:数据集大时结果容易局部最优;需要预先设定K值,对最先的K个中心点选取很敏感;对噪声和离群值非常敏感;只用于数值型数据;不能解决非凸(non-convex)数据。
python的sklearn.cluster库提供了Kmeans算法
如果没有指定聚类个数,那么最优K值的选择有一定的方法和指标
定义聚类的误差平方和
随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小,当k小于最优聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达最优聚类数后,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的最优聚类数。
K=4时,斜率开始趋于平缓,那么k值可以选择4
轮廓系数的计算方法如下:
计算 a(i) = average(i向量到所有它属于的簇中其它点的距离),称为簇内不相似度
计算 b(i) = min (i向量到与它相邻最近的一簇内的所有点的平均距离),称为簇间不相似度
那么i向量轮廓系数就为:所有点的轮廓系数的平均值,即聚类结果的总的轮廓系数。
轮廓系数的取值在[-1,1]之间,越趋近于1代表内聚度和分离度都相对较优,即聚类效果越好。(当簇内只有一点时,我们定义轮廓系数s(i)为0)
K=4取到最大值,那么可以选择4为聚类个数
CH指标是数据集的分离度与紧密度的比值,以各类中心点与数据集的中心点的距离平方和来度量数据集的分离度,以类内各点与其类中心的距离平方和来度量数据的紧密度。聚类效果越好,类间差距应该越大,类内差距越小,即类自身越紧密,类间越分散,CH指标值越大聚类效果越好。
以下是3个指标的使用方法
#SSE from sklearn.cluster import Kmeans km=KMeans(n_clusters=i) km.fit(x) y1=km.predict(x) SSE=km.inertia_ from sklearn import metrics km=KMeans(n_clusters=i) km.fit(x) y1=km.predict(x) #SC sc=metrics.silhouette_score(x,y1) #CH ch=metrics.calinski_harabaz_score(x,y1)
以上方法任选其一即可
具体查看参考文章
轮廓系数和CH指标也可作为不同模型对同一聚类问题的性能对比,除此以外还有戴维森堡丁指数
sklearn提供了davies_bouldin_score(X, labels)方法
参考文章
1.零基础学习Kmeans聚类算法的原理与实现过程
2.聚类算法性能指标
3.基于sklearn的聚类算法的聚类效果指标