用MATLAB做聚类分析

摘要:
使用MATLAB进行聚类分析最近的工作关系使用MATLAB进行聚类分析。所谓的聚类分析旨在将研究的数据样本分成不同的类别。Matlab的统计工具箱提供了相应的分析工具。page_ ID=78赵福峰的分层聚类:http://hi.baidu.com/neuxxm01/item/6337bdb3b7f26c74254b0991这两个博客倾向于分析聚类算法,因为聚类分析可以归类为计算机人工智能领域的无监督学习。这个例子也是一个经典的聚类分析案例——IRIS数据的聚类分析。相关材料可以在Mathworks的主页上找到。地址:Matlab的聚类分析工具:http://www.mathworks.cn/cn/help/stats/cluster-analysis.html本文重点介绍如何使用Matlab进行聚类分析。

用MATLAB做聚类分析

期工作关系用到Matlab做聚类分析。所谓聚类分析,其目的在于将研究的数据样本划分为不同类别。Matlab的统计工具箱提供了相应的分析工具。相关概念在网上可以找到不少资料,这里推荐两个博客供大家参考。

pluskid的漫谈 Clustering 系列:http://blog.pluskid.org/?page_id=78

赵扶风的层次聚类:http://hi.baidu.com/neuxxm01/item/6337bdb3b7f26c74254b0991

两个博客多倾向于聚类算法的分析,因为聚类分析可划归为计算机人工智能领域里面无监督的学习。这里不打算就算法进行深入,需要的读者可去咨询上面两位牛人。个人觉得漫谈系列讲解较通俗易懂,赵扶风的可当做进阶。

本文中的例子较接近pluskid的漫谈系列。Matlab本身带有Cluster分析的例子。该例子也是经典的聚类分析案例——对IRIS数据聚类分析。可在Mathworks的主页找到相关资料,地址:

Matlab的Cluster分析工具:http://www.mathworks.cn/cn/help/stats/cluster-analysis.html

本文重点是展示如何用Matlab来进行聚类分析。如果有需要解答的问题请留言,笔者会尽其所能地回答。


内容



展示如何使用MATLAB进行聚类分析

分别运用分层聚类、K均值聚类以及高斯混合模型来进行分析,然后比较三者的结果

生成随机二维分布图形,三个中心

% 使用高斯分布(正态分布)
% 随机生成3个中心以及标准差
s = rng(5,'v5normal');
mu = round((rand(3,2)-0.5)*19)+1;
sigma = round(rand(3,2)*40)/10+1;
X = [mvnrnd(mu(1,:),sigma(1,:),200); ...
mvnrnd(mu(2,:),sigma(2,:),300); ...
mvnrnd(mu(3,:),sigma(3,:),400)];
% 作图
P1 = figure;clf;
scatter(X(:,1),X(:,2),10,'ro');
title('研究样本散点分布图')
用MATLAB做聚类分析第1张

K均值聚类

% 距离用传统欧式距离,分成两类
[cidx2,cmeans2,sumd2,D2] = kmeans(X,2,'dist','sqEuclidean');
P2 = figure;clf;
[silh2,h2] = silhouette(X,cidx2,'sqeuclidean');

从轮廓图上面看,第二类结果比较好,但是第一类有部分数据表现不佳。有相当部分的点落在0.8以下。

用MATLAB做聚类分析第2张

分层聚类

eucD = pdist(X,'euclidean');
clustTreeEuc = linkage(eucD,'average');
cophenet(clustTreeEuc,eucD);

P3 = figure;clf;
[h,nodes] =dendrogram(clustTreeEuc,20);
set(gca,'TickDir','out','TickLength',[.002 0],'XTickLabel',[]);

可以选择dendrogram显示的结点数目,这里选择20 。结果显示可能可以分成三类
用MATLAB做聚类分析第3张

重新调用K均值法

改为分成三类

[cidx3,cmeans3,sumd3,D3] = kmeans(X,3,'dist','sqEuclidean');
P4 = figure;clf;
[silh3,h3] = silhouette(X,cidx3,'sqeuclidean');

图上看,比前面的结果略有改善。

用MATLAB做聚类分析第4张

将分类的结果展示出来

P5 = figure;clf
ptsymb = {'bo','ro','go',',mo','c+'};
MarkFace = {[0 0 1],[.8 0 0],[0 .5 0]};
hold on
for i =1:3
clust = find(cidx3 == i);
plot(X(clust,1),X(clust,2),ptsymb{i},'MarkerSize',3,'MarkerFace',MarkFace{i},'MarkerEdgeColor','black');
plot(cmeans3(i,1),cmeans3(i,2),ptsymb{i},'MarkerSize',10,'MarkerFace',MarkFace{i});
end
hold off
用MATLAB做聚类分析第5张

运用高斯混合分布模型进行聚类分析

分别用分布图、热能图和概率图展示结果 等高线

% 等高线
options = statset('Display','off');
gm = gmdistribution.fit(X,3,'Options',options);

P6 = figure;clf
scatter(X(:,1),X(:,2),10,'ro');
hold on
ezcontour(@(x,y) pdf(gm,[x,y]),[-15 15],[-15 10]);
hold off

