【发布时间】:2020-01-23 21:34:17
【问题描述】:
我想根据伪代码实现简单的层次凝聚聚类:
我在需要更新距离矩阵的最后部分卡住了。到目前为止,我有:
import numpy as np
X = np.array([[1, 2],
[0, 3],
[2, 3],])
# Clusters
C = np.zeros((X.shape[0], X.shape[0]))
# Keeps track of active clusters
I = np.zeros(X.shape[0])
# For all n datapoints
for n in range(X.shape[0]):
for i in range(X.shape[0]):
# Compute the similarity of all N x N pairs of images
C[n][i] = np.linalg.norm(X[n] - X[i])
I[n] = 1
# Collects clustering as a sequence of merges
A = []
In each of N iterations
for k in range(X.shape[0] - 1):
# TODO: Find the indices of the smallest distance
# Updated distance matrix
我想实现单链接聚类,所以我想找到距离矩阵的 argmin。我最初想过做这样的事情:
i, m = np.where(C == np.min(C[np.nonzero(C)]))
i, m = i[0], m[0]
A.append((i, m))
找到 argmin,但我认为它不正确,因为它没有指定 I 中的活动集群的条件。我也很困惑,因为我应该只查看矩阵的上三角形或下三角形,所以如果我使用上述方法,由于对称性,我可以两次获得相同的 argmin。
我也在考虑先创建新合并集群的行和列:
C = np.vstack((C, np.zeros((1, C.shape[1]))))
C = np.hstack((C, np.zeros((C.shape[0], 1))))
然后以某种方式更新它:
for j in range(X.shape[0]):
C[i][j] = min(C[i][j], C[m][j])
C[j][i] = min(C[i][j], C[m][j])
我不确定这是否是正确的方法。是否有更简单的方法来查找 argmin、合并行和列并更新值?
【问题讨论】:
标签: python python-3.x numpy cluster-analysis hierarchical-clustering