当前位置:   article > 正文

k-means模型(matlab实现)_matlab kmean

matlab kmean

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

基础概念

原理

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

基础概念

原理

在这里插入图片描述

从上图中,我们可以看到,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.com/s/1y8iP7X6mTqiiTGeDtd84vQ
提取码:qm9p

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

算法实现

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

绘图

上述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');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

打印聚类中心

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

完整代码

%% 使用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/132370
推荐阅读
相关标签
  

闽ICP备14008679号