數學建模系列:聚類分析


聚類分析

顧名思義,“物以類聚”,簡單來說就是將具有相似個性的事物聚合分類。對樣本進行分類稱為Q型聚類,對指標進行分類稱為R型聚類分析。更詳細的內容可參考《數學建模算法與應用》(司守奎)這本書。

實例分析

Q型聚類分析(From the book)

如上,銷售員\(w_i(i=1,2,3,4,5)\)的銷售業績為\((v_{i1},v_{i2})\)。通過絕對值距離來測量點和點之間的距離,使用最短距離法類測量類與類之間的距離,即:

\[d(w_i,w_j)=\sum_{k=1}^{2}|v_{ik}-v_{jk}|,D(G_p,G_q)=\min\limits_{w_i \in G_p,w_j\in G_q} \{d(w_i,w_j)\} \]

由距離公式算出距離矩陣:

  1. 將所有的元素作為一個類\(H_1={w_1,w_2,w_3,w_4,w_5\\}\)。每個類的平台高度為0,即:\(f(w_i)=0,i=1,2,3,4,5\)。這時候\(D(G_p,G_q)=d(w_p,w_q)\)

  2. 分別取平台高度為1,2,3,4得到不同的分類情況,畫聚類圖:

matlab求解代碼:

%代碼1
clc,clear
a=[1,0;1,1;3,2;4,3;2,5];
[m,n]=size(a);
d=zeros(m);
d=mandist(a');  % mandist:求矩陣列向量組之間的兩兩絕對值距離
d=tril(d);  % 截取下三角元素
nd=nonzeros(d); %去除d中的零元素,非零元素按列排序
nd=union([],nd)  % 去掉重復的非零元素
for i = 1:m-1
    nd_min=min(nd);
	[row,col]=find(d==nd_min);
	tm=union(row,col); %row和col歸為一類
	tm=reshape(tm,1,length(tm));%將數組tm變為行向量
	fprintf('第%d次合成,平台高度為%d時的分類結果為:%s\n',i,nd_min,int2str(tm));
    nd(nd==nd_min)=[];%刪除已經歸類的元素
    if length(nd)==0
        break
    end
end

運行結果:

nd =

     1
     2
     3
     4
     5
     6
     
第1次合成,平台高度為1時的分類結果為:1  2
第2次合成,平台高度為2時的分類結果為:3  4
第3次合成,平台高度為3時的分類結果為:2  3
第4次合成,平台高度為4時的分類結果為:1  3  4  5
%代碼2
clc,clear
a=[1,0;1,1;3,2;4,3;2,5];
y=pdist(a,'cityblock'); % 求a得兩兩行向量之間得絕對距離
yc=squareform(y)  %變換成距離方陣
z=linkage(y)  %產生等級聚類樹
dendrogram(z)  %畫聚類圖
T=cluster(z,'maxclust',3) %把對象划分成3類
for i=1:3
	tm=find(T==i); %求第i類的對象
	tm=reshape(tm,1,length(tm)); %變成行向量
	fprintf('第%d類的有%s\n',i,int2str(tm)); %顯示分類結果
end

運行結果:

yc =

     0     1     4     6     6
     1     0     3     5     5
     4     3     0     2     4
     6     5     2     0     4
     6     5     4     4     0
z =

     1     2     1
     3     4     2
     6     7     3
     5     8     4
T =

     1
     1
     2
     2
     3

第1類的有1  2
第2類的有3  4
第3類的有5

R型聚類分析

我國各地區普通高等教育發展狀況分析

x1:每百萬人口高等院校數
x2:每10萬人口高等院校畢業生數
x3:每10萬人口高等院校招生數
x4:每10萬人口高等院校在校生數
x5:每10萬人口高等院校教職工數
x6:每10萬人口高等院校專職教師數
x7:高級職稱占專職教師的比例
x8:平均每所高等院校的在校生數
x9:國家財政預算內普通高教經費占國內生產總值的比例
x10:生均教育經費

Matlab程序求解

clc,clear
data=load('raw_data.txt');  % 加載原始數據
b=zscore(data);  %數據標准化
r=corrcoef(b); %計算相關系數矩陣
d=pdist(b','correlation'); %計算相關系數d導出的距離
z=linkage(d,'average')  %按類平均法聚類
h=dendrogram(z);  %畫聚類圖
set(h,'Color','k','LineWidth',1.3) %把聚類圖的顏色改成黑色,線寬加粗
T=cluster(z,'maxclust',6)  %把變量划分成6類
for i=1:6
    tm=find(T==i);  %求第i類的對象
    tm=reshape(tm,1,length(tm)); %變成行向量
    fprintf('第%d類的有:%s\n',i,int2str(tm));  %顯示分類結果
end

運行結果

z =

    3.0000    4.0000    0.0013
    5.0000    6.0000    0.0014
    2.0000   11.0000    0.0054
   12.0000   13.0000    0.0197
    1.0000   14.0000    0.0381
    9.0000   15.0000    0.1582
    7.0000    8.0000    0.2211
   10.0000   16.0000    0.3685
   17.0000   18.0000    0.6501


T =

     1
     2
     2
     2
     2
     2
     4
     5
     3
     6

第1類的有:1
第2類的有:2  3  4  5  6
第3類的有:9
第4類的有:7
第5類的有:8
第6類的有:10

可以從上得出結論:x2、x3、x4、x5、x6這5個指標具有較大相關性,被先聚集到一起,這樣就從10個指標中選中6個分析指標,然后通過這6個指標再對這30個地區進行Q型聚類分析。

Matalb求解代碼

clc,clear
load raw_data.txt
raw_data(:,[3,6])=[ ];
raw_data=zscore(raw_data);
y=pdist(raw_data);
z=linkage(y,'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);
        tm=reshape(tm,1,length(tm));
        fprintf('第%d類的有%s\n',i,int2str(tm));
    end
    if k==5
        break
    end
    fprintf('=======================\n');
end


運行結果:

划分成3類的結果如下:
第1類的有2  3
第2類的有4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
第3類的有1
=======================
划分成4類的結果如下:
第1類的有4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  26  27  28  29
第2類的有25  30
第3類的有2  3
第4類的有1
=======================
划分成5類的結果如下:
第1類的有25
第2類的有30
第3類的有4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  26  27  28  29
第4類的有2  3
第5類的有1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM