科研笔记第22期——k-means聚类、k-medoids聚类、模糊c聚类

目录

一、K-means聚类算法

二、K-medoids 聚类算法

三、FCM 聚类算法

四、算例分析

五、参考文献

一、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小时内删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值