У меня есть набор данных с местоположениями (координатами) и скалярным атрибутом каждого местоположения (например, температуры).Мне нужно сгруппировать местоположения на основе скалярного атрибута, но с учетом расстояния между местоположениями.
Проблема заключается в том, что на примере температуры возможно, чтобы места, которые находятся далеко друг от друга, имели одинаковую температуру.Если я сгруппируюсь по температуре, эти местоположения будут в одном кластере, когда они не должны.Обратное верно, если два местоположения, которые находятся рядом друг с другом, имеют разные температуры.В этом случае кластеризация по температуре может привести к тому, что эти наблюдения будут находиться в разных кластерах, в то время как кластеризация на основе матрицы расстояний поместит их в один и тот же.
Итак, есть ли способ, которым я мог бы кластеризовать наблюденияуделять больше внимания одному атрибуту (температуре), а затем «уточнять» на основе матрицы расстояний?
Вот простой пример, показывающий, как кластеризация отличается в зависимости от того, используется ли атрибут в качестве основы или матрицы расстояний.Моя цель - использовать как атрибут, так и матрицу расстояний, придавая атрибуту большее значение.
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
Спасибо.