K-Means聚类

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推广

  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)
原文地址:https://www.cnblogs.com/guesswhy/p/12882668.html