一、實驗目的

如果您以前從未使用過樹狀圖,那麼使用樹狀圖是檢視多維資料如何聚集在一起的好方法。 在這本筆記本中,我將簡單探索透過層次分析,藉助樹狀圖將其視覺化。

二、層次分析

層次分析是聚類分析的一種,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()

使用樹狀圖做層次聚類分析(Python)

#移除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()

#在圖中顯示的數字是最細粒度的葉子,相當於每個樣本資料點。

使用樹狀圖做層次聚類分析(Python)

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’)

使用樹狀圖做層次聚類分析(Python)

#average

hierarchy_analysis(samples,method=‘average’)

使用樹狀圖做層次聚類分析(Python)

#complete

hierarchy_analysis(samples,method=‘complete’)

使用樹狀圖做層次聚類分析(Python)

由於資料量比較少,complete和average方法做出來的圖完全一樣。

備註:本文只作學習用,如有侵權,聯絡刪除

資料及程式碼獲取

連結:

https://

pan。baidu。com/s/14jREwH

EA3YN3LIrEHJOGhg

密碼: 69s7

原文連結:使用樹狀圖做層次聚類分析