一、K-means基本原理

1-1 kmeans思想

    k-means是一种无监督的聚类算法,从字面上理解k指要聚类的数目,means指的是聚类的中心。因此,kmeans的算法核心思想是,输入给定的聚类数目k,输出k个中心的聚类结果。

  整个算法的唯一输入便是k,那如何选取k的数值呢?

  1、提前已获知k的大小;

  2、通过肘部法规进行选取。

可参考这篇文章:https://www.cnblogs.com/yan2015/p/5239970.html

1-2 k-means算法流程

(1) 随机选取k个初值;

     采用kmeans++思想(比起随机选择,这种思想能够更大几率的避免聚类时陷入局部解)

     1、从输入的数据点集合中选择一个不是噪声的点作为第一个聚类中心

     2、对于数据集中的每一个点x,计算它与已经选出来的聚类中心的距离D(x)

     3、D(x)最大的那个点,被选取为新的聚类中心

     4、重复第2和第3,直到k个聚类中心被选出来

     5、利用这k个初始的聚类中心来进行k-means聚类

(2) 在第j次迭代中,对于每个样本点,计算距离每个点到所有1,2...,i...,k中心点的距离,以最小距离为标准设为第i类;

(3) 根据上一步的计算的类,更新每一类的中心点,中心的是该类所有点每一维度的均值;

(4) 重复第(2)和第(3),直至误差小到某个值或者到达一定的迭代步数.

1-3 kmeans的空间和时间复杂度

  N为样本点个数,K为中心点个数,I为迭代次数

  空间复杂度:o(N)

  时间复杂度:o(I*K*N)

1-4 kmeans聚类评价指标---轮廓系数

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

  1. 对于每个样本点i,计算点i与其同一个簇内的所有其他元素距离的平均值,记作a(i),用于量化簇内的凝聚度。
  2. 选取i外的一个簇b,计算i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b(i),即为i的邻居类,用于量化簇之间分离度。
  3. 对于样本点i,轮廓系数s(i) = (b(i) – a(i))/max{a(i),b(i)}
  4. 计算所有i的轮廓系数,求出平均值即为当前聚类的整体轮廓系数,度量数据聚类的紧密程度

  从上面的公式,不难发现若s(i)小于0,说明i与其簇内元素的平均距离小于最近的其他簇,表示聚类效果不好。如果a(i)趋于0,或者b(i)足够大,即a(i)<<b(i),那么s(i)趋近与1,说明聚类效果比较好。

二、聚类简例

2-1 数据源简介

  本次数据为自己拟合的数据,采用4种典型的电力负荷模型,进行尺度变化、位移变化和噪声变化,每个模型产生50个新的数据。

  尺度变化:时间序列在尺度(缩放)中存在差异。如序列X变换为Y=aX+b,其中a和b为常熟,X与Y的相似度不变。

  位移变化:两时间序列相位具有一定偏差,如Y(t)=X(t-t0),X与Y的相似度不变。

  噪声变化:当两时间序列相位具有相似的相态,但受到不同程度噪声干扰时,两者相似度不变。

k-means数据聚类简例(电力负荷-matlab)           k-means数据聚类简例(电力负荷-matlab)

              图一  尺度变化+位移变化                                                 图二  噪声变化

同一个模型通过尺度变化、位移变化和噪声变化产生的3条曲线经过kmeans聚类后,应该归为一个类簇。

k-means数据聚类简例(电力负荷-matlab)   

                      图三    8种典型负荷曲线

  在本次实验中仅仅选取前四种。

k-means数据聚类简例(电力负荷-matlab)k-means数据聚类简例(电力负荷-matlab)

                                               类别1

k-means数据聚类简例(电力负荷-matlab)

                                               类别2

k-means数据聚类简例(电力负荷-matlab)

                                               类别3

k-means数据聚类简例(电力负荷-matlab)

                                               类别4

k-means数据聚类简例(电力负荷-matlab)

                                               类别汇总

2-2 聚类算法流程图

样本产生程序:

文件名为:user_class*.m  包含文件circle_shift.m   shift.m

kmeans聚类程序:

文件名为:kmeans_Main.m  包含文件kmeans_Gu.m   normalization.m  kmeans_init.m   kmeans_process.m   SC.m

程序源代码Github地址为:https://github.com/Gzww/kmeans-cluster

有积分大佬的话,能Donate一下不胜感激:https://download.csdn.net/download/guziwen/11165349

相关文章: