一、實驗目的
如果您以前從未使用過樹狀圖,那麼使用樹狀圖是檢視多維資料如何聚集在一起的好方法。 在這本筆記本中,我將簡單探索透過層次分析,藉助樹狀圖將其視覺化。
二、層次分析
層次分析是聚類分析的一種,scipy有這方面的封裝包。
linkage函式從字面意思是連結,層次分析就是不斷連結的過程,最終從n條資料,經過不斷連結,最終聚合成一類,演算法就此停止。
dendrogram是用來繪製樹形圖的函式。
三、實驗資料
grain_variety是標籤,其他列為多種屬性的值(特徵)。
from scipy。cluster。hierarchy import linkage, dendrogram
import matplotlib。pyplot as plt
import pandas as pd
seeds_df = pd。read_csv(‘seeds-less-rows。csv’)
seeds_df。head()
#移除grain_variety
varieties = list(seeds_df。pop(‘grain_variety’))
varieties
[‘Kama wheat’,
‘Kama wheat’,
‘Kama wheat’,
‘Rosa wheat’,
‘Rosa wheat’,
‘Rosa wheat’,
‘Rosa wheat’,
‘Rosa wheat’,
‘Canadian wheat’,
‘Canadian wheat’,
‘Canadian wheat’,
‘Canadian wheat’,
‘Canadian wheat’,
‘Canadian wheat’]
#檢視seeds_df資料
samples = seeds_df。values
print(samples)
print(‘samples的維度’,samples。shape)
[[14。88 14。57 0。8811 5。554 3。333 1。018 4。956 ]
[14。69 14。49 0。8799 5。563 3。259 3。586 5。219 ]
[14。03 14。16 0。8796 5。438 3。201 1。717 5。001 ]
[19。31 16。59 0。8815 6。341 3。81 3。477 6。238 ]
[17。99 15。86 0。8992 5。89 3。694 2。068 5。837 ]
[18。85 16。17 0。9056 6。152 3。806 2。843 6。2 ]
[19。38 16。72 0。8716 6。303 3。791 3。678 5。965 ]
[17。36 15。76 0。8785 6。145 3。574 3。526 5。971 ]
[13。32 13。94 0。8613 5。541 3。073 7。035 5。44 ]
[11。43 13。13 0。8335 5。176 2。719 2。221 5。132 ]
[11。26 13。01 0。8355 5。186 2。71 5。335 5。092 ]
[12。46 13。41 0。8706 5。236 3。017 4。987 5。147 ]
[11。81 13。45 0。8198 5。413 2。716 4。898 5。352 ]
[11。23 12。88 0。8511 5。14 2。795 4。325 5。003 ]]
samples的維度 (14, 7)
四、使用linkage對samples進行層次聚類
X = linkage(y, method=‘single’, metric=‘euclidean’)
sacipy中y是距離矩陣,我對此只是傻傻的理解成特徵矩陣。 矩陣是(m*n) ,其中m行代表m條記錄,n代表n個特徵
返回結果X是(m-1)*4的矩陣。 具體含義請看下面的案例
mergings = linkage(samples)
#我們發現mergings比samples小1
print(‘sample維度’,samples。shape)
print(‘mergings維度’,mergings。shape)
sample維度 (14, 7)
mergings維度 (13, 4)
#層次分析視覺化,leaf的字型不旋轉,大小為10。
#這裡我們不顯示每一條資料的具體名字標籤(varieties),預設以數字標籤顯示
dendrogram(mergings,
leaf_rotation=0,
leaf_font_size=10)
plt。show()
#在圖中顯示的數字是最細粒度的葉子,相當於每個樣本資料點。
mergings
array([[ 3。 , 6。 , 0。37233454, 2。 ],
[11。 , 12。 , 0。77366442, 2。 ],
[10。 , 15。 , 0。89804259, 3。 ],
[ 5。 , 14。 , 0。90978998, 3。 ],
[13。 , 16。 , 1。02732924, 4。 ],
[ 0。 , 2。 , 1。18832161, 2。 ],
[ 4。 , 17。 , 1。28425969, 4。 ],
[ 7。 , 20。 , 1。62187345, 5。 ],
[ 1。 , 19。 , 2。02587613, 3。 ],
[ 9。 , 18。 , 2。13385537, 5。 ],
[ 8。 , 23。 , 2。323123 , 6。 ],
[22。 , 24。 , 2。87625877, 9。 ],
[21。 , 25。 , 3。12231564, 14。 ]])
層次分析圖從上到下看,依次是枝和葉。
第一列和第二列代表類標籤,包含葉子和枝子。
第三列代表葉葉(或葉枝,枝枝)之間的距離
第四列代表該層次類中含有的樣本數(記錄數)
五、不同的層次聚類演算法
X = linkage(y, method=‘single’, metric=‘euclidean’)
method是指計算類間距離的方法,比較常用的有3種:
(1)single:最近鄰,把類與類間距離最近的作為類間距
(2)average:平均距離,類與類間所有pairs距離的平均
(3)complete:最遠鄰,把類與類間距離最遠的作為類間距
我們寫曾側分析法函式,看看不同的method從圖中有什麼區別
def hierarchy_analysis(samples,method=‘single’):
mergings = linkage(samples, method=method)
dendrogram(mergings,
labels=varieties,
leaf_rotation=45,
leaf_font_size=10)
plt。show()
#single
hierarchy_analysis(samples,method=‘single’)
#average
hierarchy_analysis(samples,method=‘average’)
#complete
hierarchy_analysis(samples,method=‘complete’)
由於資料量比較少,complete和average方法做出來的圖完全一樣。
備註:本文只作學習用,如有侵權,聯絡刪除
資料及程式碼獲取
連結:
https://
pan。baidu。com/s/14jREwH
EA3YN3LIrEHJOGhg
密碼: 69s7
原文連結:使用樹狀圖做層次聚類分析