序
- word2vec源码中最后一小部分,作者用c写了个k-means的算法,很久以前还啥都不懂的时候学过这个算法,现在回头做个简单的笔记。
伪代码
- input: K值(聚类个数) T值 (循环的最大次数)
- 对齐表示属于同一循环(同python)
1. 初始化 K个中心点的位置
while( i < T): (循环到最大循环次数时,跳出循环)
for(遍历X中所有的点x):
2. 计算x到K个中心点的距离(常用欧式距离计算公式)。
3. 比较算出的距离,以最近邻为原则,找出该点归属于哪一类。
4. 更新K个中心点的坐标(更新原则:某类内所有属于该类的x的均值替代现在的坐标)
5. 求和(为6服务):求出每个点到其对应类中心的距离,整体求和。
6. 退出条件:如果(5求出的值 - 上一次迭代的时的值) < 阈值 ,则:break(跳出循环)
优缺点讨论
优点
- 简单,收敛快。
- 聚类效果较优。
- 算法可解释性强。
- 超参数少,仅K一个。
缺点
- K的个数往往需要对数据有一定的探究(先验知识)。
- 算法复杂度不易控制 O(NKm), 迭代次数可能较多 (m可能会比较大)。
- 初值敏感:对于不同的初始值,可能会得到不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)
- 对躁声和孤立点数据敏感。(PS:这是均值的锅,因为算法用了均值的原因,而均值本身对噪声和孤立点敏感)
- K-means算法并不是可以对任何数据都有很好的聚类效果,其更偏向于成圆(球)状的聚类效果。解释:欧式距离的锅。因此:需要对数据有一个整体把控,不同的效果需要不同的聚类算法,不能以一待之。
- 容易陷入局部最优;(这个和初值的选取是对应的)
- 无法增量计算。(新增样本后,无法利用现有结果,需要重新开始)
改进
- 整个机器学习常见这个套路,一个算法的诞生是为了改进另一个算法的缺陷,K-means有这么多缺点,所以对应也产生了改进算法,本人不进行探究,感兴趣者可以参考:
- https://blog.csdn.net/u014465639/article/details/71342072