数据挖掘——聚类算法kmeans整理

【 kmeans算法原理】

  1. 随机选取k个中心点
  2. 遍历所有数据,将每个数据划分到最近的中心点中(根据距离的大小进行划分,即计算每个样本点到所有中心点的距离,选择距离最小的那个)
  3. 计算每个聚类的平均值,并作为新的中心点
  4. 重复2-3,直到这k个中心点不再变化(收敛了),或迭代次数达到规定值
    matlab函数调用:
[IDX,C,sumd,D] = kmeans(X,k,'distance','sqEuclidean','start','sample')  
//距离度量为欧氏距离的平方,初始点从样本X中随机选择k个点
// IDX: 每个样本点所在的类别
//   C: 所聚类别的中心点坐标位置(k*p,p为样本属性的维度)
//sumd: 每个类内各点到中心点的距离之和(1*k)
//   D:每个点到各类中心点的距离(n*k)

【算法的优化方法】

原因:初始中心点的随机选择——可能导致聚类的不正确性
方法1:重复执行几次kmeans,选取sum(sumd)最小的一次作为最终的聚类结果
方法2:重复执行几次kmeans,选取轮廓系数(下面有介绍)最小的一次作为最终的聚类结果

【K的选取】

首先认识下轮廓系数(Silhouette Coefficient)
轮廓系数:结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法如下:

  1. 对于第i个元素x_i,计算x_i与其同一个簇内的所有其他元素距离的平均值,记作a_i,用于量化簇内的凝聚度。
  2. 选取x_i外的一个簇b,计算x_i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b_i,用于量化簇之间分离度。
  3. 对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)
    计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数
    从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元素的平均距离大于最近的其他簇,表示聚类效果不好。如果a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。

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

你可能感兴趣的:(数据挖掘)