K-Means是非常常见的聚类算法,思想简单,易于实现,现在已经被广泛应用到各种聚类任务当中。K-Means的基本思想是先初始化聚类中心,然后计算所有点到不同聚类中心的距离,重新计算聚类中心,反复迭代,直到聚类中心没有变化或者到达最大的迭代次数停止。
因为思想简单,所以易于使用,但是这个方法存在着很多问题。1. 计算量非常大;2. 聚类中心的数量K需要提前设定,并且聚类中心的数量也会影响到聚类结果;3. 聚类中心的初始化也要人为初始化,初始化的不同会影响到聚类结果;4. 异常点的存在会影响聚类结果;5. 容易收敛到局部最优。
每一个问题都有了相应的解决方案:
1. 计算量非常大: 可以应用KD树加速K-means
2. 聚类数量提前设定:运用多种方法估计k值
a. 可以根据数据的先验知识来估计需要分多少类
b. 基于变化的算法:定义一个函数,随着k的改变,认为在正确的k值时会产生极值
c. 基于结构的算法:最常用的方法,比较类内距离和类间距离来确定k。如平均轮廓系数,越趋近于1聚类效果越好;或计算类内距离/类间距离,值越小越好。
其中a(i)表示样本i的簇内不相似度,b(i)表示簇间不相似度,s(i)为样本i的轮廓系数,它越接近1,说明样本i聚类合理,接近-1,说明i应该分类到另外的簇,若近似为0,说明样本i在两个簇的边界上。所有样本的s(i)的均值称为聚类结果的轮廓系数,是该聚类是否合理,有效的度量。
d. 基于一致性矩阵的算法:认为在正确的k时,不同次聚类的结果会更加相似
e. 基于层次聚类: