K-Means聚类
K-Means算法思想
给定样本集,按照样本之间的距离大小,将样本集分为K个簇,让簇内尽量紧密,让簇间尽量大。
假设簇划分为(C_1,C_2,...,C_k),则我们的目标是最小化平方误差E
[E=sum_{i=1}^ksum_{xin C_i}lVert x-mu_i
Vert_2^2
]
其中,(mu_i)是簇(C_i)的均值向量,也称为质心,表达式为
[mu_i=frac{1}{|C_i|}sum_{xin C_i}x
]
直接求E的最小值是一个NP难问题,我们随机取K个质心点,分别求所有样本到质心的距离,并标记好每个样本的类别,再重新计算质心。经过迭代后,找到最优的簇。
K-Means推广
- K-Means++初始优化
- elkan K-Means距离优化
- Mini Batch K-Means大样本优化
K-Means与KNN
K-Means是无监督学习聚类,没有样本输出,需要训练;
KNN的监督学习分类算法,有类别输出,不需要训练。
K-Means总结
K-Means优点:
- 原理简单,实现容易,收敛快
- 聚类效果好
- 算法可解释性强
- 参数少
K-Means缺点:
- K值选择不好把握
- 对于不是凸的数据集比较难收敛
- 如果隐含类别的数据不平衡,如隐含类别数据严重失衡,或者隐含类别的方差不同,聚类效果不佳
- 采用迭代方法,得到的结果是局部最优
- 对噪音和异常点比较敏感。
sklearn K-Means使用
类库
from sklearn.cluster import KMeans
参数
- n_clusters:即K值
- max_iter:最大迭代次数
- n_init:不同的初始化质心运行算法的次数
- init:初值的初始化方式
- algorithm:算法优化
K值评价
不像监督学习和回归问题,无监督聚类问题没有样本输出,没有比较好的评估方法。有的从簇内稠密程度和簇间离散程序评价效果,如Calinski-Harabasz的评价如下:
[s(k)=frac{tr(B_k)m-k}{tr(W_k)k-1}
]
其中,m为训练样本数,k为类别数,(B_k)为类别之间协方差矩阵,(W_k)为类别内部数据的协方差矩阵,tr为矩阵的迹。类内部数据协方差越小越好,类别之间协方差越大越好。
实例
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
y_pred = KMeans(n_clusters=2, random_state=9).fit(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()
metrics.calinski_harabaz_score(x, y_pred)