matlab对一维数据进行K-means聚类离散化并显示
1、首先,使用clc和clear命令清空matlab的命令窗口和工作区,然后使用xlsread函数将一维数据样本Excel表格中的数据读入到yw_data矩阵。注意表格后缀“.xlsx”,因为有些表格的后缀为“xls”,程序xlsread中语句的后缀也需要与表格后缀相同。同时将yw_data数值矩阵赋值给xx数值矩阵,后面对xx数值矩阵进行操作,不动原始数据样本矩阵yw_data。
程序如下:
clc;
clear;
yw_data=xlsread('一维数据样本.xlsx'); %读入一维数据样本到yw_data矩阵
xx=yw_data;
运行后检查一维数据样本中的数据是否读入到了yw_data数值矩阵中,下面是正常读入的结果。

2、数据读进来后,使用MATLAB自带的K-means聚类算法函数对一维数据进行分类。
程序如下:
clus=4;
[idx,c]=kmeans(xx,clus);
说明:
clus=4是将数据分成4类;
xx是刚刚读入的一维数据样本;
idx是N*1矩阵,存储一维数据样本中每个数据的聚类标号;
c存储的是各个聚类质心的位置
运行程序后的结果如下图所示。


3、聚类后,初始化四个空矩阵cc1、cc2、cc3和cc4,用于存储聚类后的四组数据。初始化空矩阵直接给矩阵赋值[ ]即可,程序如下:
cc1=[];
cc2=[];
cc3=[];
cc4=[];
[n,m]=size(xx);
其中[n,m]=size(xx)是计算一维数据样本的大小,用于后续索引。由于是一维的,所以计算后结果m应等于1,n为一维数据样本的行数。计算结果如下图所示。

4、初始化空矩阵cc1、cc2、cc3和cc4后就可以将聚类后的四类数据存储到相应矩阵中了,用于后续显示和按类分析。程序如下:
for i=1:n
if idx(i)==1
cc1=[cc1;xx(i)];
elseif idx(i)==2
cc2=[cc2;xx(i)];
elseif idx(i)==3
cc3=[cc3;xx(i)];
elseif idx(i)==4
cc4=[cc4;xx(i)];
end
end
说明:使用条件结构索引每个数据的聚类标号idx将一维数据样本中数据进行投框式存储。
分类存储运行后的结果如下图所示。

5、当然,可以显示分类后的边界值和聚类中心,以便于观察分类各类界限和分布中心。
程序如下:
disp('第一类边界')
[min(cc1),max(cc1)]
disp('第二类边界')
[min(cc2),max(cc2)]
disp('第三类边界')
[min(cc3),max(cc3)]
disp('第四类边界')
[min(cc4),max(cc4)]
disp('四类中心')
c
说明:求边界下限使用min()函数,求边界上限使用max()函数,聚类中心直接存储在c矩阵中,c后面不写;号就可显示。
运行结果如下。
第一类边界ans =82.0200 99.2280 第二类边界 ans = 114.3840 128.5710
第三类边界ans =99.2530 143.0310第四类边界ans =128.5930 144.3360
四类中心c = 90.5653 120.8449 107.9135 136.3006

6、当然,光使用数值和矩阵表格显示计算结果还是不怎么直观的,直观显示聚类离散化结果最好的方法就是数据可视化了,即作图显示。
作图显示聚类结果程序如下:
h1=plot(xx,'w');grid on;hold on;
for i=1:n
if idx(i)==1
text(i,xx(i),num2str(idx(i)),'color',[1 0 0]);
elseif idx(i)==2
text(i,xx(i),num2str(idx(i)),'color',[0 1 0]);
elseif idx(i)==3
text(i,xx(i),num2str(idx(i)),'color',[0 0 1]);
elseif idx(i)==4
text(i,xx(i),num2str(idx(i)),'color',[1 0 1]);
end
end
ylabel('一维样本数据值')
xlabel('样本序列')
说明:通过条件结构索引聚类标号在图上数据所在位置采用不同的颜色使用 text显示聚类标号,i,xx(i)是数据所在位置,num2str(idx(i))是将聚类标号转换为字符串才能在图中显示,'color',[* * *]是显示聚类标号的颜色,不同数字组合颜色不同,ylabel是在y轴标签,xlabel是x轴标签。
运行后的结果如下图所示。

7、“matlab对一维数据进行K-means聚类离散化并显示”完整程序如下:
%**************matlab对一维数据进行K-means聚类离散化并显示***********
clc;
clear;
yw_data=xlsread('一维数据样本.xlsx'); %读入一维数据样本到yw_data矩阵
xx=yw_data;
clus=4;
[idx,c]=kmeans(xx,clus);
cc1=[];
cc2=[];
cc3=[];
cc4=[];
[n,m]=size(xx);
for i=1:n
if idx(i)==1
cc1=[cc1;xx(i)];
elseif idx(i)==2
cc2=[cc2;xx(i)];
elseif idx(i)==3
cc3=[cc3;xx(i)];
elseif idx(i)==4
cc4=[cc4;xx(i)];
end
end
disp('第一类边界')
[min(cc1),max(cc1)]
disp('第二类边界')
[min(cc2),max(cc2)]
disp('第三类边界')
[min(cc3),max(cc3)]
disp('第四类边界')
[min(cc4),max(cc4)]
disp('四类中心')
c
h1=plot(xx,'w');grid on;hold on;
for i=1:n
if idx(i)==1
text(i,xx(i),num2str(idx(i)),'color',[1 0 0]);
elseif idx(i)==2
text(i,xx(i),num2str(idx(i)),'color',[0 1 0]);
elseif idx(i)==3
text(i,xx(i),num2str(idx(i)),'color',[0 0 1]);
elseif idx(i)==4
text(i,xx(i),num2str(idx(i)),'color',[1 0 1]);
end
end
ylabel('一维样本数据值')
xlabel('样本序列')
