请和我一起学习机器学习算法之k-means
k-means 概念简述
k-means 是一种聚类算法,具有随机,无监督的特点。也叫k中心值聚类。其中的k,表示的是要分成类别的数量,也就是说你最终要分成几堆。
k-means 算法流程
k-means 是一通过距离情况优化中心的策略来实现聚类。具有一定的随机性。
算法步骤如下:
算法输入:训练数据 X = { x 1 , x 2 , . . . , x m } X=\{x_1,x_2,...,x_m\} X={x1,x2,...,xm},K(想聚类的数目)
- 随机在训练数据中选取K个值 K 0 = { x k 0 1 , x k 0 2 , . . , x k 0 k } K_0=\{x_{k_0}^{1},x_{k_0}^{2},..,x_{k_0}^k\} K0={xk01,xk02,..,xk0k},作为中心。
- 分别计算样本数据X中所有的样本到这K个中心的距离,并将计算样本标记为距离k个中心最小的中心类别。所有样本标记为1~k中的某一类。
- 根据#2中的标记,对标记为中心进行更新(
K
0
到
K
1
K_0 到 K_1
K0到K1)。更新方式为:
距离 x k 0 1 x_{k_0}^1 xk01最近的所有样本, 也就是标记为1的所有样本,取均值更新 x k 0 1 x_{k_0}^1 xk01为 x k 1 1 x_{k_1}^1 xk11
距离 x k 0 2 x_{k_0}^2 xk02最近的所有样本, 也就是标记为2的所有样本,取均值更新 x k 0 2 x_{k_0}^2 xk02为 x k 1 2 x_{k_1}^2 xk12
… …
距离 x k 0 k x_{k_0}^k xk0k最近的所有样本, 也就是标记为k的所有样本,取均值更新 x k 0 k x_{k_0}^k xk0k为 x k 1 k x_{k_1}^k xk1k
由此,我们就得到一个新得中心点 K 1 = { x k 1 1 , x k 1 2 , . . , x k 1 k } K_1=\{x_{k_1}^{1},x_{k_1}^{2},..,x_{k_1}^k\} K1={xk11,xk12,..,xk1k}, - 用新得中心代替原来得中心,重复#2,#3直到中心不变或者变化很小为止. 假设我们一共计算j次,我们得到最终的中心 K j = { x k j 1 , x k j 2 , . . , x k j k } K_j=\{x_{k_j}^{1},x_{k_j}^{2},..,x_{k_j}^k\} Kj={xkj1,xkj2,..,xkjk}
- 我们根据最终的中心执行#2 则得到的 K 个分类为我们最终的聚类结果
问题和改进
明显地,k-means 的结果和初始随机的中心非常相关,极端的情况下,如果两个样本完全一样,则会出现无法分出K类的问题。
针对初始中心选择的问题,提出了k-means++
- k-means++
k-means++, 与k-means不同的地方就是中心点的选择。相比于k-means一次性随机选择K个中心点。k-means++ 的中心点是逐个选择:先随意选择一个样本点作为一个中心,而后计算所有样本到中心的距离,距离大的样本具有较大的概率选择为下一个中心,根据这样中心选择的概率调整,一次获得K个中心。可以一定程度上优化中心点选择的问题。
除了初始中心随机的问题,还有一个就是在计算的过程中有大量的距离计算,严重影响了计算效率,为此elkan k-means 应运而生。
- elkan k-means
elkan k-means 是运用两边之和大于第三边的思想和两边之差小于第三边的思想来减小计算量。
1. 两边之和大于第三边。对于一个样本点X和两个中心k1和k2,如果我们预先计算出来了两个质心之间的距离D(k1,k2), 如果2D(X,k1)≤D(k1,k2) 即可得到D(X, k1)≤D(X,k2)
D ( X , k 1 ) + D ( X , k 2 ) ≥ D ( k 1 , k 2 ) ≥ 2 D ( X , k 1 ) D(X,k1)+D(X,k2) \geq D(k1,k2) \geq 2D(X,k1) D(X,k1)+D(X,k2)≥D(k1,k2)≥2D(X,k1)
2.两边之差小于第三边
D ( X , k 2 ) ≥ max { 0 , D ( X , k 1 ) − D ( k 1 , k 2 ) } D(X,k2)≥\max\{0,D(X,k1)-D(k1,k2)\} D(X,k2)≥max{0,D(X,k1)−D(k1,k2)}
在数据量巨大的情况下,就算使用elkan k-means也不可避免的会有巨大的运算了,在这种情况下可以考虑使用Mini-Batch-Kmeans。
- Mini-Batch-Kmeans
这个算法实际上是从大样本中随机的无放回的抽取一定数目的样本来执行k-means,虽然精准度会有所下降,但是可以大大简化计算/
k-means 相对简单,就不举例子了。