AffinityPropagation聚类的输入格式

2 投票
1 回答
2111 浏览
提问于 2025-04-18 01:25

我在使用 scipy.cluster.hierarchy.linkage 方法,利用一个预先计算好的相似度矩阵:

下面是生成这个上三角矩阵的代码:

distances = np.zeros((len(reprs), len(reprs))) * -1
for i, j in it.combinations(range(len(reprs)), 2):
    distances[i][j] = (reprs[i] - reprs[j])**2

我也可以把它简化表示:

distances = distances[np.triu_indices(len(reprs), 1)]

现在我想试试 sklearn.cluster.AffinityPropagation,但我不知道怎么把相似度矩阵传进去:

def affinity_cluster(distances):
    ap = sklearn.cluster.AffinityPropagation(preference="precomputed")
    d = ap.fit_predict(???)

根据它的 文档

fit(X) 从负的欧几里得距离创建相似度矩阵,然后应用相似度传播聚类。 参数:

X: array [n_samples, n_features] or [n_samples, n_samples] :
    Data matrix or, if affinity is precomputed, matrix of similarities / affinities.

fit_predict(X, y=None) 对 X 进行聚类,并返回聚类标签。 参数:

X : ndarray, shape (n_samples, n_features)
    Input data.

Returns : 

y : ndarray, shape (n_samples,)
    cluster labels

所以,他们期望的是一个包含两个元素的元组,但我有一个 M*N 的矩阵,或者是一个包含 M*N/2 个元素的向量。

那么,我该如何使用 sklearn.cluster.AffinityPropagation 和相似度矩阵呢?

1 个回答

3

你需要传入一个方形的、对称的矩阵。array [n_samples, n_samples] 应该理解为 形状为 (n_samples, n_samples) 的数组。我马上会修正文档。

撰写回答