1.K-means算法原理
K-means是由J.B.MacQueen在1967年提出的,是一种较为经典的、广泛使用的基于划分的聚类算法,由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。K-means算法以K为参数,把n个对象分成K个簇,使簇内具有较高的相似度,而簇间的相似度较低。K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。这个过程不断重复,直到准则函数收敛。
K-means聚类算法属于一种动态聚类算法,也称作逐步聚类算法,该算法的一个比较显著的特点就是迭代过程,每次都要检查每个样本数据的分类正确与否;如果不正确,就进行调整。当把所有的数据调整后,再修改每一个聚类中心,最后进入下一次迭代过程。如果在一个迭代中,所有的数据对象都已经被正确分类,那么就不再进行调整,聚类中心也不会改变,此时,聚类准则函数已经收敛,算法结束。
2.K-means算法过程
给定数据集D={x1,x2,…,xn},其中xi是d维实数向量,假定ck(k=1,2,…,K)为第k个簇的中心点(也叫质心),Kmeans算法的目标是为每个样本找到一个簇,使得该样本与该簇的距离的平方和最小,也即与ck的距离平方和最小,公式[13]如下:
其中,K表示簇的个数,nk表示第k个簇中的数据个数,xik表示第k个簇中第i个数据。
K-means算法过程如下:
(1)从训练数据中随机选取K个初始点,作为K个初始簇的中心点(质心);
(2)重复迭代如下步骤,直至收敛:
①计算每个点到中心点的欧式距离[见公式(5.65)],将其归并到距离最近的簇中,直至所有点划分完成;
②重新计算每个簇新的中心点,如果相对于原来中心点没有变化或者变化数值小于给定阈值,则算法收敛,获得K个簇。
3.K-means算法需要注意的问题
(1)K值的确定
①根据问题确定。K值的确定可以根据问题内容确定,例如:一个鞋厂有三种新款式,如果我们想知道每种新款式都有哪些潜在客户,于是我们调研客户,然后从数据里找出三类。
②肘部法则。如果问题中没有指定K的值,可以通过肘部法则这一技术来估计聚类数量。肘部法则会把不同K值的成本函数值画出来。随着K值的增大,平均畸变程度会减小;每个类包含的样本数会减少,于是样本离其重心会更近。但是,随着K值继续增大,平均畸变程度的改善效果会不断减低。K值增大过程中,畸变程度的改善效果下降幅度最大的位置对应的K值就是肘部。图5-27是用肘部法则来确定最佳K值的示意图。
图5-27 肘部法则来确定最佳K值的示意图(www.xing528.com)
从图中可以看出,K值从1到2时,平均畸变程度变化最大。超过2以后,平均畸变程度变化显著降低。因此最佳的K值是2。
(2)初始质心的选取。选择适当的初始质心是基本K-means算法的关键步骤。常见的方法是随机地选取初始中心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。
第二种有效的方法是,取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取K个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:①样本相对较小,例如数百到数千(层次聚类开销较大);②K相对于样本大小较小。
第三种选择初始质心的方法是,随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法用于点样本。由于离群点很少,它们多半不会在随机样本中出现。计算量也大幅减少。
4.K-means算法优缺点
(1)K-means算法优点
①K-means算法快速、简单;
②K-means对大数据集有较高的效率,并且是具有可伸缩性的;
③K-means算法时间复杂度近于线性,而且适合挖掘大规模数据集。K-means聚类算法的时间复杂度是O(nKt),其中n代表数据集中对象的数量,t代表算法迭代的次数,K代表簇的数目。
(2)K-means算法缺点
①在K-means算法中K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适,这也是K-means算法的一个不足。有的算法是通过类的自动合并和分裂,得到较为合理的类型数目K,例如ISODATA算法。关于K-means算法中聚类数目K值的确定可以根据方差分析理论,应用混合F统计量来确定最佳分类数,并应用模糊划分熵来验证最佳分类数的正确性;也可以使用一种结合全协方差矩阵的RPCL算法,并逐步删除那些只包含少量训练数据的类;还可以使用一种称为次胜者受罚的竞争学习规则,来自动决定类的适当数目。它的思想是:对每个输入而言,不仅竞争获胜单元的权值被修正以适应输入值,而且对次胜单元采用惩罚的方法使之远离输入值;
②在K-means算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择不好,可能无法得到有效的聚类结果,这也成为K-means算法的一个主要问题。对于该问题的解决,许多算法采用遗传算法进行初始化,以内部聚类准则作为评价指标;
③从K-means算法框架可以看出,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。所以需要对算法的时间复杂度进行分析、改进,提高算法应用范围。可以从该算法的时间复杂度进行分析考虑,通过一定的相似性准则来去掉聚类中心的侯选集;
④对离群点很敏感;
⑤从数据表示角度来说,在K-means中,我们用单个点来对簇进行建模,这实际上是一种最简化的数据建模形式。这种用点来对簇进行建模实际上就已经假设了各簇的数据是呈圆形(或者高维球形)或者方形等分布的,不能发现非凸形状的簇。但在实际生活中,很少能有这种情况。所以在GMM中,使用了一种更加一般的数据表示,也就是高斯分布;
⑥从数据先验的角度来说,在K-means中,我们假设各个簇的先验概率是一样的,但是各个簇的数据量可能是不均匀的。举个例子,簇A中包含了10 000个样本,簇B中只包含了100个。那么对于一个新的样本,在不考虑其与簇A、簇B相似度的情况下,其属于簇A的概率肯定是要大于簇B的;
⑦在K-means中,通常采用欧氏距离来衡量样本与各个簇的相似度。这种距离实际上假设了数据的各个维度对于相似度的衡量作用是一样的。但在GMM中,相似度的衡量使用的是后验概率,通过引入协方差矩阵,我们就可以对各维度数据的不同重要性进行建模。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。