请和我一起学习机器学习算法之k-means
k-means 概念简述
k-means 是一种聚类算法,具有随机,无监督的特点。也叫k中心值聚类。其中的k,表示的是要分成类别的数量,也就是说你最终要分成几堆。
k-means 算法流程
k-means 是一通过距离情况优化中心的策略来实现聚类。具有一定的随机性。
算法步骤如下:
算法输入:训练数据X={x1,x2,...,xm}X=\{x_1,x_2,...,x_m\}X={x1,x2,...,xm},K(想聚类的数目)
- 随机在训练数据中选取K个值 K0={xk01,xk02,..,xk0k}K_0=\{x_{k_0}^{1},x_{k_0}^{2},..,x_{k_0}^k\}K0={xk01,xk02,..,xk0k},作为中心。
- 分别计算样本数据X中所有的样本到这K个中心的距离,并将计算样本标记为距离k个中心最小的中心类别。所有样本标记为1~k中的某一类。
- 根据#2中的标记,对标记为中心进行更新(K0到K1K_0 到 K_1K0到K1)。更新方式为:
距离xk01x_{k_0}^1xk01最近的所有样本, 也就是标记为1的所有样本,取均值更新xk01x_{k_0}^1xk01为xk11x_{k_1}^1xk11
距离xk02x_{k_0}^2xk02最近的所有样本, 也就是标记为2的所有样本,取均值更新xk02x_{k_0}^2xk02为xk12x_{k_1}^2xk12
… …
距离xk0kx_{k_0}^kxk0k最近的所有样本, 也就是标记为k的所有样本,取均值更新xk0kx_{k_0}^kxk0k为xk1kx_{k_1}^kxk1k
由此,我们就得到一个新得中心点K1={xk11,xk12,..,xk1k}K_1=\{x_{k_1}^{1},x_{k_1}^{2},..,x_{k_1}^k\}K1={xk11,xk12,..,xk1k}, - 用新得中心代替原来得中心,重复#2,#3直到中心不变或者变化很小为止. 假设我们一共计算j次,我们得到最终的中心Kj={xkj1,xkj2,..,xkjk}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,k1)+D(X,k2)≥D(k1,k2)≥2D(X,k1) 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,k2)≥max{0,D(X,k1)−D(k1,k2)} 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 相对简单,就不举例子了。
本文深入探讨了K-means聚类算法的概念与流程,包括其随机性和无监督特性。介绍了算法的具体步骤,从初始化中心点到迭代更新直至收敛。同时,讨论了算法存在的问题,如对初始中心点敏感及计算效率低下,并提出了k-means++和elkank-means等改进方案。

被折叠的 条评论
为什么被折叠?



