K-Means

K-means算法

  1. 从样本数据中随机选择$K$个样本作为初始聚类中心$C=\{c_1,\cdots,c_K\}$;
  2. 针对样本数据中的每一个样本$x_i$,计算它到每一个聚类中心的距离$d(x_i,c_k)=||x_i-c_k||_2$,并将该样本分到距离最小的聚类中心所对应的的类中;
  3. 针对每一个类别$Y_k$,重新计算它对应的聚类中心$c_k=\frac{1}{|D_k|}\sum_{x\in D_{k}}$,其中$D_k$表示属于第$k$个簇的所有样本;
  4. 重复步骤2和步骤3,直到聚类中心的位置不再发生变化。

因此,对于K-means而言,最终希望每一个簇的簇内平方和(cluster sum of square,又称为inertia)最小$\sum_{x\in D_k}||x-c_k||_2$,对所有簇的簇内平方和相加得到整体平方和(total cluster sum of square,又称为total inertia)$\sum_{k=1}^K\sum_{x\in D_k}||x-c_k||_2$。即希望簇内差异小,簇间差异大

聚类中心的个数

K-means算法聚类中心的个数是需要人为设定的,可采用的做法是分别选定不同数目的聚类中心个数,运行K-means算法,比较得分。

elbow method

elbow方法得到的图像,横坐标为聚类中心的个数,纵坐标为衡量K-means算法的评价指标,一般为total interia。得到的图像类似于肘关节,因此得名。选择“拐点”对应的聚类中心数,作为最优的聚类中心数。

轮廓系数

轮廓系数Silhouette coefficient能够同时衡量

  1. 样本与其自身所在的簇中的其他样本的相似度a,使用样本与同一簇中所有其他点之间的平均距离来衡量;
  2. 样本与其他簇中的样本的相似度b,使用样本与下一个最近的簇中的所有点之间的平均距离来衡量。

根据“簇内差异小,簇间差异大”的需求,我们希望b尽可能大于a。样本的轮廓系数为$\frac{(b - a)}{max(a, b)}$。轮廓系数的取值为(-1,1),值越接近1表示样本与其所在的簇中的样本相似,与其它簇的样本不相似,如果轮廓系数为负,则表明样本与簇外的样本更相似。

但其实这两种方法都不是绝对的,很多时候往往要结合业务分析。

情形一

K-Means_第1张图片

情形二

K-Means_第2张图片

情形三

K-Means_第3张图片
K-means比较适合解决簇间没有重叠的聚类问题。

初始聚类中心的选择

K-means中的一个重要环节是如何选择初始聚类中心,初始聚类中心的选择影响到算法能否收敛到最优值以及收敛的速度。K-means算法选择初始聚类中心的方式是随机的,Arthur、David Sergei和Vassilvitskii提出了K-means++算法,K-means++对K-means做了改进,主要是对初始聚类中心的选择方式做了改进,其基本思路是:不再使用随机初始化的方式选择初始聚类中心,而是希望初始聚类中心之间的相互距离要尽可能的远。
具体的做法是,

  1. 从样本数据中随机选取一个样本作为初始聚类中心$c_1$;
  2. 首先,计算每一个样本与当前已有的聚类中心的最短距离(即该样本到离他最近的聚类中心的距离),记做$D(x)$。接着计算每一个样本点被选为下一个初始聚类中心的概率$\frac{D(x)^2}{\sum_{x^{'}\in X}D(x^{'})^2}$。最后,按照轮盘法选出下一个初始聚类中心;
  3. 重复步骤2,直到选择出$K$个初始聚类中心。之后按照K-means算法进行聚类。

scikit-learn中,sklearn.cluster.KMeans的参数init,用来选择随机初始化(init='random')和使用Kmean++初始化(init='k-means++')。

参考

  1. 比elbow方法更好的聚类评估指标
  2. https://live.bilibili.com/125...

你可能感兴趣的:(机器学习,聚类分析)