K-means是一种经典unsupervised的聚类算法。其算法描述如下:
输入:聚类个数-k,N个数据对象
输出:每个数据对象所属的聚类label(满足方差最小)
- 从N个数据对象中挑选出k个质心。
- 计算N个数据对象距离不同质心的距离,并将N个数据对象划分到与之距离最小的质心,形成新的k个聚类。
- 重新计算步骤2中获取新的k个聚类的质心,计算方法为求取聚类中所有数据对象的均值。
- 重复2-3步骤,直到每个聚类的数据成员不再发生变化。
K-means主要的缺点如下:
- 运行速度。虽然通常情况下,k-means执行的循环次数要少于数据对象的个数。但是对于worst cases,其执行的时间复杂度将是super-polynomial的。
- K值的选取。在执行程序前,需要给定K值的大小。然而对于不同的K值,划分的结果当然不同,因此确定最合适的K值非常关键。
- 初始化K个centroid。centroid的初始选取对于划分结果亦非常关键。
- K-means对于数据不同的维度“一视同仁”,缺乏轻重之分。