1/前言
K-means算法,又称为k-均值算法,
无监督学习算法
是一种聚类算法。
就是对一定维度空间中的数据点进行聚类,空间维度越大,计算越复杂(比如每个数据点都是20维的,那么计算i起来就很复杂)
物以类聚,人以群分。
为啥叫k-均值算法?
因为每个簇cluster都有一个聚类中心,
当聚类中心不再发生变化的时候,整个聚类过程就结束了。
每个簇cluster的聚类中心,就是根据簇中的所有数据点求均值得到的,
所以又称为k-均值算法。
K-means算法是基于空间距离的聚类算法(相比于dbscan等基于密度的聚类算法)
它采用距离作为2个数据点相似性大小的评价指标,即认为两个数据点的距离越近,其相似度就越大。
该算法认为簇cluster是由距离靠近的数据点组成的,因此把得到紧凑且独立的簇cluster作为最终目标。
kmeans++算法只是在选择初始聚类中心的时候起作用,选择完初始聚类中心之后,剩下的每一次迭代就是kmeans算法的正常迭代了,就跟kmeas++没有关系了。
kmeans++是一种用于选择【初始聚类中心】的策略,使得这些中心之间的距离尽可能【远】,旨在通过智能地选择初始质心来减少算法陷入【局部最优解】的可能性。
kmeans++ 通过一种概率分布来选择后续的质心,使得它们之间的距离尽可能远,从而有利于后续迭代的收敛。
关于kmeans算法,如果我选择kmeans++方法来选择初始聚类中心,那么每次迭代选出来的初始聚类中心都是不一样的吗
关于kmeans算法,如果选择kmeans++方法来选择初始聚类中心,
每次迭代选出来的初始聚类中心在理论上应该是相同的,
但这里需要澄清几个关键点:
- kmeans++的初始化过程:kmeans++算法在初始化阶段通过一种智能的方式选择初始聚类中心,使得这些中心之间的距离尽可能远。这个过程是确定的,即给定相同的数据集和相同的随机数种子(如果有的话),kmeans++会生成相同的初始聚类中心集合。
- 随机数种子的影响:然而,如果kmeans++实现中使用了随机数(尽管在kmeans++的初始化过程中,随机性主要用于选择第一个聚类中心,但后续中心的选择是基于已选中心的距离分布,因此随机性影响较小),那么不同的随机数种子可能导致不同的初始聚类中心。但在实际应用中,如果不显式设置随机数种子,那么每次运行kmeans++时使用的随机数种子可能是由系统或库自动生成的,这可能导致每次运行得到不同的初始聚类中心(尽管这种差异在大多数情况下是微小的)。
- 迭代与初始聚类中心的关系:需要注意的是,这里的“迭代”一词可能有些误导。在kmeans++的上下文中,迭代通常指的是算法整体上的迭代过程,即不断重新分配数据点到最近的聚类中心并更新聚类中心的位置,直到满足某个收敛条件。而kmeans++的“初始化迭代”特指选择初始聚类中心的过程,这个过程在算法开始之前只执行一次(除非显式地重新运行kmeans++初始化)。
- n_init参数的影响:如果设置了
n_init> 1,则算法会多次运行kmeans++(或任何其他初始质心选择方法),每次都会生成一套新的初始聚类中心,并运行完整的K-Means算法直到收敛。然后从这些运行中选择最佳的结果。但在这个上下文中,我们讨论的是单次kmeans++初始化过程中的初始聚类中心选择,而不是多次运行的结果。
综上所述,如果选择kmeans++方法来选择初始聚类中心,并且没有改变随机数种子或其他可能影响初始化过程的因素,那么每次“初始化迭代”选出来的初始聚类中心在理论上应该是相同的。然而,在实际应用中,由于随机数种子的影响或n_init参数的设置,可能会观察到不同的初始聚类中心集合。但这种情况下的不同通常是由于算法被多次运行(每次可能使用不同的随机数种子)或显式地要求算法尝试多个初始质心集合所导致的。
2/核心思想
K-means算法是一种迭代求解的聚类分析算法
<1>随机选取K(k值是人为提前指定的)个数据点作为初始聚类中心,作为初始cluster,
此时每个初始cluster只包含一个数据点。
<2>repeat
对每个样本点,计算得到距离其最近的聚类中心,将其类别标为该质心所对应的cluster。
重新计算k个cluster对应的质心(质心是cluster中样本点的均值);
<3>这个过程将不断重复直到满足某个终止条件
<4>终止条件可以是:
聚类中心再发生变化,误差平方和局部最小,
或者人为规定一个迭代阈值(及迭代n次就结束,不管聚类结果如何都结束)
3/算法实现步骤
<1>首先人为确定一个k值,即我们希望将数据集聚合成几类
<2>随机确定k个数据点作为初始聚类中心
<3>对每一个数据点,计算它与每一个初始聚类中心的距离,
离哪个初始聚类中心近,就把它划分到哪个初始聚类中心所属的簇。
<4>把所有数据归好簇之后,一共有k个簇。然后重新计算每个簇的中心(均值)。
<5>如果新计算出来的簇中心和原来的中心之间的距离小于某一个设置的阈值
及重新计算的质心的位置变化不大,趋于稳定,或者说收敛,
我们可以认为聚类已经达到期望的结果,算法终止。
<6>如果新质心和原质心距离变化很大,需要迭代3~5步骤。
4/算法步骤图解
<1>上图a表达了初始的数据集合,此时还没有分类,全都是一种颜色
<2>假设k=2,在图b中,我们随机选择了两个初始聚类中心,即图中的红色聚类中心和蓝色聚类中心。
<3>分别计算数据集合中所有数据点到这2个初始聚类中心的距离,
并标记每个数据点的类别为和该样本距离最小的聚类中心的类别,经过计算数据点和红色质心和蓝色质心的距离,我们得到了所有数据点的第一轮迭代后的类别,如图c所示
<4>此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动
<5>图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。
<6>最终我们得到的两个类别如图f。
5/K-means算法的专业术语:
簇cluster:一个集合,簇中的数据点是相似的(物以类聚,人以群分)
质心:簇的中心(簇中所有数据点的中心,平均值)
6/K-means算法优缺点
优点:
<1>原理简单,快速
<2>即使是大数据集,时间复杂度几乎是线性的,适合挖掘大数据集。
<3>需要调节的参数少,主要需要调参的参数仅仅是簇的数量k
缺点:
<1>k值需要人为给定,一般凭借经验。
<2>初始聚类中心的选择是随机的,也就是说每次初始聚类中心选择的不同,最后的聚类结果也不同。
<3>对异常值敏感,及受异常值的影响比较大。
正是因为k-means算法的这个特征,所有可以用来检测异常值。
7/k-means聚类算法有2个难点
<1>确定k值,用手肘法,确定k的最佳值
<2>如何选择k个初始聚类中心
k-means++算法
8/k-means算法的细节问题
1、k值怎么定?
答:主要取决于个人的经验与感觉,通常做法是多尝试几个K值,看哪个结果更好,更符合分析目的等。
或者可以把各种K值算出的E(误差平方和)做比较,取最小的E的k值。
(手肘法),SSE,误差平方和。
2、初始聚类中心如何选择?
答:k-means算法是随机选择的。因此每次聚类的结果可能都是不同的。
k-means++算法可以解决这个问题。
3、关于离群点?
答:离群值就是远离整体的,非常异常、非常特殊的数据点。
k-means算法是受离群点影响的。
在聚类之前应该将这些“极大”“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。
但是,离群值往往自身就很有分析的价值,可以把离群值单独作为一类来分析。
4、单位要一致
答:比如X的单位是米,Y也是米,那么距离算出来的单位还是米,是有意义的。
但是如果X是米,Y是吨,用距离公式计算就会出现“米的平方”加上“吨的平方”再开平方,最后算出的东西没有数学意义,这就有问题了。
5、标准化/归一化
答:如果数据中X整体都比较小,比如都是1到10之间的数,Y很大,比如都是1000以上的数,那么,在计算距离的时候Y起到的作用就比X大很多,X对于距离的影响几乎可以忽略,这也有问题。因此,如果K-Means聚类中选择欧几里德距离计算距离,数据集又出现了上面所述的情况,就一定要进行数据的标准化(normalization),即将数据按比例缩放,使之落入一个小的特定区间。