層次聚類-scipy實現

一、主要函數

1. linkage()

執行層次/彙集聚類算法

scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)數組

參數:bash

  • y:能夠是一維的凝聚聚類矩陣或者是2維的觀測矢量數組。壓縮(凝聚)距離矩陣是包含距離矩陣上三角的平面陣列。這是pdist返回的形式。也能夠是mn維的觀測矢量構成的mxn的數組。若爲壓縮距離矩陣的全部元素必須是有限的,即沒有NaNinfs
  • methodstr,可選。要使用的連接算法。
  • metricstr或函數,可選。在y是觀察向量集合的狀況下使用的距離度量;不然忽略。
  • optimal_orderingbool,可選。若是爲True,則將對連接矩陣進行從新排序,以使連續的葉子之間的距離最小,當可視化數據時,這將致使更直觀的樹結構。默認爲False,由於此算法可能很慢,尤爲是在大型數據集上。另請參見optimum_leaf_ordering函數。

返回值數據結構

(n-1)x4的矩陣,分層聚類編碼爲連接矩陣。ide

該矩陣表示樹狀圖,其中第一個和第二個元素是每一個步驟中合併的兩個聚類,第三個元素是這些聚類之間的距離,第四個元素是新聚類的大小-包含的原始數據點數。函數

method方法:優化

  • singled(u,v)=min(dist(u[i], v[j])),這也稱爲最近點算法
  • completed(u,v)=max(dist(u[i],v[j])),也被稱爲Farthest Point算法或Voor Hees算法
  • averaged(u,v)=\sum_{ij} \frac{d(u[i],v[j])}{|u|*|v|},這也稱爲UPGMA算法
  • weightedd(u,v)=(dist(s,v)+dist(t,v))/2,這也叫作WPGMA
  • centroiddist(s,t)=\parallel c_s-c_t\parallel_2,也被稱爲UPGMC算法
  • mediand(s,t)centroid方法相同,當兩個簇st被結合爲一個簇ust的質心平均值給出新質心u,這也稱爲WPGMC算法
  • ward:使用Ward方差最小化算法,

請注意 編碼

  • 對於「single」方法,實現了基於最小生成樹的優化算法。它具備時間複雜度O(n^2)。對於「complete」,「average」,「weighted」和「ward」方法,將執行稱爲最近鄰居鏈的算法。它還具備時間複雜度O(n^2)。對於其餘方法,採用O(n^3)時間複雜度的樸素算法。全部算法都使用O(n^2)內存。
  • 僅當使用歐幾里德成對度量標準時,才正肯定義方法「centroid」「median」「ward」。若是將y做爲預先計算的成對距離傳遞,則用戶有責任確保這些距離其實是歐幾里得,不然產生的結果將不正確。

示例:idea

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt

X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
Z = linkage(X, 'ward')
fig = plt.figure(figsize=(25, 10))
dn = dendrogram(Z)
plt.show()
複製代碼

2. pdist()

n維空間中觀察值之間的成對距離。spa

scipy.spatial.distance.pdist(X, metric='euclidean', *args, **kwargs)[source]

參數:

  • X:ndarray,一個mxn的數組
  • metric:str或函數,可選,使用的距離度量。距離函數能夠是braycurtis, canberra, chebyshev, cityblock, correlation, cosine, dice, euclidean, hamming, jaccard, jensenshannon, kulsinski, mahalanobis, matching, minkowski, rogerstanimoto, russellrao, seuclidean, sokalmichener, sokalsneath, sqeuclidean, yule
  • *args:tuple,不推薦使用,其餘參數應做爲關鍵字參數傳遞
  • **kwargs:dict,可選。metric額外的參數。具體可參考相應的mertic文檔。一部分可能的參數:

返回值:

  • Y:ndarray,返回一個簡化的距離矩陣Y,對於每一個ij(其中i <j <m),其中m是原始觀測值的數量。計算度量dist(u = X [i],v = X [j])並將其存儲在條目ij中。

