В качестве примера у меня есть следующие входные данные (облако точек, с которым я работаю, более сложное)
Data = [1,1,1,1,1],[1,1,2,1,1],[2,2,2,1,1],[3,3,3,1,1],[4,4,4,1,1],[5,5,5,1,1],[50,50,50,1,1],[95,95,95,1,1],[96,96,96,1,1],[97,97,97,1,1],[98,98,98,1,1],[99,99,99,1,1],[2,2,3,1,1],[2,2,1,1,1],[2,2,4,1,1]
Алгоритм кластеризации дает двоичную верхнетреугольную матрицу (назовем ее матрицей соединений). 1 означает, что две точки соединены. Например. Идентификатор точки 0 (строка 0) связан с самим собой (столбец 0) и 1,2,3,12,13,14. Но в точки 4 и 5 также можно попасть через 3, 12, 13 и 14.
[ 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 1. 0. 1.]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
Я могу идентифицировать кластеры в каждой строке с помощью кластеризации строк, где s - это двоичная матрица сверху.
def rowclustering(s):
r = 0
idx = []
while r < size(s,0):
row = []
for i in range(size(s,1)):
if s[r][i] == 1:
row = row + [i]
r = r + 1
idx = idx + [row]
return idx
И возвращаемый idx:
idx = [[0, 1, 2, 3, 12, 13, 14], [1, 2, 3, 12, 13, 14], [2, 3, 4, 12, 13, 14], [3, 4, 5, 12, 13, 14], [4, 5, 12, 14], [5], [6], [7, 8, 9], [8, 9, 10], [9, 10, 11], [10, 11], [11], [12, 13, 14], [13, 14], [14]]
Теперь очевидно, что кластеров меньше, чем 15, потому что некоторые строки связаны через общий идентификатор (например, посмотрите на идентификаторы 4 и 5). Я хочу иметь:
result = [[0, 1, 2, 3, 4, 5, 12, 13, 14], [6], [7, 8, 9, 10, 11]]
Я попытался создать функцию (кластеризацию (idx, f)), которая делает это, где idx является результатом кластеризации строк, а f будет первой строкой в idx, например [0, 1, 2, 3, 12, 13, 14]. Однако эта функция не будет завершена должным образом. Какой будет правильный код для прерывания функции после того, как все соединения (идентификаторов idx) будут выполнены?
def clustering(idx,f):
for i in f:
f = f + idx[i]
f = list(set(f))
clustering(idx,f)
return
Проблема, которую я пытаюсь решить, - это своего рода процедура саморазвития. Функция кластеризации должна вызывать сама себя до тех пор, пока не будут выполнены все возможные точечные соединения. Это можно сделать на idx или (может быть, лучше) на матрице соединений (уменьшение матрицы?).
Любая помощь высоко ценится! Дайте мне знать, если мне нужно уточнить свой вопрос. Спасибо.