k-means
聚类算法是在不知道数据标签的情况下将相似的数据分为一类。K-means是一个经典的聚类算法,在实践中往往得到不错的效果。
K-means的算法流程:
- 选择K个中心点,计算样本中每个点与这K个点的距离。
- 比较样本点离那个中心点最近的,并将该样本点划分到离样本点最近的类别中。
- 根据第2步将每个样本分为K个簇,求每个簇的中心点,将其作为新的中心点。
- 重复的执行1到3步,直到簇的中心变化小于规定值,或者达到预定的迭代次数,或者MSE小于预定值。
算法的可视化如图:
算法的优点:
- 计算的时间复杂度接近线性( O ( n k t ) O(nkt) O(nkt),N 是数据对象的数目,K是聚类的簇数,t是迭代的次数)。
- 收敛速度快,原理相对通俗易懂,可解释性强
算法的缺点:
- 受初始值和离群值的影响较大,每次迭代的结果不稳定。
上图的数据的簇中心应该是左上,左下,右上,右下的。但因为初值的选取有问题,使得算法在聚类过程中出错。
受离群值的影响较大,数组1,2,3,4,100的均值是22。但数据100是离群点,导致了均值过大,使得聚类准确性降低。对此我们可以使用中位数代替均值。这就是k-Mediods聚类(K 中值聚类)。
- 结果通常是局部最优解,不是全局最优解。
可以采用分别取不同的初值的方式解决。
- 无法很好的解决数据簇分布相差较大的情况。
- K是超参数,一般需要按经验选择
K-means的调优:
1.数据归一化和离群点处理
因为K-means是基于距离的算法,不同的特征间的量纲需要统一,如果量纲不统一,数据就会偏向数值大的数。
同理离群点使得个别数据对簇的中心变化影响太大,所以需要剔除
2.合理的选择K值
不同的K值对于聚类的效果很大,特别在高维情况下,难以通过人为的观察给一个合适的K值,对此,我们可以通过“手轴法”确定K值。
通过计算不同K值的误差平方和,得到下图。
由上图可以看出,随着K值的增加,误差平方和减小,但在K=3以后,误差平方和几乎不变,所以选择K=3。
手肘法的缺点是不够自动化,需要人为的判断到哪一个误差的平方和几乎不变。
3.采用核函数
主要思想是通过一个非线性映射,将低维的空间中的点映射到高维,将高维中的点聚类。对于非凸数据集效果较好。
要思想是通过一个非线性映射,将低维的空间中的点映射到高维,将高维中的点聚类。对于非凸数据集效果较好。