Вычисление матрицы расстояний nxn на основе функции - PullRequest
0 голосов
/ 28 февраля 2019

Добрый день,

Я начинаю с таблицы, подобной следующей:

      Attribute1   Attribute2   Attribute3
John     1              2            3
Jen      4              5            6
Jo       7              8            9

Я уже создал функцию -> dist (i, j), которая вычисляет расстояние L1между любыми 2 людьми (я и j) в таблице.Например, расстояние L1 между Джоном и Джен было бы dist (0,1) = | 4-1 |+ | 5-2 |+ | 6-3 |= 9. Также важно отметить, что я называю каждого человека индексом своей строки (Джон = 0, Джен = 1 и т. Д.).

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

      John  Jen  Jo
John   0     x    x
Jen    x     0    x
Jo     x     x    0

Если x - это соответствующее расстояние L1 между этими двумя людьми.

Есть идеи о том, как мне это сделать?

1 Ответ

0 голосов
/ 28 февраля 2019

Созданная вами функция выглядит как стандартное расстояние городского квартала (Манхэттен), то есть вы можете сделать это с помощью простого вызова функции библиотеки SciPy:

from scipy.spatial.distance import squareform, pdist
dm = pd.DataFrame(squareform(pdist(df, metric='cityblock')), index=df.index, columns=df.index)

Результаты:

      John  Jen    Jo
John   0.0  9.0  18.0
Jen    9.0  0.0   9.0
Jo    18.0  9.0   0.0

См. pdist и squareform документацию для получения более подробной информации.

Обратите внимание, что если ваша фактическая функция более сложная, чем в описанном вами Городском блоке, вы описали, все еще возможно использовать эти функции SciPy с пользовательской метрикой расстояния.

Хотя это и не обязательно для этого конкретного случая, вот как можно применить пользовательскую функцию расстояния при необходимости.Сначала создайте функцию, которая принимает две строки в качестве входных данных и возвращает одно число расстояния:

def my_distance_function(row1, row2):
    return np.abs(row1 - row2).sum()

Затем применяется следующим образом:

dm = pd.DataFrame(squareform(pdist(df, metric=my_distance_function)), index=df.index, columns=df.index)

Это дает тот же результат, что и 'функция cityblock 'в библиотеке SciPy, но вы можете увидеть, как вы можете настроить ее сейчас, чтобы она соответствовала вашим потребностям при необходимости.

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