<>一、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个点,突破了算法在大规模数据集上的应用瓶颈,同时初始化的中心点更加健壮。
<>四、总结