執行層次/彙集聚類算法
scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)
數組
參數:bash
y
:能夠是一維的凝聚聚類矩陣或者是2維的觀測矢量數組。壓縮(凝聚)距離矩陣是包含距離矩陣上三角的平面陣列。這是pdist
返回的形式。也能夠是m
個n
維的觀測矢量構成的mxn
的數組。若爲壓縮距離矩陣的全部元素必須是有限的,即沒有NaN
或infs
。method
:str
,可選。要使用的連接算法。metric
:str或函數
,可選。在y
是觀察向量集合的狀況下使用的距離度量;不然忽略。optimal_ordering
:bool
,可選。若是爲True
,則將對連接矩陣進行從新排序,以使連續的葉子之間的距離最小,當可視化數據時,這將致使更直觀的樹結構。默認爲False
,由於此算法可能很慢,尤爲是在大型數據集上。另請參見optimum_leaf_ordering
函數。返回值:數據結構
(n-1)x4
的矩陣,分層聚類編碼爲連接矩陣。ide
該矩陣表示樹狀圖,其中第一個和第二個元素是每一個步驟中合併的兩個聚類,第三個元素是這些聚類之間的距離,第四個元素是新聚類的大小-包含的原始數據點數。函數
method
方法:優化
single
:,這也稱爲最近點算法complete
:,也被稱爲Farthest Point
算法或Voor Hees
算法average
:,這也稱爲UPGMA
算法weighted
:,這也叫作WPGMA
centroid
:,也被稱爲UPGMC
算法median
:與centroid
方法相同,當兩個簇s
和t
被結合爲一個簇u
,s
和t
的質心平均值給出新質心u
,這也稱爲WPGMC
算法ward
:使用Ward
方差最小化算法,請注意 編碼
「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()
複製代碼
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
,對於每一個i
和j
(其中i <j <m
),其中m
是原始觀測值的數量。計算度量dist(u = X [i],v = X [j])
並將其存儲在條目ij
中。如下是常見的調用約定:
Y=pdist(X, 'euclidean')
使用歐幾里得距離(2-範數)做爲點之間的距離度量來計算m
個點之間的距離。這些點在矩陣X
中排列爲m
個n
維行向量。
Y = pdist(X, 'minkowski', p=2.)
使用Minkowski
距離計算距離,
Y = pdist(X, 'cityblock')
計算點之間的城市街區或曼哈頓距離
Y = pdist(X, 'seuclidean', V=None)
計算標準化的歐幾里得距離
Y = pdist(X, 'sqeuclidean')
計算向量之間的平方歐幾里德距離,
Y = pdist(X, 'cosine')
計算向量u``和v
之間的餘弦距離,
Y = pdist(X, 'correlation')
計算向量u
和v
之間的相關距離。
Y = pdist(X, 'hamming')
計算歸一化的漢明距離,或兩個不一樣向量u
和v
之間的不一樣的元素的比例。爲了節省內存,矩陣X
能夠是布爾類型。
Y = pdist(X, 'jaccard')
計算點之間的Jaccard
距離
Y = pdist(X, 'chebyshev')
計算點之間的切比雪夫距離,兩個n向量u
和v
之間的切比雪夫距離是它們各自元素之間的最大norm-1距離,更準確地說,距離是
Y = pdist(X, 'canberra')
計算點之間的堪培拉距離,
從給定連接矩陣定義的層次聚類中造成平面聚類
scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)
參數:
Z
:ndarray
,linkage
函數返回的矩陣編碼的層次聚類t
:scalar
,對於criteria
是inconsistent
, distance
,或monocrit
,這是造成扁平集羣所使用的閾值;對於maxclust
或maxclust_monocrit
,這是請求最大聚類數目。criterion
:str
,可選。使用的準則。
inconsistent
:默認值,若是羣集節點及其全部後代的不一致值小於或等於t,則其全部葉後代都屬於同一平面羣集。若是沒有非單例羣集知足此條件,則將每一個節點分配給本身的羣集。distance
:造成扁平聚類,以便每一個扁平聚類中的原始觀測值的同感距離不大於t
maxclust
:找到最小閾值r
,以使同一平面簇中任意兩個原始觀測值之間的顯色距離不大於r
且不超過t
個平面簇。monocrit
:maxclust_monocrit
:depth
:int
,可選。執行不一致計算的最大深度。對於其餘標準沒有任何意義。默認爲2R
:ndarray
, 可選,用於「inconsistent」
準則的不一致矩陣。若是未提供,則計算此矩陣。monocrit
:ndarray
,可選。長度爲n-1
的數組。 monocrit [i]
是對非單一i
進行閾值處理的統計信息。單臨界向量必須是單調的,即給定具備索引i
的節點c
,對於與c
如下的節點相對應的全部節點索引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)
複製代碼
將分層聚類繪製爲樹狀圖。
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
:str
或bool
,可選。對於每一個節點n
,此參數肯定了繪製n
的兩個後代連接的順序(從左到右)。該參數能夠是如下任意值:
False
:ascending
或True
:首先繪製簇中原始對象最少的子項。descending
:首先繪製其簇中原始對象數最大的子項。注意: distance_sort和count_sort不能都爲True
distance_sort
:str
或bool
,可選。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個連接的顏色。icoord
和dcoord
:列表中的每一個元素都是列表。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()
複製代碼