В качестве примера, у меня есть следующие входные данные (точка-облако я, работающий с более сложен)точка-облако кластер-анализ в Python - идентифицирующие кластеры из бинарной матрицы
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]
алгоритм кластеризации дает двоичную верхнюю треугольную матрицу (назовем ее матрицей соединения). A 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.]
можно идентифицировать кластеры для каждой строки с rowclustering (ов), где 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, поскольку некоторые из строк соединены через общий ID (например, смотреть на ID 4 и 5) , То, что я хочу, чтобы это:
result = [[0, 1, 2, 3, 4, 5, 12, 13, 14], [6], [7, 8, 9, 10, 11]]
Я попытался создать функцию (кластеризация (IDX, е)), что делает это, где IDX, является результатом rowclustering (s) и 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 или (возможно, лучше) на матрице соединения (уменьшение матрицы?).
Любая помощь очень ценится! Дайте мне знать, если я уточню свой вопрос. Благодарю.
Ваша кластеризации (IDX, е) функция никогда не может вернуться, он будет просто рекурсия до переполнения стека – portforwardpodcast
взглянуть на DBSCAN и одноканальный. Но вам нужно связать = 0, а не 1. –