马上就要数学建模国赛了,趁还有几天整理一下代码,到时候方便自己使用。主要参考司守奎的《数学建模算法与应用》,matlab是2020版本。
目录
本例主要摘自司守奎《数学建模算法与应用》第3版p271页的例题,数据取了前9行,所以结果会和书里的不大一样,到时候跟据题目修改自己需要的数据即可。
简单说明一下聚类分析,聚类分析又称群分析,聚类分析分为Q型聚类分析和R型聚类分析。其中,Q型聚类分析是对样本进行分类;R型聚类分析是对指标进行分类。
一、数据
下表数据就是等会matlab需要用的data。
地区 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 |
北京 | 5.96 | 310 | 461 | 1557 | 931 | 319 | 44.36 | 2615 | 2.2 | 13631 |
上海 | 3.39 | 234 | 308 | 1035 | 498 | 161 | 35.02 | 3052 | 0.9 | 12665 |
天津 | 2.35 | 157 | 229 | 713 | 95 | 109 | 38.4 | 3031 | 0.86 | 9385 |
陕西 | 1.35 | 81 | 111 | 364 | 150 | 58 | 30.45 | 2699 | 1.22 | 7881 |
辽宁 | 1.5 | 88 | 128 | 421 | 144 | 58 | 34.3 | 2808 | 0.54 | 7733 |
吉林 | 1.67 | 86 | 120 | 370 | 153 | 58 | 33.53 | 2215 | 0.76 | 7480 |
黑龙江 | 1.17 | 61 | 93 | 296 | 117 | 44 | 35.22 | 2528 | 0.58 | 8570 |
湖北 | 1.05 | 67 | 92 | 297 | 115 | 43 | 32.89 | 2835 | 0.66 | 7262 |
江苏 | 0.95 | 64 | 94 | 287 | 102 | 39 | 31.54 | 3008 | 0.39 | 7786 |
二、R型聚类
代码
%R型聚类
a=data;
b=zscore(a); %数据标准化
r=corrcoef(b); %计算相关系数矩阵
%d=(1-r);d=nonzeros(d)'; %另外一种计算矩阵方法
z=linkage(b','average','correlation'); %按类平均法聚类
h=dendrogram(z); %画聚类图
set(h,'Color','k','LineWidth',1.3); %把聚类图线的颜色改成黑色,线宽加粗
T=cluster(z,'maxclust',6); %把变量划分为6类
for i=1:6
tm=find(T==i);
fprintf('第%d类的有%s\n',i,int2str(tm'));
end
结果
第1类的有10
第2类的有1 2 3 4 6
第3类的有5
第4类的有7
第5类的有9
第6类的有8
三、Q型聚类
代码
%Q型聚类
a=data;
a(:,[3:6])=[]; %根据自己情况选择需要的指标,本例只需要x1,x2,x7,x8,x9,x10
b=zscore(a); %数据标准化
z=linkage(b,'average'); %按类平均法聚类
h=dendrogram(z); %画聚类图
set(h,'Color','k','LineWidth',1.3) %把聚类图线的颜色改成黑色,线宽加粗
for k=3:5
fprintf('划分成%d类的结果如下:\n',k);
T = cluster(z,'maxclust',k);
for i = 1:k
tm=find(T==i);%求第i类的对象
fprintf('第%d类的有%s\n',i,int2str(tm')); %显示分类结果
end
fprintf('**********************\n');
end
结果
划分成3类的结果如下:
第1类的有2 3
第2类的有4 5 6 7 8 9
第3类的有1
**********************
划分成4类的结果如下:
第1类的有6 7
第2类的有4 5 8 9
第3类的有2 3
第4类的有1
**********************
划分成5类的结果如下:
第1类的有2
第2类的有3
第3类的有6 7
第4类的有4 5 8 9
第5类的有1
**********************