聚类算法-K-means

    xiaoxiao2021-04-17  48

    **********************K-means算法****************************

    步骤:

    1.从训练数据中随机选取k个初始点,作为k个初始簇的中心点

    2.计算每个点到中心点的欧式距离,将其归并到距离最近的簇中,直至所有点划分完成

    3.计算每个簇新的中心点

    4.如果相对于原来中心点没有变化或者变化数值小于给定阈值,则算法结束,获得k个簇,否则以计算出的新的中心点为新的簇的中心,继续进行2,3操作,直至满足终止条件

    *******************关于k值的选择*********************************

    方法一:使用轮廓系数

    轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。

    具体计算方法如下:

    对于其中的一个点 i 来说:

    计算 a(i) = average(i向量到所有它属于的簇中其它点的距离)

    计算 b(i)  min (i向量到所有非本身所在簇的点的平均距离)

    那么 i 向量轮廓系数就为:

    可见轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。

    将所有点的轮廓系数求平均,就是该聚类结果总的轮廓系数

    在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分聚类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。 

    方法二:VRC (本质其实就是方差分析,将类间方差与类内方差比较,两者之比近似1,说明来自同一个正态总体,而远远大于1,说明类间方差远大于类内方差,两者不来自同一个整体,可以认为两者是不同类,这是我们可以认为聚类效果较好)

          

    其中SSB是类间方差, ,m为所有点的中心点,mi为某类的中心点;

    SSW是类内方差,;

    (N-k)/(k-1)是复杂度;

    比率越大,数据分离度越大.1

    选取VRC最大的K作为我们的选择

    *********************关于初始点的选择**********************

    方法一:随机选择

    ①选取一个随机点作为第一个初始点

    ②选取一个距离第一个初始点最远的点作为第二个初始点

    ③选取距离第一个和第二个初始点距离之和最大的点作为第三个初始点

    ④依次类推,直至选够K个初始点

    方法二:使用Canopy算法

    (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2。 (2)任取一个样本点p,作为一个Canopy,记为C,从S中移除p。 (3)计算S中所有点到p的距离dist (4)若dist<t1,则将相应点归到C,我们认为这个点和C有关联,作为弱关联。 (5)若dist<t2,则将相应点移出S,归到C,我们认为这个点已经和C相当接近了,作为强关联。 (6)重复(2)~(5),直至S为空

    我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。

    方法三:使用层次聚类算法做预处理

    详见博客中聚类算法

    转载请注明原文地址: https://ju.6miu.com/read-674384.html

    最新回复(0)