k-means算法

k-means聚类算法步骤如下:

1.随即选择k个样本作为初始的簇类均值向量;
2.把每个样本划分到距离最近的簇类;
3.计算每个簇类中所有样本的向量的均值,更新簇类均值向量;
4.重复步骤2和3,知道达到设定的迭代次数或者均值向量不再改变为止。
5.最终把所有样本的归作k个簇类中。

缺点:
1.如果初始化的簇类均值向量离得很近,收敛会很慢,而且可能收敛到局部最小点。
2.因为每次初始化是随即的,所有每次的分类结果都可能不一样,要多次运行才知道最优结果。

于是有了k-means++

步骤如下:
1.随即选择一个样本作为第一个簇类中心;

2.计算每一个样本到各个簇类中心的最小距离,选择距离簇类中心最大的样本作为下一个簇类中心;
距离公式
3.重复k次步骤2,总共得到k个簇类中心;
4.利用这k个簇类中心作为初始化的簇类中心运行k-means算法;

MiniBatchKMeans

随着样本的增多,k-means的收敛速度会变慢。数据量庞大的时候可以用MiniBatchKmeans,它对数据集进行无放回随机抽样得到合适的小批量样本数据集来更新聚类中心。最终的效果跟k-means基本一样,但速度大大提升。

k-means不适用的几个情况

(1)若样本数据是各向异性的,那么k-means算法的效果较差。通俗讲就是样本数据落在各个方向的概率是相等的才适用,不相等的话不适用。如图
各向异性数据分布

聚成3类会出现
image.png
很明显效果不好。

(2)若样本数据是非凸数据集的时候,k-means算法的效果较差。非凸数据可以理解为簇类中心是一条线。


非凸数据分布

k-means聚类:


image.png

(3)若各簇类的样本数相差比较大,聚类性能较差。
样本数差异大
image.png

注意:

(1)样本维度很多时,可先考虑PCA降维,再聚类,聚类效果相当,如不然耗时较大。
(2)区分k-means和knn。1)knn是监督学习方法,k-means是非监督学习方法,因此knn需要样本的标记类,k-means不需要;2)knn不需要训练,只要找到距离测试样本最近的k个样本,根据k个样本的类别给出分类结果;k-means需要训练,训练的目的是得到每个簇类的均值向量(质心),根据质心给出测试数据的分类结果;

你可能感兴趣的:(k-means算法)