k-means模型(matlab实现)

编程入门 行业动态 更新时间:2024-10-28 17:18:47

k-means聚类

    • 基础概念
      • 原理
    • 基础概念
      • 原理
      • 步骤
      • 评价
      • K选取
        • 1)拍脑袋法
        • 2)肘部法则(Elbow Method)
      • 影响因素
    • 代码实现
      • 数据读取
      • 算法实现
      • 绘图
      • 打印聚类中心
      • 完整代码

用于分类问题,例如:花的分类,消费特诊分类

基础概念

原理

用于分类问题,例如:花的分类,消费特诊分类

基础概念

原理

从上图中,我们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是我们的种子点,也就是我们用来找点群的点。有两个种子点,所以K=2。

然后,K-Means的算法如下:

随机在图中取K(这里K=2)个种子点。
然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。(上图中,我们可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点)
接下来,我们要移动种子点到属于他的“点群”的中心。(见图上的第三步)
然后重复第2)和第3)步,直到,种子点没有移动(我们可以看到图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E)。

步骤

评价

K选取

1)拍脑袋法

一个非常快速的,拍脑袋的方法是将样本量除以2再开方出来的值作为K值,具体公式为:

2)肘部法则(Elbow Method)

Elbow Method :Elbow意思是手肘,如下图左所示,此种方法适用于 K 值相对较小的情况,当选择的k值小于真正的时,k每增加1,cost值就会大幅的减小;当选择的k值大于真正的K时, k每增加1,cost值的变化就不会那么明显。这样,正确的k值就会在这个转折点,类似elbow的地方。 如下图:

通过画K与cost function的关系曲线图,如左图所示,肘部的值(cost function开始时下降很快,在肘部开始平缓了)做为K值,K=3。并不是所有的问题都可以通过画肘部图来解决,有的问题如右边的那个图,肘点位置不明显(肘点可以是3,4,5),这时就无法确定K值了。故肘部图是可以尝试的一种方法,但是并不是对所有的问题都能画出如左边那么好的图来确定K值。

Elbow Method公式:

影响因素

代码实现

数据读取

数据:consumption_data.xls
链接:https://pan.baidu/s/1y8iP7X6mTqiiTGeDtd84vQ
提取码:qm9p

inputfile = 'consumption_data.xls'; % 销量及其他属性数据
%% 读取数据
[num,txt]=xlsread(inputfile);
data = num(:,2:end);	%读取excel第2至最后一列
data = zscore(data);    %数据标准化

算法实现

k = 3; % 聚类的类别
iteration =500 ; % 聚类最大循环次数
distance = 'sqEuclidean'; % 距离函数
%% 调用kmeans算法
opts = statset('MaxIter',iteration);
[IDX,C,sumd,D]=kmeans(data,k,'distance',distance,'Options',opts);

绘图

上述k选取为3,所以适用r,b,y三种颜色

%% 绘制三维图
xlabel("R");
ylabel("F");
zlabel("M");
%plot3(data(:,1),data(:,2),data(:,3),".",'Color','r');
plot3(data(IDX==1,1),data(IDX==1,2),data(IDX==1,3),'r.','MarkerSize',12)
hold on
plot3(data(IDX==2,1),data(IDX==2,2),data(IDX==2,3),'b.','MarkerSize',12)
hold on;
plot3(data(IDX==3,1),data(IDX==3,2),data(IDX==3,3),'y.','MarkerSize',12)
hold on;
plot3(C(:,1),C(:,2),C(:,3),"o",'Color','b');

打印聚类中心

%% 打印结果
for i=1:k
   disp(['第' num2str(i) '组聚类中心为:']);
   disp(C(i,:));
end

完整代码

%% 使用K-Means算法聚类消费行为特征数据
clear ;
% 参数初始化
inputfile = 'consumption_data.xls'; % 销量及其他属性数据
k = 3; % 聚类的类别
iteration =500 ; % 聚类最大循环次数
distance = 'sqEuclidean'; % 距离函数

%% 读取数据
[num,txt]=xlsread(inputfile);
data = num(:,2:end);	%读取excel第2至最后一列
data = zscore(data);    %数据标准化
%% 调用kmeans算法
opts = statset('MaxIter',iteration);
[IDX,C,sumd,D]=kmeans(data,k,'distance',distance,'Options',opts);

%% 绘制三维图
xlabel("R");
ylabel("F");
zlabel("M");
%plot3(data(:,1),data(:,2),data(:,3),".",'Color','r');
plot3(data(IDX==1,1),data(IDX==1,2),data(IDX==1,3),'r.','MarkerSize',12)
hold on
plot3(data(IDX==2,1),data(IDX==2,2),data(IDX==2,3),'b.','MarkerSize',12)
hold on;
plot3(data(IDX==3,1),data(IDX==3,2),data(IDX==3,3),'y.','MarkerSize',12)
hold on;
plot3(C(:,1),C(:,2),C(:,3),"bo",'Color','b','MarkerSize',15);
%% 打印结果
for i=1:k
   disp(['第' num2str(i) '组聚类中心为:']);
   disp(C(i,:));
end

更多推荐

k-means模型(matlab实现)

本文发布于:2023-06-14 09:44:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1461833.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模型   means   matlab

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!