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

使用樹狀圖做層次聚類分析
一、實驗目的

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

二、層次分析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章