一、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之间,值越大,表示聚类效果越好。具体计算方法如下:
- 对于每个样本点i,计算点i与其同一个簇内的所有其他元素距离的平均值,记作a(i),用于量化簇内的凝聚度。
- 选取i外的一个簇b,计算i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b(i),即为i的邻居类,用于量化簇之间分离度。
- 对于样本点i,轮廓系数s(i) = (b(i) – a(i))/max{a(i),b(i)}
- 计算所有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的相似度不变。
噪声变化:当两时间序列相位具有相似的相态,但受到不同程度噪声干扰时,两者相似度不变。
图一 尺度变化+位移变化 图二 噪声变化
同一个模型通过尺度变化、位移变化和噪声变化产生的3条曲线经过kmeans聚类后,应该归为一个类簇。
图三 8种典型负荷曲线
在本次实验中仅仅选取前四种。
类别1
类别2
类别3
类别4
类别汇总
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