объединить / усреднить соседей ближе заданного радиуса - PullRequest
0 голосов
/ 10 мая 2018

У меня есть пара сотен координат в трехмерном пространстве, мне нужно объединить точки ближе заданного радиуса и заменить их на среднее значение соседей.

Звучит как довольно стандартная проблема, но я пока не смог найти решение. Набор данных достаточно мал, чтобы можно было рассчитать попарные расстояния для всех точек.

Не знаете, может быть какой-то анализ графиков / маркировка связанных компонентов на матрице разреженного расстояния?

Мне на самом деле не нужна усредняющая часть, только кластеризация (правильная ли здесь кластеризация?)

Набор игрушечных данных может быть coords = np.random.random(size=(100,2))

Вот что я пытался до сих пор использовать scipy.cluster.hierarchy. Вроде нормально работает, но я открыт для дополнительных предложений (DBSCAN может быть?)

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

from scipy.cluster.hierarchy import fclusterdata
from scipy.spatial.distance import pdist

np.random.seed(0)

fig = plt.figure(figsize=(10,5))

gs = mpl.gridspec.GridSpec(1,2)
gs.update(wspace=0.01, hspace= 0.05)

coords = np.random.randint(30, size=(200,2))
img = np.zeros((30,30))
img[coords.T.tolist()] = 1

ax = plt.subplot(gs[0])
ax.imshow(img, cmap="nipy_spectral")

clusters = fclusterdata(coords, 2, criterion="distance", metric="euclidean")
print(len(np.unique(clusters)))

img[coords.T.tolist()] = clusters

ax = plt.subplot(gs[1])
ax.imshow(img, cmap="nipy_spectral")

plt.show()

clusters

1 Ответ

0 голосов
/ 10 мая 2018

Вот метод, который использует KDTree для запроса соседей и модуля networkx для сбора подключенных компонентов.

from scipy import spatial
import networkx as nx

cutoff = 2

components = nx.connected_components(
    nx.from_edgelist(
        (i, j) for i, js in enumerate(
            spatial.KDTree(coords).query_ball_point(coords, cutoff)
        )
        for j in js
    )
)

clusters = {j: i for i, js in enumerate(components) for j in js}

Пример вывода:

enter image description here

...