scipy.cluster.hierarchy.

fcluster#

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)[原始碼]#

從給定的連結矩陣所定義的階層式分群中形成扁平集群。

參數:
Zndarray

linkage 函數回傳的矩陣所編碼的階層式分群。

t純量
對於 'inconsistent'、'distance' 或 'monocrit' 準則,

這是形成扁平集群時要應用的閾值。

對於 'maxclust' 或 'maxclust_monocrit' 準則,

這會是請求的最大集群數量。

criterion字串,選填

用於形成扁平集群的準則。這可以是以下任何值

inconsistent :

如果一個集群節點及其所有後代的不一致值小於或等於 t,則其所有葉後代都屬於同一個扁平集群。當沒有非單例集群符合此準則時,每個節點都會被分配到自己的集群。(預設)

distance :

形成扁平集群,使得每個扁平集群中的原始觀測值之間的互相關距離不大於 t

maxclust :

找到最小閾值 r,使得同一個扁平集群中任意兩個原始觀測值之間的互相關距離不大於 r,且形成的扁平集群數量不超過 t 個。

monocrit :

monocrit[j] <= t 時,從索引為 i 的集群節點 c 形成一個扁平集群。

例如,要以不一致性矩陣 R 中計算的最大平均距離為閾值,閾值為 0.8,請執行

MR = maxRstat(Z, R, 3)
fcluster(Z, t=0.8, criterion='monocrit', monocrit=MR)
maxclust_monocrit :

當對於集群索引 c 以下(包含 c)的所有索引 imonocrit[i] <= r 時,從非單例集群節點 c 形成一個扁平集群。r 會被最小化,使得形成的扁平集群數量不超過 t 個。monocrit 必須是單調的。例如,為了最小化最大不一致值的閾值 t,以便形成不超過 3 個扁平集群,請執行

MI = maxinconsts(Z, R)
fcluster(Z, t=3, criterion='maxclust_monocrit', monocrit=MI)
depth整數,選填

執行不一致性計算的最大深度。對於其他準則,它沒有意義。預設值為 2。

Rndarray,選填

用於 'inconsistent' 準則的不一致性矩陣。如果未提供,則會計算此矩陣。

monocritndarray,選填

長度為 n-1 的陣列。monocrit[i] 是非單例 i 被閾值化的統計量。monocrit 向量必須是單調的,即給定一個索引為 i 的節點 c,對於所有對應於節點 c 以下的節點索引 j,monocrit[i] >= monocrit[j]

回傳值:
fclusterndarray

長度為 n 的陣列。T[i] 是原始觀測值 i 所屬的扁平集群編號。

另請參閱

linkage

以取得關於階層式分群方法如何運作的資訊。

範例

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

所有集群連結方法 - 例如,scipy.cluster.hierarchy.ward 會產生一個連結矩陣 Z 作為其輸出

>>> 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
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.        ]])

此矩陣代表一個樹狀圖,其中第一個和第二個元素是在每個步驟合併的兩個集群,第三個元素是這些集群之間的距離,第四個元素是新集群的大小 - 包含的原始資料點數量。

scipy.cluster.hierarchy.fcluster 可以用來扁平化樹狀圖,結果會得到原始資料點到單一集群的分配。

此分配主要取決於距離閾值 t - 允許的最大集群間距離

>>> fcluster(Z, t=0.9, criterion='distance')
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12], dtype=int32)
>>> fcluster(Z, t=1.1, criterion='distance')
array([1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8], dtype=int32)
>>> fcluster(Z, t=3, criterion='distance')
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32)
>>> fcluster(Z, t=9, criterion='distance')
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)

在第一種情況下,閾值 t 太小,無法讓資料中的任何兩個樣本形成一個集群,因此回傳了 12 個不同的集群。

在第二種情況下,閾值足夠大,可以讓前 4 個點與其最近的鄰居合併。因此,在這裡只回傳了 8 個集群。

第三種情況下,閾值更高,允許最多 8 個資料點連接 - 因此這裡回傳了 4 個集群。

最後,第四種情況的閾值足夠大,可以讓所有資料點合併在一起 - 因此回傳了一個單一集群。