总结
算法流程:
选取K个点作为初始类中心
将每个点指派到最近的类中心,形成k个簇
重新计算每个簇的类中心
直到簇不发生变化或达到最大迭代次数
时间复杂度:O(tkmn) — t为迭代次数,k为簇的数目,m为样本数,n为维数
问题
K如何确定:
1、与层次聚类的结合
首先采用层次聚类算法决定结果中簇大概的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类
2、结果稳定性
对数据集进行2次重采样产生2个数据子集,再用相同的聚类算法对2个子集进行聚类,产生2个具有k个聚类的聚类结果,计算2个聚类结果的相似度分布情况(如何计算聚类结果相似度),2个聚类结果具有高的相似度说明k个聚类反应了稳定的聚类结构,其相似度可以用来估计聚类个数。
可以采用次方法试探多个k,找到合适的k值
3、使用canopy算法进行初始划分
两个阶段
stage1:
聚类最好时的地方在于计算相似性的时候canopy在第一阶段选择简单、计算代价较低的方法计算相似性(什么方法)
将相似的对象放在一个子集,一个子集就叫做一个canopy,就像用盖子把一些相似的样本点盖住
初始,我们有一组点集S,预设两个距离阈值,T1>T2
选择一个点,计算它与S中其他点的距离(这里采用成本低的计算方法)
将距离为T1以内的点放入一个Canopy中,同时删除S中与此点距离在T2内的点
这里是为了保证和中心距离在 T2 以内的点不能再作为其他 Canopy 的中心
canopy之间可以重叠,但不会存在对象不属于任何一个canopy的情况
stage2:
在各个canopy内使用传统的聚类算法(可以是KMeans),不属于同一个canopy的对象之间不尽兴相似性计算
注意:
canopy不要太大且canopy之间重复的不要太多
这样会大大减少后续需要计算相似性的对象的个数
通过第一阶段可以大致得到canopy的个数,通过这个个数去确定KMeans的值将一定程度上减少盲目性