K-means算法
- 从样本数据中随机抉择$K$个样本作为初始聚类核心$C=\{c_1,\cdots,c_K\}$;
- 针对样本数据中的每一个样本$x_i$,计算它到每一个聚类核心的间隔$d(x_i,c_k)=||x_i-c_k||_2$,并将该样本分到间隔最小的聚类核心所对应的的类中;
- 针对每一个类别$Y_k$,从新计算它对应的聚类核心$c_k=\frac{1}{|D_k|}\sum_{x\in D_{k}}$,其中$D_k$示意属于第$k$个簇的所有样本;
- 反复步骤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
可能同时掂量
- 样本与其本身所在的簇中的其余样本的类似度a,应用样本与同一簇中所有其余点之间的均匀间隔来掂量;
- 样本与其余簇中的样本的类似度b,应用样本与下一个最近的簇中的所有点之间的均匀间隔来掂量。
依据“簇内差别小,簇间差别大”的需要,咱们心愿b尽可能大于a。样本的轮廓系数为$\frac{(b - a)}{max(a, b)}$。轮廓系数的取值为(-1,1),值越靠近1示意样本与其所在的簇中的样本类似,与其它簇的样本不类似,如果轮廓系数为负,则表明样本与簇外的样本更类似。
但其实这两种办法都不是相对的,很多时候往往要联合业务剖析。
情景一
情景二
情景三
K-means比拟适宜解决簇间没有重叠的聚类问题。
初始聚类核心的抉择
K-means中的一个重要环节是如何抉择初始聚类核心,初始聚类核心的抉择影响到算法是否收敛到最优值以及收敛的速度。K-means算法抉择初始聚类核心的形式是随机的,Arthur、David Sergei和Vassilvitskii提出了K-means++算法,K-means++对K-means做了改良,次要是对初始聚类核心的抉择形式做了改良,其基本思路是:不再应用随机初始化的形式抉择初始聚类核心,而是心愿初始聚类核心之间的互相间隔要尽可能的远。
具体的做法是,
- 从样本数据中随机选取一个样本作为初始聚类核心$c_1$;
- 首先,计算每一个样本与以后已有的聚类核心的最短距离(即该样本到离他最近的聚类核心的间隔),记做$D(x)$。接着计算每一个样本点被选为下一个初始聚类核心的概率$\frac{D(x)^2}{\sum_{x^{'}\in X}D(x^{'})^2}$。最初,依照轮盘法选出下一个初始聚类核心;
- 反复步骤2,直到抉择出$K$个初始聚类核心。之后依照K-means算法进行聚类。
scikit-learn中,sklearn.cluster.KMeans
的参数init
,用来抉择随机初始化(init='random')和应用Kmean++初始化(init='k-means++')。
参考
- 比elbow办法更好的聚类评估指标
- https://live.bilibili.com/125...