4

determining the number of clusters in a dataset維基百科的文章指出,我不需要使用分層聚類時,擔心這樣的問題。但是,當我嘗試使用scikit-learn的agglomerative clustering時,我發現我必須爲它提供羣集數作爲參數「n_clusters」 - 沒有這個參數我得到了兩個羣集的硬編碼默認值。在這種情況下,如何才能爲數據集選擇正確數量的羣集?維基文章是錯誤的嗎?選擇在heirarchical聚集集簇羣的數量與scikit

+0

好問題。當我遇到類似問題時,我最終使用scipy例程進行層次聚類,可視化樹,然後「手動」(查看樹後)設置切割閾值。 – lanenok

+0

似乎與https://github.com/scikit-learn/scikit-learn/issues/3796有關 – yangjie

回答

3

維基百科被簡單地使這無關與現實生活的極度簡化。分層聚類不避免聚類數量爲的問題。簡單地說 - 它構建了跨越所有樣本的樹,該樣本顯示哪些樣本(稍後在羣集中)合併在一起以創建更大的羣集。發生這種情況直到你有兩個簇(這就是爲什麼默認的簇數是2),它們被合併到整個數據集中。你獨自一人在樹上「切割」以獲得實際的聚類。一旦你適應AgglomerativeClustering你可以遍歷整個樹和分析,以保持其集羣

import numpy as np 
from sklearn.cluster import AgglomerativeClustering 
import itertools 

X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100]) 
clustering = AgglomerativeClustering() 
clustering.fit(X) 

[{'node_id': next(itertools.count(X.shape[0])), 'left': x[0], 'right':x[1]} for x in clustering.children_] 
0

ELKI(不scikit學習,但Java)有一定數量的提取一層次聚類簇先進的方法。例如,它們比在特定高度處切割樹更聰明,但它們可以產生最小尺寸的簇的層次結構。

你可以檢查,如果這些方法爲你工作。