Пирсон против Евклида против Манхэттена Результаты
Использование Python 3.6. Я не получаю логических результатов при использовании расстояния Манхэттена для измерения подобия. Даже по сравнению с результатами корреляции Пирсона и Евклида единицы Евклида и Манхэттена не совпадают?
Я работаю над моделью грубой рекомендации, которая включает рекомендацию похожих элементов путем измерения сходства между пользовательским рейтингом для предпочтительного элемента X и другими пользовательскими оценками для того же элемента и рекомендацией элементов других пользователей, с которыми найдено сильное совпадение с пользователем. кто поднял запрос
Результаты, которые я получил,
Pearson:
[('Men in Black II', 0.12754201365635218), ('Fried Green Tomatoes', 0.11361596992427059), ('Miami Vice', 0.11068770878125743), ('The Dark', 0.11035867466994702), ('Comanche Station', 0.10994620915146613), ('Terminator 3: Rise of the Machines', 0.10802689932238932), ('Stand by Me', 0.10797224471029637), ('Dancer in the Dark', 0.10241410378191894), ('Los Olvidados', 0.10044018848844877), ('A Shot in the Dark', 0.10036315249837004)]
Euclidean:
[('...And the Pursuit of Happiness', 1.0), ('12 Angry Men', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0)]
Manhattan:
[('...And the Pursuit of Happiness', 1.0), ('12 Angry Men', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0)]
Cosine:
[('...And the Pursuit of Happiness', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0), ('A.I. Artificial Intelligence', 1.0)]
1 ответ
Я не могу сказать вам, почему вы получаете странные результаты, не видя свой код, однако я могу дать вам некоторое объяснение различия между сходством Пирсона, Евклида и Манхэттена между двумя векторами.
Пирсон: это можно представить как косинус между двумя векторами, и, следовательно, является масштабно-инвариантным. Таким образом, если два вектора совпадают, но масштабируются неравномерно, это будет 1. С рекомендациями к фильмам я предполагаю, что это означает, что если я оценил фильм 1: 2/5, фильм 2: 1/5 и фильм 3: 2/5 и Вы оценили те же фильмы 4/5, 2/5 и 4/5 соответственно, тогда мы будем рекомендовать нам те же фильмы.
Евклид: это нормальный способ измерения расстояния между векторами. Обратите внимание, что большие различия преувеличены, а небольшие различия игнорируются (малые числа в квадрате становятся крошечными числами, большие числа в квадрате становятся огромными числами). Таким образом, если два вектора почти совпадают везде, они будут считаться очень похожими. Кроме того, масштаб имеет значение, и приведенный выше пример даст относительно большое различие.
Манхэттен: это похоже на евклидово в том, что касается масштаба, но отличается тем, что оно не будет игнорировать небольшие различия. Если два вектора почти совпадают везде, манхэттенское расстояние будет большим. Кроме того, большие различия в одном индексе не будут иметь такого большого влияния на конечное сходство, как при евклидовом расстоянии.
Я полагаю, что именно тот факт, что мелкие различия составляют большую разницу в Манхэттене, а не Пирсона и Евклида, является источником вашей путаницы.
Итак, посмотрев на ваш код еще немного, я вижу, что вы используете 1/(1+euclidean_distance)
для евклидова подобия, но manhattan_distance
для манхэттенского сходства. Попробуйте это вместо
def Manhattan(x, y):
return 1/(1+np.sum(np.abs(x-y)))
Ps. Извините за любые опечатки, я на моем телефоне. Надеюсь, все еще понятно.
Pps. обратите внимание, что вы можете написать np.linalg.norm(x-y)
для евклидова расстояния между х и у и np.linalg.norm(x-y, 1)
для Манхэттена расстояние между х и у (вместо того, чтобы иметь дело с sqrt(sum((x-y)**2))
а также np.sum(np.abs(x-y))
,