<>一、k-means

1、简述

K-Means是一种无监督学习算法。算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

2、K-means算法基本思路是:

*
首先选择好将数据分成k类,然后随机初始化k个点作为中心点。

*
对于每一个数据点,选取与之距离最近的中心点作为自己的类别。

*
当所有数据点都归类完毕后,调整中心点:把中心点重新设置为该类别中所有数据点的中心位置,每一轴都设置为平均值。(所以称为means)

*
重复以上2~3步骤直至数据点的类别不再发生变化。

3、缺点:

缺点一:聚类中心的个数K需要事先给定,但在实际中K值的选定是非常困难的,很多时候我们并不知道给定的数据集应该聚成多少个类别才最合适。

缺点二:k-means算法需要随机地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果,有可能导致算法收敛很慢甚至出现聚类出错的情况。

4、解决

1、解决缺点一、很难在k-means算法以及其改进算法中解决,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过“肘方法”选择一个合适的k值。

肘部法则

手肘法的核心指标是SSE(sum of the squared errors,误差平方和)

其中,Ci是第i个簇,x是Ci中的样本点,μi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:

随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

2、解决缺点二、可以通过k-means++算法来解决

<>二、k-means++

1、K-Means++的对于初始化质心的优化策略,如下:

a)从输入的数据点集合中随机选择一个点作为第一个聚类中心 μ1

b) 对于数据集中的每一个点xi,计算它与已选择的聚类中心中最近聚类中心的距离D

c) 选择一个新的数据点作为新的聚类中心,选择的原则是:D较大的点,被选取作为聚类中心的概率
较大。(如果按照距离直接选择的话,容易选到异常点,引起聚类出错或收敛很慢)

d) 重复b和c直到选择出k个聚类质心

e) 利用这k个质心来作为初始化质心去运行标准的K-Means算法

2、k-means++缺点

k-means++ 最主要的缺点在于其内在的顺序执行特性,得到 k 个聚类中心必须遍历数据集 k 次,并且 当前聚类中心的计算依赖于前面得到的所有聚类中心,
这使得算法无法并行扩展,极大地限制了算法在大规模数据集上的应用。

针对这种缺陷,k-means||算法提供了解决方法。

<>三、k-means||

1、算法实现思路:

第一步: 随机抽取一个样本作为候选聚类中心

第二步: 计算每个样本到最近聚类中心的距离,按照概率抽取一批点,作为候选聚类中心

第三步: 重复第二步,循环5次,得到比预设的K大一些的候选聚类中心集合

第四步: 计算每个候选质心的密度(看谁附近的样本点多)

第五步: 在候选质心集合上执行一个考虑了权重的kmeans++算法,得到确切的K个质心

第六步: 执行kmeans算法

2、小结:

k-means||是k-means++的变体,k-means||在初始化中心点时对kmeans++的缺点做了规避,主要体现在不需要根据k的个数严格地寻找k个点,突破了算法在大规模数据集上的应用瓶颈,同时初始化的中心点更加健壮。

<>四、总结

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信