P7 = figure;clf
scatter(X(:,1),X(:,2),10,'ro');
hold on
ezsurf(@(x,y) pdf(gm,[x,y]),[-15 15],[-15 10]);
hold off
view(33,24)

热能图
cluster1 = (cidx3 == 1);
cluster3 = (cidx3 == 2);
% 通过观察,K均值方法的第二类是gm的第三类
cluster2 = (cidx3 == 3);
% 计算分类概率
P = posterior(gm,X);
P8 = figure;clf
plot3(X(cluster1,1),X(cluster1,2),P(cluster1,1),'r.')
grid on;hold on
plot3(X(cluster2,1),X(cluster2,2),P(cluster2,2),'bo')
plot3(X(cluster3,1),X(cluster3,2),P(cluster3,3),'g*')
legend('第 1 类','第 2 类','第 3 类','Location','NW')
clrmap = jet(80); colormap(clrmap(9:72,:))
ylabel(colorbar,'Component 1 Posterior Probability')
view(-45,20);
% 第三类点部分概率值较低,可能需要其他数据来进行分析。

% 概率图
P9 = figure;clf
[~,order] = sort(P(:,1));
plot(1:size(X,1),P(order,1),'r-',1:size(X,1),P(order,2),'b-',1:size(X,1),P(order,3),'y-');
legend({'Cluster 1 Score' 'Cluster 2 Score' 'Cluster 3 Score'},'location','NW');
ylabel('Cluster Membership Score');
xlabel('Point Ranking');
用MATLAB做聚类分析第6张用MATLAB做聚类分析第7张用MATLAB做聚类分析第8张用MATLAB做聚类分析第9张

通过AIC准则寻找最优的分类数

高斯混合模型法的最大好处是给出分类好坏的标准

AIC = zeros(1,4);
NlogL = AIC;
GM = cell(1,4);
for k = 1:4
GM{k} = gmdistribution.fit(X,k);
AIC(k)= GM{k}.AIC;
NlogL(k) = GM{k}.NlogL;
end
[minAIC,numComponents] = min(AIC);
按AIC准则给出的最优分类数为: 3对应的AIC值为: 8647.63

后记

(1)pluskid指出K均值算法的初值对结果很重要,但是在运行时还没有发现类似的结果。也许Mathworks对该算法进行过优化。有时间会仔细研究下代码,将结果放上来。

免责声明:文章转载自《用MATLAB做聚类分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zookeeper 启动显示started,jps查看进程却没有,解决方法Android通过流播放声音下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

视觉词袋模型(BOVW)

一、介绍 Bag-of-words model (BoW model) 最早出现在神经语言程序学(NLP)和信息检索(IR)领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达一段文字或一个文档. 近年来, BoW模型被广泛应用于计算机视觉中. 与应用于文本的BoW类比, 图像的特征(feature)被当作单词(Word),把图像“...

使用HDBSCAN 算法对分子聚类

对分子进行聚类分析,首先必须要考虑的是其描述符的问题,分子描述符通常是非常高维的,必须对其进行降维才好继续后面的分析,特别分子量特别大的时候。常用的降维手段有PCA,TSNE和UMAP.一说,TSNE用于可视化. 聚类的方法有许多,比如k-means,层次聚类. 但是这两个一个需要定义k,一个需要定义阈值,这样需要试错法合理进行着两个量的设置,不是很方便....

VC中使用Matlab Engine出现"无法找到libeng.dll"的问题

VC中使用Matlab Engine出现"无法找到libeng.dll"的问题 本以为使这个原因 ,其实不是我2了 #include "engine.h" //终于知道为什吗老是找不到那个库文件--是因为添加的头文件是以引号括起来的啊 //#include <engine.h> 不是因为环境变量没有生效的缘故 其实目前来说应该是这个问题no c...

matlab 工具函数(一) —— 添加指定 SNR 的噪声

SNR=PsignalPnoise=10⋅log10∑x=1Nx∑y=1Nyf2(x,y)∑x=1Nx∑y=1Ny(f(x,y)−f^(x,y))2=20⋅log10∥f(x,y)∥∥f^(x,y)−f(x,y)∥=20⋅log10∥f(x,y)∥∥noise∥ 根据信噪比(SNR)的值,是可以推知 noise 的: ∥noise∥=∥f(x,y)∥1...

R学习之R层次聚类方法(tm包)

1、距离计算  ## method for class 'TermDocumentMatrix' dissimilarity(x, y = NULL, method) ## method for class 'PlainTextDocument' dissimilarity(x, y = NULL, method) 参数说明:    x:文档-词矩阵或...

【转】 MATLAB界面程序实例学习

下面请跟我一步一步做一个图像处理的程序,如果您坚持做完这个实例,我想MATLAB界面编程对您而言,就没有什么难度了。当然,我这里说的是,您首先要有一定的MATLAB编程基础。还有,我的MATLAB版本是2008a。在2008a以前的版本中没有工具栏编辑器,如果需要工具栏要手动写程序,这个我就不多讲了。好了,废话少说,跟我来吧!在MATLAB的命令窗口(Co...