聚类分析在SPSS、Matlab与R中的实现(转载: Liu Xuhua 机会的数学 )
原文:https://mp.weixin.qq.com/s/1aBlwX11cBxw0sxONaHJRQ
筆記:修改后代碼
①
a<-scan()
7.90 39.77 ?8.49 12.94 19.27 11.05 2.04 13.29
7.68 50.37 11.35 13.30 19.25 14.59 2.75 14.87
9.42 27.93 ?8.20 ?8.14 16.17 ?9.42 1.55 ?9.76
9.16 27.98 ?9.01 ?9.32 15.99 ?9.10 1.82 11.35
10.06 28.64 10.52 10.05 16.18 ?8.39 1.96 10.81
provinceData<-matrix(a,5)
rownames(provinceData)<-c("遼寧","浙江",'河南','甘肅','青海')
d<-dist(provinceData,method="euclidean",diag=T,upper=F,p=2) ;d
HC<-hclust(d,method="complete")?
library(showtext)
plot(HC,hang=-1) ?#hang是表明譜系圖中各類所在的位置
showtext_begin()
re4<-rect.hclust(HC,k=2,border="green");
showtext_end()
②
a<-scan()
99.00 98.00 78.00 80.00
88.00 89.00 89.00 90.00
79.00 80.00 95.00 97.00
89.00 78.00 81.00 82.00
75.00 78.00 95.00 96.00
60.00 65.00 85.00 88.00
79.00 87.00 50.00 51.00
75.00 76.00 88.00 89.00
60.00 56.00 89.00 90.00
100.00 100.00 85.00 84.00
score.data<-matrix(a,10)
colnames(score.data)<-c('數學','物理','語文','政治')
corMat<-cor( ? score.data[,c(1,2,3,4)] ? ?)
d<- ? as.dist( ? 1-corMat^2 ? )
hc<-hclust( ? d,method="average" ? )
③
companyData<-scan()
80.00 ?85.00 ? 75.00 ? 90.00
85.00 ? 85.00 ? 90.00 ? 90.00
85.00 ? 85.00 ? 86.00 ? 60.00
90.00 ? 90.00 ? 75.00 ? 90.00
99.00 ? 98.00 ? 78.00 ? 80.00
88.00 ? 89.00 ? 89.00 ? 90.00
79.00 ? 80.00 ? 95.00 ? 97.00
89.00 ? 78.00 ? 81.00 ? 82.00
75.00 ? 78.00 ? 95.00 ? 96.00
60.00 ? 65.00 ? 85.00 ? 88.00
79.00 ? 87.00 ? 50.00 ? 51.00
75.00 ? 76.00 ? 88.00 ? 89.00
60.00 ? 56.00 ? 89.00 ? 90.00
100.00 ?100.00 ? 85.00 ? 84.00
61.00 ? 64.00 ? 89.00 ? 60.00
companyData<-matrix(companyData,,4)
colnames(companyData)<-c('組織文化' ,'組織氛圍' ,'領導角色','員工發展')
KM<-kmeans(companyData[,c(1,2,3,4)],3,nstart=3,algorithm="Hartigan-Wong") ;KM
?
1、引言
? ? ? ? 聚類分析是一種經典的多元數據分析方法,在各領域有著廣泛的應用,其統計思想及數學過程在各種多元統計分析教材中都有詳細介紹。該方法在軟件中的實現也散布于各類教材及網上的博文中,筆者在本文中總結了聚類分析方法在三種常用軟件:SPSS、Matlab與R中的實現,通過幾個簡單的數據實例介紹各種軟件的具體分析過程,供讀者參考,三種軟件各有優劣,讀者可根據自身情況加以選擇使用。說明:下文所用數據在許多教材和網上博文中都可見到,原始出處已無從追溯,故不再說明來源。
2、系統聚類法
2.1 ?樣本聚類
例1:為了研究遼寧等5省區某年城鎮居民生活消費的分布規律,根據調查資料做類型劃分。
2.1.1 ?在SPSS中的實現
? ? ? ? 在SPSS中通過點擊菜單選項的方式分以下幾步實現聚類過程:
打開數據文件,點擊菜單Analyze —> Classify —> Hierarchical cluster。
將變量province輸入Label cases by對應的框中,變量X1-X8輸入variables框中,cluster選項框默認選擇Cases,即對樣品聚類。
單擊Statistics,出現對話框,選擇Agglomeration schedule輸出聚類過程表和Proximity matrix關系矩陣。不事先確定分類數的話在Cluster membership下默認第一項,事先確定類數的話可選擇第二項并輸入相應類數,然后單擊Continue。
單擊Plots,出現對話框,選擇Dendrogram系統樹圖。Icicle(冰柱圖)選擇All clusters,Orientation選擇Vertical,單擊Continue。
單擊Method,出現對話框,此對話框設置樣本點間距離和類間距離計算方法,以及是否對原始數據進行變換等。此處我們對樣本點間距離使用平方歐氏距離,類間距離用Furthest neighbor計算,不做其他數據變換,單擊Continue。
上一步結束后返回對話框,單擊OK,此時出現結果輸出頁面。下面依次是主要輸出結果,下圖是距離矩陣,按前述設置計算的樣本點間距離。
下面三個圖表分別是輸出的聚類過程表,冰柱圖和譜系圖。
結論:從冰柱圖、譜系圖看,本問題分成兩類是比較合適的,即河南、青海、甘肅為一類;浙江、遼寧為一類。
2.1.2 ?在Matlab中的實現
Matlab中實現系統聚類主要有三個命令,分別是pdist(),linkage()和dendrogram()。
其中pdist()函數計算樣品間距離,得到的結果為一距離向量,分別是(2,1),(3,1),…,(n,1),(3,2),…,(n,2),…,(n,n-1)對樣品間的距離;
linkage()函數利用指定的方法,如最短距離,最長距離,平均距離等建立系統聚類樹;
最后由den?drogram()函數畫出聚類樹形圖。代碼如下:
%%系統聚類法 provinceData=[7.90?39.77 8.49?12.94 19.27 11.05 2.04?13.29; 7.68? 50.37 ?11.35? 13.30 ?19.25? 14.59? 2.75 ??14.87; 9.42? 27.93 ?8.20? ?8.14 ??16.17? 9.42 ??1.55 ??9.76; 9.16 ?27.98 ?9.01 ??9.32 ??15.99? 9.10 ??1.82 ??11.35; 10.06 28.64 ?10.52? 10.05 ?16.18? 8.39 ??1.96 ??10.81];%pdist()函數計算樣品間距離,得到的結果為一距離向量d1=pdist(provinceData); %計算距離方法默認為歐氏距離,即`euclidean`, ? %其他可選項有'cityblock','minkowski'等 ?D1=squareform(d1);%距離向量轉換為矩陣形式%linkage()函數利用指定的方法,如最短距離,最長距離,平均距離等建立系統聚類樹z1=linkage(d1,'complete');%疑問:這里是d1還是轉化為矩陣的D1? %根據指定類間距離計算方法計算類間距離, %可選項有'singe','centroid','ward','average'等 ?varlabel={'遼寧','浙江','河南','甘肅','青海'};%在聚類圖上給相應樣品命名 %den drogram()函數畫出聚類樹形圖H1=dendrogram(z1,'labels',varlabel)Matlab還可輸出不同分類數下樣品所在類的結果,即?
T1=cluster(z1,2) ?%其中2是分類數,輸出每個樣品的分類結果find(T1==1) ?%找出屬于某個類的樣品編號,此處為輸出第一類樣品序號關于聚類效果的優劣,Matlab還提供了一個cophenet()命令,用以計算系統聚類樹的Cophenetic相關系數,該系數可用來對比各種不同的距離計算和不同的類間距離定義下的聚類效果,該值越接近于1,表明聚類效果越好。很多情形下,不同距離的計算方法對該系數值影響較小。
2.1.3 ?在R中的實現
?R中實現系統聚類主要命令,分別是dist()、hclust(),和Matlab中的pdist()、linkage()功能基本一致,最后由plot()函數畫出聚類樹形圖。
provinceData<-read.table("E:/Datasource4R/provinceData.txt",header=T)
provinceData<-as.matrix(? ? provinceData [ , c(-1) ]? ? ? ? ?)
rownames? ? ? (provinceData)<-c("遼寧","浙江",'河南','甘肅','青海')
d<-? ? dist(? ? ?provinceData,method="euclidean",diag=T,upper=F,p=2? ? ?)?
HC<-hclust(? ? d,method="complete"? ? ? ? )?
showtext_begin()
plot(HC,hang=-1) ?#hang是表明譜系圖中各類所在的位置
re4<-rect.hclust(? ? ?HC,k=2,border="green"? ? ? ? );
showtext_end()
R的作圖功能很強大,可以利用rect.hclust()函數在聚類圖上畫出事先指定的類數的分類情況,并用矩形框框起來,非常直觀。另外,利用R的ape包還可以畫其他類型的各種有意思的譜系圖,見下圖。橫向譜系圖、進化分枝圖、扇形譜系圖、unrooted譜系圖
2.2 ?變量聚類
?例2:為了研究學科之間的關系,根據學生成績對科目作聚類分析。
2.2.1 ?在SPSS中的實現
變量系統聚類與樣品系統聚類在SPSS中的實現步驟基本一致,除了在下述第二步中的選項由Cases變為Variables之外。在SPSS中通過點擊菜單選項的方式分以下幾步實現變量系統聚類過程:
1.打開數據文件,點擊菜單Analyze —> Classify —> Hierarchical cluster。
2.將4個變量輸入variables框中,在Cluster選項框中選擇Variables,表明要做變量聚類。
3.單擊Statistics,出現對話框,選擇Agglomeration schedule和Proximity matrix。不事先確定分類數的話在Cluster membership下默認第一項,事先確定類數的話可選擇第二項并輸入相應類數,然后單擊Continue。
4.單擊Plots,出現對話框,選擇Dendrogram。Icicle(冰柱圖)選擇All clusters,Orientation選擇Horizontal(Vertical亦可),單擊Continue。
5.單擊Method,出現對話框,此對話框設置樣本點間距離和類間距離計算方法,以及是否對原始數據進行變換等。此處我們對樣本點間距離使用Pearson系數,類間距離用Between-groups linkage方法,不做其他數據變換,單擊Continue。
6.上一步結束后返回對話框,單擊OK,此時出現結果輸出頁面。下面依次介紹一下主要輸出結果,圖21是距離矩陣和聚類過程表,按前述設置計算的樣本點間距離及并類過程。
7.下兩圖分別是輸出的冰柱圖和譜系圖。
2.2.2 ?在Matlab中的實現
Matlab中實現變量系統聚類與樣品系統聚類過程一致,下面直接給出代碼及結果。代碼如下:
%%變量系統聚類 scoreData=[99.00 98.00 78.00 80.00; 88.00 89.00 89.00 90.00; 79.00 80.00 95.00 97.00; 89.00 78.00 81.00 82.00; 75.00 78.00 95.00 96.00; 60.00 65.00 85.00 88.00; 79.00 87.00 50.00 51.00; 75.00 76.00 88.00 89.00; 60.00 56.00 89.00 90.00; 100.00 100.00 85.00 84.00]; ?%%1,2,3,4列分別對應數學、物理、語文、政治d1=pdist( scoreData','correlation' ) varlabel ={'數學','物理','語文','政治'};z1=linkage( d1,'average' )H2 = dendrogram( z1,0,'orientation','right','labels',varlabel )T1=cluster(z1,2) ?% 2是分類數 ?輸出每個變量的分類結果 find(T1==2) ?%% 找出屬于某個類的變量編號?
2.2.3 ?在R中的實現
R中實現變量系統聚類也與樣品系統聚類過程一致,不再詳述。
score.data<-read.table("E:/Datasource4R/scoreData.txt",header=T)corMat<-cor( score.data[,c(-1)] ) d<- as.dist( 1-corMat^2 ) hc<-hclust( d,method="average" )另外值得一提的是,利用R的corrplot包可以作出非常直觀的相關系數矩陣圖,作為分類的參考也很直觀。有Matlab愛好者也把這種圖的生成編成Matlab函數,并將代碼放在網上供大家下載,感興趣的讀者可以自行搜索。
3、K均值聚類法
例3:為研究不同公司的運營特點,調查了15個公司的組織文化、組織氛圍、領導角色和員工發展4方面的內容。現要將這15個公司按照其各自的特點進行分成4類,數據如下所示。
3.1 ?在SPSS中的實現
在SPSS中通過點擊菜單選項的方式分以下幾步實現k均值聚類過程:
打開數據文件,點擊菜單Analyze —> Classify —> K-Means cluster。
將變量“公司”輸入Label cases by對應的框中,其余4個變量輸入variables框中,Number of cluster選項框填4(即事先確定好的類數)。
單擊Iterate,出現對話框,填最大迭代次數,默認即可,然后單擊ontinue。
單擊Save,出現對話框,兩個選項都選上,單擊Continue。
單擊Options,出現對話框,如下圖選擇。
上一步結束后返回對話框,單擊OK,此時出現結果輸出頁面。下面依次是主要輸出結果,下圖是初始聚類中心和迭代歷史。
下兩圖分別是輸出的各個類的成員信息以及最終聚類中心等其他信息。
3.2 ?在Matlab中的實現
Matlab實現K均值聚類的命令如下:
companyData=[80.00 ?85.00 ? 75.00 ? 90.00;85.00 ? 85.00 ? 90.00 ? 90.00;85.00 ? 85.00 ? 86.00 ? 60.00; ? ? ? ? ? ?90.00 ? 90.00 ? 75.00 ? 90.00;99.00 ? 98.00 ? 78.00 ? 80.00;88.00 ? 89.00 ? 89.00 ? 90.00;79.00 ? 80.00 ? 95.00 ? 97.00;89.00 ? 78.00 ? 81.00 ? 82.00;75.00 ? 78.00 ? 95.00 ? 96.00;60.00 ? 65.00 ? 85.00 ? 88.00;79.00 ? 87.00 ? 50.00 ? 51.00;75.00 ? 76.00 ? 88.00 ? 89.00;60.00 ? 56.00 ? 89.00 ? 90.00;100.00 ?100.00 ??85.00 ? 84.00;61.00 ? 64.00 ? 89.00 ? 60.00];opts = statset('Display','final');[Idx,Ctrs,SumD,D] = kmeans(companyData,3,'Replicates',6,'Options',opts); %調用Kmeans函數 %Idx N*1的向量,存儲的是每個點的聚類標號 %Ctrs K*P的矩陣,存儲的是K個聚類質心位置 %SumD 1*K的和向量,存儲的是類間所有點與該類質心點距離之和 %D N*K的矩陣,存儲的是每個點與所有質心的距離;Matlab還提供了一個silhouette()函數用以繪制聚類輪廓圖,可根據圖判斷樣品的聚類合理性。
[S, H] = silhouette(companyData,Idx)?
3.3 ?在R中的實現
R中實現K均值聚類的代碼及輸出結果如下:
companyData<-? ?read.table("E:/Datasource4R/companyData.txt",header=T)
KM<-kmeans(companyData[,c(-1)],? ? ? 3,nstart=3,? ? ?algorithm="Hartigan-Wong")?
KM
## K-means clustering with 3 clusters of sizes 10, 3, 2
##?
## Cluster means:
## ? 組織文化 組織氛圍 領導角色 員工發展
## 1 86.00000 85.90000 85.10000 88.80000
## 2 60.33333 61.66667 87.66667 79.33333
## 3 82.00000 86.00000 68.00000 55.50000
##?
## Clustering vector:
## ?[1] 1 1 3 1 1 1 1 1 1 2 3 1 2 1 2
##?
## Within cluster sum of squares by cluster:
## [1] 2139.4000 ?622.6667 ?708.5000
## ?(between_SS / total_SS = ?60.8 %)
致謝原文:https://mp.weixin.qq.com/s/1aBlwX11cBxw0sxONaHJRQ
感謝上帝的帶領,祈求上帝使我長進,在基督里得著憐憫和恩惠。
總結
以上是生活随笔為你收集整理的聚类分析在SPSS、Matlab与R中的实现(转载: Liu Xuhua 机会的数学 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们写的程序就像我们的孩子
- 下一篇: 大数据与云计算技术周报(第150期)