目录
一、K-means聚类算法
运用K-means算法进行聚类分析时,不需对样本进行标记与训练学习,属于无监督分类算法。K-means聚类算法基于以下两个假设:1)每个簇的中心是该簇内所有点的平均值;2)每个点都属于距离其最近的中心所在的簇。基于这两个假设,K-means算法通过迭代寻找最佳中心来实现聚类。其物理机理为以距离来衡量数据样本间相似程度,负荷曲线样本间的距离越小,负荷曲线越相似,在同一簇类的可能性越大。计算数据样本间距离的方法有很多种,K-means算法通常采用欧氏距离来计算数据样本之间的距离。
算法流程如图1所示。
图1 K-means 算法流程
二、K-medoids 聚类算法
传统 K-edoids聚类算法使用一个代价函数来评估聚类质量的好坏,以重复迭代的方式寻找到最好的聚簇划分及聚簇中心点。这里使用基于欧式距离的聚类误差平方E来评估聚类结果质量,定义如下:
K-means聚类和K-medoids聚类的主要区别为:
K-means聚类:簇中心是由簇中所有样本点的平均值(即均值)计算得出的。这意味着在每次迭代中,簇中心的位置会根据簇内所有点的位置进行更新。
K-medoids聚类:簇中心(也称为medoid)是簇中实际存在的一个样本点,而不是由样本点的平均值计算得出的。具体来说,medoid是簇中所有其他点到它的距离之和最小的点。因此,在K-medoids聚类中,簇中心始终是一个实际的数据点。
三、FCM 聚类算法
FCM 聚类是基于二次目标函数最小化的迭代优化算法。隶属度函数表示数据点属于各个簇的程度,每个数据的隶属度是根据数据点与聚类中心的距离确定的,隶属度越大意味着数据点越接近聚类中心。FCM 聚类算法的目标函数/定义如下:
四、算例分析
本文章分别针对常用的二维数据,电力负荷曲线进行讨论。
在此仅展示k-means聚类算法在二维数据上面的应用;完整程序可见:
👇👇👇👇👇👇👇👇
https://mbd.pub/o/bread/ZpWcmZdy
👆👆👆👆👆👆👆👆
主函数:
%% 清空工作区
clear all;
clc;
close all
%% 读取数据
[num,text,raw]=xlsread('数据.xlsx');
figure(1)
plot(num(:,1),num(:,2),'ro','LineWidth',2)
title("原始数据散点图")
cluster_num=3; %%肘部法确定聚类数K
[index_cluster,cluster] = kmeans_func(num,cluster_num);
%% 画出聚类效果
figure(2)
% subplot(2,1,1)
a=unique(index_cluster); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)
C(1,i)={find(index_cluster==a(i))};
end
for j=1:cluster_num
data_get=num(C{1,j},:);
scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);
hold on
end
%绘制聚类中心
plot(cluster(:,1),cluster(:,2),'ks','LineWidth',2);
基于“肘部法”确定聚类中心:
%% 清空工作区
clear all;
clc;
close all
%% 读取数据
[num,text,raw]=xlsread('数据.xlsx');
figure(1)
plot(num(:,1),num(:,2),'ro','LineWidth',2)
title("原始数据散点图")
%% 肘部法确定聚类数K
SSE=[];
for cluster_num=2:10
[index_cluster,cluster] = kmeans_func(num,cluster_num);
a=unique(index_cluster);
C=cell(1,length(a));
for i=1:length(a)
C(1,i)={find(index_cluster==a(i))};
end
for j=1:cluster_num
data_get=num(C{1,j},:);
distance=(data_get-repmat(cluster(j,:),size(data_get,1),1)).^2;
distance1(:,j)=sum(sqrt(sum(distance'))); %类间所有点与该类质心点距离之和
end
D(cluster_num,1)=cluster_num;
D(cluster_num,2)=sum(distance1);
end
figure(2)
plot(D(2:end,1),D(2:end,2))
hold on;
plot(D(2:end,1),D(2:end,2),'or');
xlabel('分类数(K值)');
ylabel('误差平方和');
子函数:
function [index_cluster,cluster] = kmeans_func(data,cluster_num)
%% 原理推导Kmeans聚类算法
[m,n]=size(data);
cluster=data(randperm(m,cluster_num),:);%从m个点中随机选择cluster_num个点作为初始聚类中心点
epoch_max=1000;%最大次数
therad_lim=0.001;%中心变化阈值
epoch_num=0;
while(epoch_num<epoch_max)
epoch_num=epoch_num+1;
% distance1存储每个点到各聚类中心的欧氏距离
for i=1:cluster_num
distance=(data-repmat(cluster(i,:),m,1)).^2;
distance1(:,i)=sqrt(sum(distance'));
end
[~,index_cluster]=min(distance1');%index_cluster取值范围1~cluster_num
% cluster_new存储新的聚类中心
for j=1:cluster_num
cluster_new(j,:)=mean(data(find(index_cluster==j),:));
end
%如果新的聚类中心和上一轮的聚类中心距离和大于therad_lim,更新聚类中心,否则算法结束
if (sqrt(sum((cluster_new-cluster).^2))>therad_lim)
cluster=cluster_new;
else
break;
end
end
end
五、参考文献
【1】覃日升,况华,何鑫,等.基于改进PSO-Kmeans算法的实际日负荷曲线聚类分析[J].电工技术,2022,(11):1-6.DOI:10.19768/j.cnki.dgjs.2022.11.001.
【2】宗文泽,吴永明,徐计,等.基于DTW-kmedoids算法的时间序列数据异常检测[J].组合机床与自动化加工技术,2022,(05):120-124+128.DOI:10.13462/j.cnki.mmtamt.2022.05.029.
【3】刘嘉蔚,李奇,陈维荣,等.基于多分类相关向量机和模糊C均值聚类的有轨电车用燃料电池系统故障诊断方法[J].中国电机工程学报,2018,38(20):6045-6052.DOI:10.13334/j.0258-8013.pcsee.170842.
【4】李姣.改进哈里斯鹰优化算法及在聚类中的应用研究[D].西安理工大学,2022.DOI:10.27398/d.cnki.gxalu.2022.001264.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。