Кластеризация наблюдений на основе сначала атрибута и матрицы расстояний - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть набор данных с местоположениями (координатами) и скалярным атрибутом каждого местоположения (например, температуры).Мне нужно сгруппировать местоположения на основе скалярного атрибута, но с учетом расстояния между местоположениями.

Проблема заключается в том, что на примере температуры возможно, чтобы места, которые находятся далеко друг от друга, имели одинаковую температуру.Если я сгруппируюсь по температуре, эти местоположения будут в одном кластере, когда они не должны.Обратное верно, если два местоположения, которые находятся рядом друг с другом, имеют разные температуры.В этом случае кластеризация по температуре может привести к тому, что эти наблюдения будут находиться в разных кластерах, в то время как кластеризация на основе матрицы расстояний поместит их в один и тот же.

Итак, есть ли способ, которым я мог бы кластеризовать наблюденияуделять больше внимания одному атрибуту (температуре), а затем «уточнять» на основе матрицы расстояний?

Вот простой пример, показывающий, как кластеризация отличается в зависимости от того, используется ли атрибут в качестве основы или матрицы расстояний.Моя цель - использовать как атрибут, так и матрицу расстояний, придавая атрибуту большее значение.

import numpy as np
import matplotlib.pyplot as plt
import haversine
from scipy.cluster.hierarchy import linkage, fcluster
from scipy.spatial import distance as ssd

# Create location data
x = np.random.rand(100, 1)
y = np.random.rand(100, 1)

t = np.random.randint(0, 20, size=(100,1))

# Compute distance matrix
D = np.zeros((len(x),len(y)))
for k in range(len(x)):
    for j in range(len(y)):
        distance_pair= haversine.distance((x[k], y[k]), (x[j], y[j]))
        D[k,j] = distance_pair

# Compare clustering alternatives
Zt = linkage(t, 'complete')
Zd = linkage(ssd.squareform(D), method="complete")

# Cluster based on t
clt = fcluster(Zt, 5, criterion='distance').reshape(100,1)
plt.figure(figsize=(10, 8))
plt.scatter(x, y, c=clt)  
plt.show()

# Cluster based on distance matrix
cld = fcluster(Zd, 10, criterion='distance').reshape(100,1)
plt.figure(figsize=(10, 8))
plt.scatter(x, y, c=cld)  
plt.show()

haversine.py доступен здесь: https://gist.github.com/rochacbruno/2883505

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...