如下是常見的調用約定:

  1. Y=pdist(X, 'euclidean')

    使用歐幾里得距離(2-範數)做爲點之間的距離度量來計算m個點之間的距離。這些點在矩陣X中排列爲mn維行向量。

  2. Y = pdist(X, 'minkowski', p=2.)

    使用Minkowski距離計算距離, \parallel u-v \parallel_p, p\ge1

  3. Y = pdist(X, 'cityblock')

    計算點之間的城市街區或曼哈頓距離

  4. Y = pdist(X, 'seuclidean', V=None)

    計算標準化的歐幾里得距離

  5. Y = pdist(X, 'sqeuclidean')

    計算向量之間的平方歐幾里德距離,\parallel u-v \parallel_2^2

  6. Y = pdist(X, 'cosine')

    計算向量u``和v之間的餘弦距離,1-\frac{u·v}{\parallel u\parallel_2 \parallel v\parallel_2}

  7. Y = pdist(X, 'correlation')

    計算向量uv之間的相關距離。1-\frac{(u-\bar{u})·(v-\bar{v})}{\parallel (u-\bar{u}) \parallel_2 \parallel(v-\bar{v}) \parallel_2)}

  8. Y = pdist(X, 'hamming')

    計算歸一化的漢明距離,或兩個不一樣向量uv之間的不一樣的元素的比例。爲了節省內存,矩陣X能夠是布爾類型。

  9. Y = pdist(X, 'jaccard')

    計算點之間的Jaccard距離

  10. Y = pdist(X, 'chebyshev')

    計算點之間的切比雪夫距離,兩個n向量uv之間的切比雪夫距離是它們各自元素之間的最大norm-1距離,更準確地說,距離是d(u,v)=\max_i |u_i-v_i|

  11. Y = pdist(X, 'canberra')

    計算點之間的堪培拉距離, d(u,v)= \sum_ {i}\frac {|u_i-v_i|}{|u_i|+|v_i|}

3. fcluster()

從給定連接矩陣定義的層次聚類中造成平面聚類

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

參數:

  • Z:ndarraylinkage函數返回的矩陣編碼的層次聚類
  • t:scalar,對於criteriainconsistent, distance,或monocrit,這是造成扁平集羣所使用的閾值;對於maxclustmaxclust_monocrit,這是請求最大聚類數目。
  • criterion:str,可選。使用的準則。
    • inconsistent:默認值,若是羣集節點及其全部後代的不一致值小於或等於t,則其全部葉後代都屬於同一平面羣集。若是沒有非單例羣集知足此條件,則將每一個節點分配給本身的羣集。
    • distance:造成扁平聚類,以便每一個扁平聚類中的原始觀測值的同感距離不大於t
    • maxclust:找到最小閾值r,以使同一平面簇中任意兩個原始觀測值之間的顯色距離不大於r且不超過t個平面簇。
    • monocrit:
    • maxclust_monocrit:
  • depth:int,可選。執行不一致計算的最大深度。對於其餘標準沒有任何意義。默認爲2
  • R:ndarray, 可選,用於「inconsistent」準則的不一致矩陣。若是未提供,則計算此矩陣。
  • monocrit:ndarray,可選。長度爲n-1的數組。 monocrit [i]是對非單一i進行閾值處理的統計信息。單臨界向量必須是單調的,即給定具備索引i的節點c,對於與c如下的節點相對應的全部節點索引jmonocrit[i]>=monocrit[j]

返回值: fcluster:ndarray,長度爲n的數組, T[i]是原始觀測值i所屬的平面簇數。

scipy.cluster.hierarchy.fcluster可用於展平樹狀圖,從而將原始數據點分配給單個羣集。

示例

from scipy.cluster.hierarchy import ward, fcluster
from scipy.spatial.distance import pdist

X = [[0, 0], [0, 1], [1, 0],
     [0, 4], [0, 3], [1, 4],
     [4, 0], [3, 0], [4, 1],
     [4, 4], [3, 4], [4, 3]]
Z = ward(pdist(X)) #等同於Z = linkage(X, 'ward')
>>> Z
array([[ 0.        ,  1.        ,  1.        ,  2.        ],
       [ 3.        ,  4.        ,  1.        ,  2.        ],
       [ 6.        ,  7.        ,  1.        ,  2.        ],
       [ 9.        , 10.        ,  1.        ,  2.        ],
       [ 2.        , 12.        ,  1.29099445,  3.        ],
       [ 5.        , 13.        ,  1.29099445,  3.        ],
       [ 8.        , 14.        ,  1.29099445,  3.        ],
       [11.        , 15.        ,  1.29099445,  3.        ],
       [16.        , 17.        ,  5.77350269,  6.        ],
       [18.        , 19.        ,  5.77350269,  6.        ],
       [20.        , 21.        ,  8.16496581, 12.        ]])

# 閾值t過小,沒法容許數據中的任何兩個樣本造成聚類,所以返回了12個不一樣的聚類。
>>> fcluster(Z, t=0.9, criterion='distance')
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12], dtype=int32)
# 閾值高得多,最多可鏈接8個數據點-所以此處返回了4個簇。
>>> fcluster(Z, t=3, criterion='distance')
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32)
複製代碼

4. dendrogram

將分層聚類繪製爲樹狀圖。

