K均值分类——一分钟学会无监督学习算法

简单的K均值聚类k-means clustering algorithm

  • 基本思想
  • 算法及改进算法
    • 传统算法
    • K-means++(优化初始化)
    • elkan_K-means(减少迭代次数)
    • 大样本优化Mini Batch K-Means
  • 一个不得回避的问题
    • 拐点法
    • 轮廓系数(Silhouette Coefficient)
    • 间隔统计量(Gap Statistic)

基本思想

K-Means算法就是对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
用数学表达式就是:
假设簇划分为 ( C 1 , C 2 , . . . C k ) (C_1,C_2,...C_k) (C1,C2,...Ck)则我们的误差E就是: E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E = \sum\limits_{i=1}^k\sum\limits_{x \in C_i} ||x-\mu_i||_2^2 E=i=1kxCixμi22
其中 μ i μ_i μi是簇Ci的均值向量.

K均值分类——一分钟学会无监督学习算法_第1张图片

如图,我们任意选取两个初值点为中心,计算各点到中心的距离,将他们划分到距离最近的簇。第二次循环,用各族的平均向量做为中心,继续上面操作。直到质心几乎不变。
可以证明,当中心为族的样本均值,代价函数最小,这也说明算法的合理性。

算法及改进算法

传统算法

  • 选取K
  • 从数据集D中随机选择k个样本作为初始的k个质心向量: { μ 1 , μ 2 , . . . , μ k } \{\mu_1,\mu_2,...,\mu_k\} { μ1,μ2,...,μk}尽量距离不能太小。
  • repeat{
    1.将簇划分C初始化为 C t = ∅      t = 1 , 2... k C_t = \varnothing \;\; t =1,2...k Ct=t=1,2...k
    2.将各个数据点划分到距离最近的类
    3.对 C j Cj Cj中所有的样本点重新计算新的质心 μ j = 1 ∣ C j ∣ ∑ x ∈ C j x \mu_j = \frac{1}{|C_j|}\sum\limits_{x \in C_j}x μj=Cj1xCjx
    4质心几乎不改变,跳出循环
    }
  • 输出 C = { C 1 , C 2 , . . . C k } C=\{C_1,C_2,...C_k\} C={ C1,C2,...Ck}

K-means++(优化初始化)

这个实际上就是在选取K个初始中心时,找K个距离最大的点。

elkan_K-means(减少迭代次数)

大样本优化Mini Batch K-Means

Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。

在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本一般是通过无放回的随机采样得到的。

为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

一个不得回避的问题

如何确定最佳K值

拐点法

选取一系列K值,计算对应的代价。出现拐点的地方就是最优K值。

轮廓系数(Silhouette Coefficient)

对于数据点 x i x_i xi,我们定义这个系数为:
在这里插入图片描述
其中,a为 x i x_i xi到族内其他数据点的平均最距离,b为样本i与其他族样本点距离的平均值的最小值。

平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

间隔统计量(Gap Statistic)

这是一个适用与几乎所有的聚类算法。
我们定义, C k C_k Ck的族内距离为
D k = ∑ x i ∈ C k ∑ x j ∈ C k ∥ x i − x j ∥ 2 = 2 n k ∑ x i ∈ C k ∥ x i − μ k ∥ 2 D_k = \sum_{x_i \in C_k} \sum_{x_j \in C_k} \Vert x_i - x_j \Vert^2 = 2n_k \sum_{x_i \in C_k} \Vert x_i - \mu_k \Vert^2 Dk=xiCkxjCkxixj2=2nkxiCkxiμk2
n k n_k nk为族内样本数
证明K均值分类——一分钟学会无监督学习算法_第2张图片
则对于聚类个数为 K 时,我们可以定义一个测度量为
W K = ∑ k = 1 K 1 2 n k D k W_K = \sum_{k=1}^K \frac{1}{2n_k} D_k WK=k=1K2nk1Dk
即为 W K = ∑ k = 1 K 1 2 n k D k = ∑ k = 1 K ∑ x i ∈ C k ∥ x i − μ k ∥ 2 W_K = \sum_{k=1}^K \frac{1}{2n_k} D_k = \sum_{k=1}^K \sum_{x_i \in C_k} \Vert x_i - \mu_k \Vert^2 WK=k=1K2nk1Dk=k=1KxiCkxiμk2
事实上我们之前的误差函数,就是从这里推出来的。 W k W_k Wk实际上也是, D k D_k Dk的标准化。
间隔统计量为:
Gap(K) ≥ Gap(K+1) − s K + 1 \text{Gap(K)} \ge \text{Gap(K+1)} - s_{K+1} Gap(K)Gap(K+1)sK+1
参考如何找K值

你可能感兴趣的:(数据分析和机器学习,机器学习)