KMeans算法本身思想比较简单,但是合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响。
缺点:
来源: https://zhuanlan.zhihu.com/p/149441104
基于欧几里得距离,K-Means算法需要优化的问题就是,使得簇内误差平方和(within-cluster sum of squared errors,SSE)最小,也叫簇惯性(cluster intertia)。
K-Means算法需要随机选择初始化的中心点,如果中心点选择不合适,可能会导致簇的效果不好或产生收敛速度慢等问题。解决这个问题一个比较合适的方法就是,在数据集上多次运行K-Means算法,根据簇内误差平方和(SSE)来选择性能最好的模型。
除此之外,还可以通过**K-Means++**算法,让初始的中心点彼此的距离尽可能的远,相比K-Means算法,它能够产生更好的模型。
参考: https://www.cnblogs.com/yunshangkanjing/p/12907374.html
1. 随机选择k个点作为初始的类簇中心点,但是该方法在有些情况下的效果较差.
2. 选择彼此距离尽可能远的K个点
首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。这种方法效果还不错.
step1:计算所有样本点之间的距离,选择距离最大的一个点对(两个样本C1, C2)作为2个初始中心点,从样本点集中去掉这两个点。
step2:如果初始中心点个数达到k个,则终止。如果没有,在剩余的样本点中,选一个点C3,这个点优化的目标是:
来源: https://blog.csdn.net/ten_sory/article/details/81016748
4. 先对数据用层次聚类算法或者Canopy算法进行聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。
Canopy算法:
首先定义两个距离T1和T2,T1>T2.从初始的点的集合S中随机移除一个点P,然后对于还在S中的每个点I,计算该点I与点P的距离,如果距离小于T1,则将点I加入到点P所代表的Canopy中,如果距离小于T2,则将点I从集合S中移除,并将点I加入到点P所代表的Canopy中。迭代完一次之后,重新从集合S中随机选择一个点作为新的点P,然后重复执行以上步骤。
Canopy算法执行完毕后会得到很多Canopy,可以认为每个Canopy都是一个Cluster,与KMeans等硬划分算法不同,Canopy的聚类结果中每个点有可能属于多个Canopy。我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。
详细信息请参考: https://blog.csdn.net/qq_15738501/article/details/79036255
1. 手肘法
可以作出这个范围内的SSE-k的曲线,再选择一个拐点,作为合适的k值
当K值小于真实聚类数时,K的增加会对聚类效果产生很大影响,故SSE下降幅度很大;
当K值大于真实聚类数时,K的增加不会对聚类效果产生很大影响,故SSE下降幅度将会趋于平缓;
整个SSE-K图为一个手肘型, 而这个肘部对应的k值就是数据的真实聚类数
误差平法和 (SSE),用于评价聚类的结果的好坏. 一般情况下,k越大,SSE越小.
( 来源: https://blog.csdn.net/ten_sory/article/details/81016748)
其中, Cj 是第 j 个簇,o 是 Cj 中的样本点
mj 是 Cj 的 质心 / 中心点(Cj中所有样本的均值)
2. 轮廓系数
参考:
https://zhuanlan.zhihu.com/p/149441104
https://blog.csdn.net/qq_15738501/article/details/79036255
推荐选择SSE
K-Means++有下面几个步骤组成:
终止条件:直到选出了这k个中心。
总而言之, 只需要随机取第一个聚类中心即可, 然后按照最远优先原则来选新的聚类中心
(参考: https://zhuanlan.zhihu.com/p/149441104 )
1、从输入的数据点集合中随机选择一个点作为第一个聚类中心
2、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
4、重复2和3直到k个聚类中心被选出来
5、利用这k个初始的聚类中心来运行标准的k-means算法
从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:
1、先从我们的数据库随机挑个随机点当“种子点”
2、对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
3、然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
4、重复2和3直到k个聚类中心被选出来
参考来源:
https://www.cnblogs.com/dudumiaomiao/p/5839905.html
https://blog.csdn.net/github_39261590/article/details/76910689
(后续补充)
主成分分析(PCA)- 数据降维, 作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。
原理:
★★ Sklearn 与 TensorFlow 机器学习实用指南
★ 主成分分析(PCA)原理总结
PCA(主成分分析) 降维算法详解 和代码
★ 数据降维并使用K-Means法聚类
代码:
★ 用scikit-learn学习主成分分析(PCA)
http://itpcb.com/a/66864