分层聚集聚类:如何更新距离矩阵?

时间:2019-09-23 19:14:00

标签: python python-3.x numpy cluster-analysis hierarchical-clustering

我想根据伪代码实现简单的分层聚集聚类:

enter image description here

我陷入了需要更新距离矩阵的最后一部分。到目前为止,我有:

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,合并行和列并更新值?

1 个答案:

答案 0 :(得分:0)

如果在查找最小dist错误的行和列索引时感到困惑,

首先,

为避免因对称而两次出现argmin,可以将初始距离矩阵构造为下三角矩阵的形状。

RA_Max_1

第二,

如果您不喜欢使用np工具或正在寻找一种简单的方法,则可以手动在给定的矩阵中进行最小值搜索。

Master_Attribute_Range

最后,

更新距离矩阵并将聚类合并为休假:

Masters