K-Means聚类

K-Means聚类

K-Means算法思想

给定样本集,按照样本之间的距离大小,将样本集分为K个簇,让簇内尽量紧密,让簇间尽量大。

假设簇划分为\(C_1,C_2,...,C_k\),则我们的目标是最小化平方误差E

\[E=\sum_{i=1}^k\sum_{x\in C_i}\lVert x-\mu_i\rVert_2^2 \]

其中,\(\mu_i\)是簇\(C_i\)的均值向量,也称为质心,表达式为

\[\mu_i=\frac{1}{|C_i|}\sum_{x\in C_i}x \]

直接求E的最小值是一个NP难问题,我们随机取K个质心点,分别求所有样本到质心的距离,并标记好每个样本的类别,再重新计算质心。经过迭代后,找到最优的簇。

K-Means推广

  1. K-Means++初始优化
  2. elkan K-Means距离优化
  3. Mini Batch K-Means大样本优化

K-Means与KNN

K-Means是无监督学习聚类,没有样本输出,需要训练;

KNN的监督学习分类算法,有类别输出,不需要训练。

K-Means总结

K-Means优点:

  1. 原理简单,实现容易,收敛快
  2. 聚类效果好
  3. 算法可解释性强
  4. 参数少

K-Means缺点:

  1. K值选择不好把握
  2. 对于不是凸的数据集比较难收敛
  3. 如果隐含类别的数据不平衡,如隐含类别数据严重失衡,或者隐含类别的方差不同,聚类效果不佳
  4. 采用迭代方法,得到的结果是局部最优
  5. 对噪音和异常点比较敏感。

sklearn K-Means使用

类库

from sklearn.cluster import KMeans

参数

  1. n_clusters:即K值
  2. max_iter:最大迭代次数
  3. n_init:不同的初始化质心运行算法的次数
  4. init:初值的初始化方式
  5. 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)
posted @ 2020-05-13 15:35  hi_heisen  阅读(208)  评论(0)    收藏  举报