scipy.cluster.hierarchy.dendrogram(Z, p=30, truncate_mode=None, color_threshold=None, get_leaves=True, orientation='top', labels=None, count_sort=False, distance_sort=False, show_leaf_counts=True, no_plot=False, no_labels=False, leaf_font_size=None, leaf_rotation=None, leaf_label_func=None, show_contracted=False, link_color_func=None, ax=None, above_threshold_color='b')
複製代碼

樹狀圖說明了如何經過在非單例聚類及其子代之間繪製U形連接來構成每一個聚類。 U連接的頂部指示羣集合並。U形連接的兩個分支指示合併了哪些集羣。U形連接的兩條腿的長度表示子羣集之間的距離。它也是兩個子類中原始觀測值之間的距離。

參數

  • Z:ndarray,連接矩陣編碼分層聚類以呈現爲樹狀圖,linkage函數的輸出值。
  • p:int,可選。truncate_mode的參數
  • truncate_mode:str,可選,當從中得出連接的原始觀察矩陣很大時,樹狀圖可能很難讀取。截斷用於壓縮樹狀圖。有幾種模式:
    • None:不執行截斷(默認)
    • lastp:連接中造成的最後p個非單簇是連接中惟一的非葉節點,它們對應於Z中的行Z[n-p-2:end]。全部其餘非單例簇都收縮到葉節點中。
    • level:顯示的樹狀圖樹不超過p個級別。「level」包括從上一次合併起具備p個合併的全部節點.
  • color_threshold:double,可選
  • get_leaves:bool,可選
  • orientation:str,可選,繪製樹狀圖的方向,能夠是如下任意字符串:
    • top:在頂部繪製根,並繪製向下的後代連接。 (默認)
    • bottom:在底部繪製根,並繪製向上的後代連接。
    • left:在左側繪製根,在右側繪製後代連接。
    • right:在右側繪製根,在左側繪製後代連接。
  • labels:ndarray,可選。默認狀況下,標籤爲None,所以原始觀測值的索引用於標記葉子節點。不然,這是一個n大小的列表(或元組)。labels[i]值是僅在第i個葉子節點下對應於原始觀察值而不是非單個聚類的文本。
  • count_sort:strbool,可選。對於每一個節點n,此參數肯定了繪製n的兩個後代連接的順序(從左到右)。該參數能夠是如下任意值:
    • False:
    • ascendingTrue:首先繪製簇中原始對象最少的子項。
    • descending:首先繪製其簇中原始對象數最大的子項。

注意: distance_sort和count_sort不能都爲True

  • distance_sort:strbool,可選。
  • show_leaf_counts:bool,可選。若是爲True,則表示k>1原始觀測值的葉節點將用括號中包含的觀測值數量標記。
  • no_plot: bool,可選,爲True時,不執行最終渲染。若是僅須要爲渲染計算的數據結構,或者若是matplotlib不可用,則這頗有用。
  • no_labels:bool,可選,設置爲True時,在樹狀圖的渲染中,葉節點旁邊沒有標籤。
  • leaf_rotation:double,可選。指定旋轉葉子標籤的角度(以度爲單位)。若是未指定,則旋轉基於樹狀圖中的節點數(默認爲0)
  • above_threshold_color:str,可選。該matplotlib顏色字符串可設置color_threshold上方連接的顏色。默認值爲b

****返回值:

  • R: dict,計算以繪製樹狀圖的數據結構字典,它具備如下鍵:
    • color_list:顏色名稱列表。第k個元素表明第k個連接的顏色。
    • icoorddcoord:列表中的每一個元素都是列表。
    • ivl:與葉節點相對應的標籤列表
    • leaves:

示例:

from scipy.cluster import hierarchy
import matplotlib.pyplot as plt

ytdist = np.array([662., 877., 255., 412., 996., 295., 468., 268.,
                    400., 754., 564., 138., 219., 869., 669.])
Z = hierarchy.linkage(ytdist, 'single')
plt.figure()
dn = hierarchy.dendrogram(Z)
# 如今繪製給定的軸,改善配色方案,並同時使用垂直和水平方向:
hierarchy.set_link_color_palette(['m', 'c', 'y', 'k'])
fig, axes = plt.subplots(1, 2, figsize=(8, 3))
dn1 = hierarchy.dendrogram(Z, ax=axes[0], above_threshold_color='y',
                          orientation='top')
dn2 = hierarchy.dendrogram(Z, ax=axes[1],
                           above_threshold_color='#bcbddc',
                          orientation='right')
hierarchy.set_link_color_palette(None)  # reset to default after use
plt.show()
複製代碼

相關文章
相關標籤/搜索