k-means是机器学习中最基本的聚类算法,但同样也有很多缺点:
一是k选择是随机的,可能会得到局部最优解
二是k的个数的选择是预估计的,很多时候并不知道样本被聚为几类最合适
同样,k-measns仅能实现对连续型数值的样本操作,当数据量过于庞大时,时间复杂度较高(每次计算簇的中心来选取新的中心点)
k-means++
为了解决k的随机性,k-means++算法与k-means算法原理基本类似,他的做法是,如果将样本聚为k类,则在数据集中随机选取一个中心点(随机种子),循环遍历所有的点与中心点的距离存放在D(m)中,其中D(m)=[d1,d2,d3,...,dm]。在D(m)中选择再选取最大的di作为第二个中心点,如此反复,直至选取好了所有的k点,再进行k-means的过程。
k-means++的基本思想就是,在初始选取中心点时,中心点k之间的距离尽可能的大
k-modes
如果说所要聚类的样本数据集都是离散型的数值,比如我要在电脑购买记录中去聚类相似特征的人群,其中只有性别、学历、薪资等级等特征,此时无法用k-means的欧式距离去衡量各样本的距离。k-modes衡量距离的做法是汉明距离,
比如样本 1,0,1,1,1,0,1与样本1,0,0,1,0,0,1之间的汉明距离为2(异或操作),且k-modes在更新中心点的时候采用的是各个簇的众数而非均值。
k-prototype
如果说聚类样本之间既有离散型变量又有连续型变量,即度量样本间混合属性的距离,那么k-prototype算法能解决这一问题。
k-prototype原理就是用k-means取得连续型变量之间的欧式距离P1,k-modes度量连续型变量之间的汉明距离P2,那么度量此类样本之间的距离D = P1+a*P2,a可随机赋予,如果离散型变量的属性比较重要则增大a,否则减小a,a=0时,只有连续型变量的属性。