MATLAB2009A实现Kmeans实例

来源:互联网 发布:mac电脑如何强制关机 编辑:程序博客网 时间:2024/06/06 02:54

本人刚学习数据挖掘没有多久,数据挖掘中要用不少聚类算法。Kmeans作为其中常用的一种算法,聚类效果还行。

  下面是我做了几个简单的MATLAB实现Kmeans的小实例

100*2列矩阵聚类成3类

 Matlab代码如下:

 

data=rand(100,2);

>> opts=statset('Display','final');

>>[idx,ctrs]=kmeans(data,3,'Distance','city','Replicates',5, 'Options',opts);

title('Kmeans实例');

>>plot(data(idx==1,1),data(idx==1,2),'r.',...

data(idx==2,1),data(idx==2,2),'b.',data(idx==3,1),data(idx==3,2),'g.',ctrs(:,1),ctrs(:,2),'kx');

 

效果图如下

图1.  100*2矩阵聚成3类图形

 

100*2列矩阵分四类实例

 

Matlab代码如下:

 

data=rand(100,2);

opts=statset('Display','final');

[idx,ctrs]=kmeans(data,4,'Distance','city','Replicates',5,'Options',opts);

title('Kmeans实例');

>>plot(data(idx==1,1),data(idx==1,2),'r.',...

data(idx==2,1),data(idx==2,2),'b.',data(idx==3,1),data(idx==3,2),'g.',...

data(idx==4,1),data(idx==4,2),'y.',ctrs(:,1),ctrs(:,2),'kx');

 

效果图如下:

图2.  100*2聚成4类图形

 

100*3矩阵聚成4类

 

Matlab代码如下:

 

data=rand(100,3);

>> opts=statset('Display','final');

>>[idx,ctrs]=kmeans(data,4,'Distance','city','Replicates',5, 'Options',opts);

plot3(data(idx==1,1),data(idx==1,2),data(idx==1,3),'r.',data(idx==2,1),...

data(idx==2,2),data(idx==2,3),'b.',data(idx==3,1),data(idx==3,2),data(idx==3,3),'g.',...

data(idx==4,1),data(idx==4,2),data(idx==4,3),'y.',ctrs(:,1),ctrs(:,2),ctrs(:,3),'kx')

>> grid on

效果图如下:


图3.  100*3聚类成4类效果图

 

 

问题:matlab可以画出的图形是二维和三维的,多维的图形不适合画也不好看。个人认为二维的图像聚类效果看起来最明显。但是现实处理时我们遇到的矩阵不是都是n*2的矩阵,怎样处理n*m维矩阵并显示到图像中是目前遇到的问题。

一个解决方案:

使用降阶reshape()函数,但这只是相当于将矩阵进行重排,这样做虽然会达到使矩阵维数下降,但会使各标签与关注的人对应关系被打乱。

 

另一个解决方案:

初始矩阵的维度控制在2-3维。虽然在matlab中是可以计算出多维矩阵的相应置心值,但却无法在图像上显示完整。

 

注:data(idx==1,1),data(idx==1,2),data(idx==1,3)中每个都是一列,代表坐标中的x,y,z。而维数由初始矩阵的列数决定。有几列就写几个。Idx代表聚类标号,plot3代表三维坐标,plot代表二维坐标,grid on代表加上网格线。Kmeans算法参数介绍见其他文档。

       MATLAB实现Kmeans等聚类算法需要先去下一些MATLAB工具包,我是在新浪爱问知识上下到的。希望对大家有所帮助,有错的地方请纠正。

 

原创粉丝点击