我希望能够运行scikit的层次聚类算法(scikit.cluster.Ward),并从算法的第一次迭代中获取观察如何聚集在一起的整个历史记录(每个观察结果都是自己的聚类)到最后一次迭代(一个簇中的所有观察)。 scikit能做到吗? 我所追踪的信息是,每次迭代,加入的聚类/观察,添加的聚类/观察,两者之间的距离。
答案 0 :(得分:3)
全部在ward.children
。它的每一行都告诉你哪两个特征聚集在一起,从而创建一个新特征。因此,最终会有2 * n_features - 1
个索引在它们增长时索引聚类。
import numpy as np
from scipy.ndimage import gaussian_filter1d
n_samples, n_feat1, n_feat2 = 400, 20, 20
X = np.random.randn(n_samples, n_feat1, n_feat2)
X = gaussian_filter1d(X, sigma=2, axis=1)
X = gaussian_filter1d(X, sigma=2, axis=2)
from sklearn.feature_extraction.image import grid_to_graph
connectivity = grid_to_graph(n_feat1, n_feat2)
from sklearn.cluster import WardAgglomeration
ward = WardAgglomeration(connectivity=connectivity)
ward.fit(X.reshape(n_samples, -1))
print ward.children
array([[ 35, 15],
[ 36, 16],
[ 34, 14],
[181, 180],
[201, 200],
[161, 160],
[241, 240],
[339, 338],
[221, 220],
[24, 4],
...])
有400个功能(索引为0-399)。第一次合并在特征35和15之间,产生特征400.第二次合并在特征36和16之间,产生特征401.第三次合并在34和14之间,产生402,依此类推。
请注意sklearn.cluster.Ward
中不推荐使用0.17
,AgglomerativeClustering
会替换{{1}}。