详解 K-means及其改进算法
详解 K-means及其改进算法
K-means
基本概念
算法步骤:
Step1.给定初始质心:首先选取初始质心集合centroids
说明
A.质心数量由用户给出,记为k,k-means最终得到的簇数量也是k
B.每个质心的数值由初始质心的计算算法计算得到,初始质心计算算法由用户给出
C.k-means最后聚类的簇个数和用户指定的质心个数相等,一个质心对应一个簇,每个样本只聚类到一个簇里面
D.初始簇为空
Step2.样本聚类:计算每个样本和每个质心的距离,将样本聚类到距离最近的质心的簇里面
说明:
A.样本和质心的距离可以使用欧氏距离(欧几里得距离)
用python表示就是np.sqrt(sum(np.power(p1-p2,2))),p1=np.array([x1,y1]), p2=np.array([x2, y2])
B.如果得到某一个样本和每个质心的距离为:distances=[5, 6, 2, 1,3,9],则可知此样本将被分到第4个质心所在的簇第4个簇的簇号是3,用python表示簇号就是np.argmin(distances) = 3
C.经过step2,得到k个新的簇,每个样本都被分到k个簇中的某一个簇
D.得到k个新的簇后,当前的质心就会失效,需要计算每个新簇的自己的新质心
Step3.重新计算质心:每个簇的新质心的属性值等于此簇中所有样本的属性值得平均值
说明:
A.比如一个新簇有3个样本:[[1,4], [2,5], [3,6]],得到此簇的新质心=[(1+2+3)/3, (4+5+6)/3]
B.经过step3,会得到k个新的质心,作为step2中使用的质心
Step4.是否停止K-means:给定loop最大次数loopLimit 以及 所有质心变化距离的最大值maxDistance
A.当loop次数超过looLimit时,停止k-means
B.当所有质心变化的距离组成的序列中的最大值,小于maxDistance时,停止k-means
旧的质心集合=[[1,1], [2,2], [3,3]]
新的质心集合=[[1.5,1.5],[4,4],[6,6]]
所有质心的变化距离序列=[np.sqrt(0.5), np.sqrt(8), np.sqrt(18)] = [0.71, 2.83, 4.24]
所有质心的变化距离的最大值=max([0.71, 2.83, 4.24]) = 4.24
如果maxDistance=5, 由于4.24 < maxDistance,则停止k-means
如果maxDistance=1, 由于4.24 > maxDistance,则继续k-means
C.只需要满足loopLimit和maxDistance其中的一个条件,就可以停止k-means
Step5.
如果step4没有结束k-means,就再执行step2-step3-step4-step5
如果step4结束了k-means,则就打印(或绘制)簇以及质心
K-means ++
基本概念
下面结合一个简单的例子说明K-means++是如何选取初始聚类中心的。
数据集中共有8个样本,分布以及对应序号如下图所示:
假设经过图2的步骤一后6号点被选择为第一个初始聚类中心,那在进行步骤二时每个样本的D(x)和被选择为第二个聚类中心的概率如下表所示:
ISODATA
基本概念
放在最后也是最复杂的就是ISODATA算法。正如之前所述,K-means和K-means++的聚类中心数K是固定不变的。而ISODATA算法在运行过程中能够根据各个类别的实际情况进行两种操作来调整聚类中心数K:(1)分裂操作,对应着增加聚类中心数;(2)合并操作,对应着减少聚类中心数。
下面首先给出ISODATA算法的输入(输入的数据和迭代次数不再单独介绍):
预期的聚类中心数目Ko:虽然在ISODATA运行过程中聚类中心数目是可变的,但还是需要由用户指定一个参考标准。事实上,该算法的聚类中心数目变动范围也由Ko决定。具体地,最终输出的聚类中心数目范围是 [Ko/2, 2Ko]。
每个类所要求的最少样本数目Nmin:用于判断当某个类别所包含样本分散程度较大时是否可以进行分裂操作。如果分裂后会导致某个子类别所包含样本数目小于Nmin,就不会对该类别进行分裂操作。
最大方差Sigma:用于衡量某个类别中样本的分散程度。当样本的分散程度超过这个值时,则有可能进行分裂操作(注意同时需要满足[2]中所述的条件)。
两个类别对应聚类中心之间所允许最小距离dmin:如果两个类别靠得非常近(即这两个类别对应聚类中心之间的距离非常小),则需要对这两个类别进行合并操作。是否进行合并的阈值就是由dmin决定。
上面描述中没有说明清楚的是第5步中的分裂操作和第6步中的合并操作。他们的操作如下:
最后,针对ISODATA算法总结一下:该算法能够在聚类过程中根据各个类所包含样本的实际情况动态调整聚类中心的数目。如果某个类中样本分散程度较大(通过方差进行衡量)并且样本数量较大,则对其进行分裂操作;如果某两个类别靠得比较近(通过聚类中心的距离衡量),则对它们进行合并操作。