matlab中的聚类算法

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('标准距离');
  • 11
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值