Расчет манхэттенского расстояния в Python без результата - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть эти два фрейма данных в python, и я пытаюсь вычислить расстояние Манхэттена, а затем евклидово расстояние, но я застрял на этом расстоянии Манхэттена и не могу понять, что происходит не так.Вот что я пробовал до сих пор:

ratings = pd.read_csv("toy_ratings.csv", ",")
person1 = ratings[ratings['Person'] == 1]['Rating']
person2 = ratings[ratings['Person'] == 2]['Rating']

ratings.head()
    Person Movie Rating
0   1      11   2.5
1   1      12   3.5
2   1      15   2.5
3   3      14   3.5
4   2      12   3.5

Вот данные внутри person1 и person2

print("*****person1*****")
print(person1)

*****person1*****
0     2.5
1     3.5
2     2.5
5     3.0
22    3.5
23    3.0
36    5.0

print("*****person2*****")
print(person2)

*****person2*****
4     3.5
6     3.0
8     1.5
9     5.0
11    3.0
24    3.5

Это была функция, которую я пытался построить безлюбая удача:

def ManhattanDist(person1, person2):
    distance = 0
    for rating in person1:
        if rating in person2:
            distance += abs(person1[rating] - person2[rating])
            return distance

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

Ответы [ 2 ]

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

Я думаю, что функция должна возвращать (= возвращать) расстояние в любом случае: либо расстояние равно нулю в соответствии с инициацией, либо это что-то еще.Таким образом, функция должна выглядеть следующим образом:

def ManhattanDist(person1, person2):
    distance = 0
    for rating in person1:
        if rating in person2:
            distance += abs(person1[rating] - person2[rating])
    return distance

Я думаю, что расстояние должно быть построено двумя векторами одинаковой длины (по крайней мере, я не могу представить больше ничего).Если это так, вы можете обойтись (без вашей функции)

import numpy as np

p1 = np.array(person1)
p2 = np.array(person2)

#--- scalar product as similarity indicator
dist1 = np.dot(p1,p2)

#--- Euclidean distance
dist2 = np.linalg.norm(p1-p2)

#--- manhatten distance
dist3 = np.sum(np.abs(p1-p2))
0 голосов
/ 18 февраля 2019

Ваша функция возвращает 1 значение ... Она должна (я думаю) вернуть список значений.

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