vlambda博客
学习文章列表

聚类算法及Matlab实现


matlab中的聚类算法在很多数模题目中都会使用到,今天小编对聚类算法的一些基本知识和代码进行总结。
在进行聚类结果的输出前,可以根据轮廓值的大小,来判断合适的聚类数。
1、kmeans聚类
kmeans聚类算法是一种根据初始点不断迭代,最后将数据聚类的过程。具体算法流程自行度娘。
在matlab中,可以很方便地调用kmeans函数来进行聚类。
最常用到的函数为[IDX,C]=kmeans(X,k);

调用参数:X为矩阵,矩阵的每一行表示一个点,每一列表示一个变量;
         k为聚类数;
返回参数:IDX为个体序号和类序号的对应关系;
在kmeans函数里,可以根据需要选择调用的参数
‘Distance’:聚类距离的度量方式
‘Start’:迭代初始点的选取方式
‘Replicates’:选取不同的初始点进行计算的次数,默认值为1
‘Options’:迭代的方式,需要创建一个statset变量,它包含如下两个参数
    ‘display’
    'MaxIter':最大迭代次数
2、层次聚类
层次聚类方法的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。该方法的优点是可随时停止划分
matlab中使用linkage函数创建系统聚类树
用dendrogram创建层次聚类树

下面给出一段matlab使用聚类的示例代码。

A=[79.95 75 80.45 78.15 76.25 71.95 75.85 71.85 76.6...
    77.05 71.85 67.85 68.9 74.55 75.4 70.65 79.55 74.9...
    74.3 77.2 77.8 75.2 76.65 74.7 78.3 77.8 70.9];
X=A';
%用kmeans算法确定最佳聚类数目
numc=15;
silh_m=zeros(1,numc);
for i=1:numc
    kidx=kmeans(X,i);
    silh=silhouette(X,kidx);%计算轮廓值
    silh_m(i)=mean(silh);
end
figure
plot(1:numc,silh_m,'o-')
xlabel('类别数');
ylabel('平均轮廓值');
title('不同类别对应的平均轮廓值');

%绘制2至5类时的平均值分布图
figure
for i=2:5
    kidx=kmeans(X,i);
    subplot(2,2,i-1);
    [~,h]=silhouette(X,kidx);%画出轮廓值
    title([num2str(i),'类时的轮廓值']);
    snapnow
    xlabel('轮廓值');
    ylabel('类别数');
end
%kmeans聚类过程,并将结果显示
[idx,ctr]=kmeans(X,4);
figure
F1=plot(find(idx==1),A(idx==1),'r--*',...
    find(idx==2),A(idx==2),'b:o',...
    find(idx==3),A(idx==3),'k:o',...
    find(idx==4),A(idx==4),'g:d');
set(gca,'linewidth',2);
set(F1,'linewidth',2,'MarkerSize',8);
xlabel('编号');
ylabel('得分');
title('聚类结果');
%层次聚类的聚类过程
Y=pdist(X);%计算样本点间的欧式距离
Z=linkage(Y,'average');
cn=size(X);
clabel=1:cn;
clabel=clabel';
figure
F2=dendrogram(Z);
title('层次聚类法聚类结果');
set(F2,'linewidth',2);
ylabel('标准距离');

也欢迎加入2021数学建模竞赛备战群:513094786,一起迎接国赛,竞赛交流学习