一、實驗目的
如果您以前從未使用過樹狀圖,那麼使用樹狀圖是查看多維數據如何聚集在一起的好方法。 在這本筆記本中,我將簡單探索通過層次分析,藉助樹狀圖將其可視化。
二、層次分析
層次分析是聚類分析的一種,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/14jREwHEA3YN3LIrEHJOGhg 密碼: 69s7