kmeans是最著名的聚类算法,聚类算法就是计算种群中的距离,根据距离的远近将数据划分为多个族群。
kmeans算法首先需要确定k的数量,即全部样本所包含类别的数量。然后选择k个初始中心点,之后我们计算所有样本点与k个中心点之间的距离,对于任意一个样本点,它与哪个中心点距离最小我们就将其分配到该中心点所在类。完成所有样本点的分配后将重新计算中心点。重复上述过程,比较样本点与中心点的距离并将样本点重新分配,直到中心点改动小于给定阈值或者达到规定迭代次数。
1.k值得确定
1)根据问题内容确定
2)肘部法则
把不同k值得成本函数画出来,k值增大过程中,畸变程度的改善效果下降幅度最大的位置对应的k值就是肘部。
3)与层次聚类结合
先用层次聚类找到簇的数量和一个初始聚类。
4)稳定性方法
稳定性方法对一个数据集进行2次重采样产生2个数据子集,再用相同的聚类算法对2个数据子集进行聚类,产生2个具有k个聚类的聚类结果,计算2个聚类结果的相似度的分布情况。2个聚类结果具有高的相似度说明k个聚类反映了稳定的聚类结构,其相似度可以用来估计聚类个数。采用此方法试探多个k,找到合适的k值。
5)系统演化方法
系统演化方法将一个数据集视为伪热力学系统,当数据集被划分为k个聚类时称系统处于状态k。系统由初始状态k=1出发,经过分裂过程和合并过程,系统将演化到它的稳定平衡状态 ,其所对应的聚类结构决定了最优类数
。
6)使用canopy算法进行初始划分
分成两个阶段:
在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理;
第二阶段,在各个Canopy内使用传统的聚类方法(如Kmeans),不属于同一Canopy的对象之间不进行相似性计算。
2.初始质心的选择
1)多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。
2)取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取kk个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2) kk相对于样本大小较小。
3)随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法用于点样本。
4)canopy算法
3.聚类算法效果评估方法--轮廓系数
轮廓系数是类的密集与分散程度的评价指标。它会随着类的规模增大而增大。彼此相距很远,本身很密集的类,其轮廓系数较大,彼此集中,本身很大的类,其轮廓系数较小。
a是每一个类中样本彼此距离的均值,b是一个类中样本与其最近的那个类的所有样本的距离的均值。
4. Kmeans算法流程
输入:聚类个数k,数据集XmxnXmxn。
输出:满足方差最小标准的k个聚类。
(1) 选择k个初始中心点,例如c[0]=X[0] , … , c[k-1]=X[k-1];
(2) 对于X[0]….X[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;
(3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的样本的每个特征的均值};
(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值或者达到最大迭代次数。
Kmeans的时间复杂度:O(tkmn),空间复杂度:O((m+k)n)。其中,t为迭代次数,k为簇的数目,m为样本数,n为特征数。
5.优点
1)容易理解,聚类效果不错
2)处理大数据集时,有较好的伸缩性和高效率
3)当簇近似高斯分布的时候,效果相当不错
6.缺点
1)k值需要用户给定,对于不同的k值,聚类效果不一样
2)对初始簇中心点是敏感的
3)不适合发现非凸形状的簇或者大小差别很大的簇
4)离群值影响很大