K均值聚类,K Means Clustering

Posted by Wenjing Liu on 2019-08-12

概念

K均值聚类是一种无监督学习算法,尝试在数据中将类似的群集组合在一起。

  • 典型的聚类问题是什么样的呢?

    • 集群类似文档
    • 基于特征的客户群
    • 市场细分
    • 识别类似的物理组
  • 算法过程

    1. 选择集群的个数 ‘K’
    2. 随机将每个点分配给一个集群
    3. 直到集群停止改变,重复以下:
    • 对于每个群集,通过获取群集中点的平均向量来计算群集质心
    • 将每个数据点分配最接近的群集质心
  • K的选择

    • 没有简单的方法选择K
    • 一种方式用elbow方
      • 首先,计算某些k值(例如2,4,6,8等)的平方误差之和(SSE)
      • SSE定义为群集中每个成员与其质心之间的平方距离的总和
      • 如果您对SSE绘制k,您将看到随着k变大,误差减小; 这是因为当簇的数量增加时,它们应该更小,因此失真也更小。
      • elbow 方法的idea是选取SSE突然减小的K

数学理论

评估指标

ScikitLearn 中的线性回归用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set_style('whitegrid')
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
data = make_blobs(n_samples=200, n_features=2, centers=4, cluster_std=1.8, random_state=101)

plt.scatter(data[0][:,0], data[0][:, 1], c=data[1], cmap='rainbow')

kmeans = KMeans(n_clusters=4)
kmeans.fit(data[0])
kmeans.cluster_centers_
kmeans.labels_

fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(10, 6))

ax1.set_title('K Means')
ax1.scatter(data[0][:,0], data[0][:, 1], c=kmeans.labels_, cmap='rainbow')

ax2.set_title('Original')
ax2.scatter(data[0][:,0], data[0][:, 1], c=data[1], cmap='rainbow')

数学知识补充