K-Means算法详解

Prototype-based Clustering

首先,我们来看原型聚类的算法。之所以叫原型聚类,看完书以后,我认为原因是这类聚类算法都是通过确定一组“原型向量”,其实也就是类似于中心向量,然后根据每个样本与原型向量组中每一个原型向量之间的距离来确定该样本所属的类。原型聚类最典型的就是K-Means,所以我们重点来介绍K-Means。

K-Means的思想很简单,就是对于数据集 D = { x 1 , x 2 , … , x m } D=\{x_1,x_2,\dots,x_m\} D={x1,x2,,xm},K-Means得到划分 C = { C 1 , C 2 , … , C k } C=\{C_1,C_2,\dots,C_k\} C={C1,C2,,Ck},然后我们希望最小化下面这个式子:
∑ i = 1 k ∑ x ∈ C i ∣ x − μ i ∣ 2 2 \sum_{i=1}^{k}\sum_{x\in{C_i}}|x-\mu_{i}|^2_{2} i=1kxCixμi22
其中 μ i = 1 ∣ C ∣ ∑ x ∈ C x \mu_i=\frac{1}{|C|}\sum_{x\in C}x μi=C1xCx,是簇 C C C的均值向量。也就是我们希望所有样本到它所属的簇中心的距离之和最小。但是想直接最小化这个式子很难,需要遍历所有可能的簇,是一个NP Hard问题。所以在实际的K-Means算法中,采用了贪心的策略,即每个样本会被划分到与他距离最近的簇。每个样本都完成划分以后,我们更新一遍均值向量,如果新的均值向量相较于之前没有发生变化,那么我们就停止迭代,并以此时的簇划分作为最后的结果。算法流程如下:

K-Means算法详解_第1张图片

原始KMeans算法初始的 k k k个原型向量是随机选取的,KMeans++算法就是在这一步上做了一点改进。在Overview的内容中,我们谈到了度量聚类模型性能的内部指标,其中DBI系数涉及到了两个簇中心之间的距离我们希望越大越好。因此,KMeans++算法在选取原型向量时,会考虑哪一个样本作为中心的概率最大,具体来说,设 D ( x ) D(x) D(x)为样本 x x x最近的已有簇中心的距离,那么用下式
D 2 ( x ) ∑ x ^ ∈ D D 2 ( x ) \frac{D^2(x)}{\sum_{\hat{x}\in D}D^2(x)} x^DD2(x)D2(x)
作为每个样本能够成为下一个簇中心的概率,选择概率最大的样本作为下一个簇中心,知道选出 k k k个簇中心为止。

KMeans++算法其实只是在最开始选取原型向量的时候做了改进,剩下的步骤与KMeans一致。
改进,剩下的步骤与KMeans一致。

你可能感兴趣的:(Machine,Learning,算法,kmeans,机器学习)