Иерархическая агломерационная кластеризация: как обновить матрицу расстояний? - PullRequest
0 голосов
/ 23 сентября 2019

Я хотел бы реализовать простую иерархическую агломерационную кластеризацию в соответствии с псевдокодом:

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, объединить строки и столбцы и обновить значения?

...