Оценка по евклидову расстоянию- Отыскание похожих пользователей

Один из самых простых способов вычисления оценки подобия – это евклидово расстояние. В этом случае предметы, которые люди оценивали сообща, представляются в виде координатных осей. Теперь в этой системе координат можно расположить точки, соответствующие людям, и посмотреть, насколько они оказались близки (рис. 2.1).

Рис. 2.1. Люди в пространстве предпочтений

На этом рисунке показаны люди, представленные точками в пространстве предпочтений. Toby имеет координату 4,5 по оси Snakes и координату 1,0 по оси Dupree. Чем ближе два человека в пространстве предпочтений, тем более схожи их предпочтения. Поскольку эта диаграмма двумерная, то одновременно можно смотреть только на два показателя, но принцип остается тем же самым и для большего числа показателей. Чтобы вычислить расстояние между Toby и LaSalle на этой диаграмме, возьмем разности координат по каждой оси, возведем их в квадрат,

сложим, а затем извлечем квадратный корень из суммы. В Python для возведения в квадрат можно воспользоваться функцией pow(n,2), а для извлечения квадратного корня служит функция sqrt: >> from math import sqrt >> sqrt(pow(5-4,2)+pow(4-1,2)) 3.1622776601683795

Расстояние, вычисленное по этой формуле, будет тем меньше, чем больше сходства между людьми. Однако нам нужна функция, значение которой тем больше, чем люди более похожи друг на друга. Этого можно добиться, добавив к вычисленному расстоянию 1 (чтобы никогда не делить на 0) и взяв обратную величину:

>> 1/(1+sqrt(pow(5-4,2)+pow(4-1,2)))

0.2402530733520421

Новая функция всегда возвращает значение от 0 до 1, причем 1 получается, когда предпочтения двух людей в точности совпадают. Теперь можно собрать все воедино и написать функцию для вычисления оценки подобия. Добавьте в файл recommendations.py такой код:

from math import sqrt

# Возвращает оценку подобия person1 и person2 на основе расстояния def sim_distance(prefs,person1,person2):

#       Получить список предметов, оцененных обоими si={}

for item in prefs[person1]: if item in prefs[person2]: si[item]=1

#       Если нет ни одной общей оценки, вернуть 0 if len(si)==0: return 0

#       Сложить квадраты разностей

sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)

for item in prefs[person1] if item in prefs[person2]])

return 1/(1+sum_of_squares) Этой функции при вызове передаются имена двух людей, для которых требуется вычислить оценку подобия. Введите в интерпретаторе Python такую команду:

>>> reload(recommendations)

>>> recommendations.sim_distance(recommendations.critics, … ‘Lisa Rose’,’Gene Seymour’)

0.148148148148

Это дает оценку подобия между Lisa Rose и Gene Seymour. Попробуйте другие имена, поищите людей, между которыми больше или меньше общего.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100