شما اینجا هستید

نرخ فاصله اقلیدسی

یک راه خیلی ساده برای محاسبه میزان شباهت این است که از نرخ فاصله اقلیدسی استفاده کنیم.

در این حالت چند آیتم که افراد به طور معمول رای داده اند انتخاب می شوند و از آنها به عنوان محور های چارت استفاده می کنیم.شما سپس می توانید افراد را روی چارت رسم کنید و ببینید چقدر به هم نزدیک هستند. این مورد در تصویر ۲-۱ نشان داده شده است.

تصویر ۲-۱ . افزاد در فضای ترجیحات

این تصویر نشان می دهد که افراد در فضای ترجیهات رسم شده اند. Toby در ۴.۵ روی محور Snakes رسم شده استو در ۱.۰ روی محور Dupree است. دو فردی که در فضای ترجیهات نزدیک به هم قرار دارند ترجیهات شبیه تری به هم دارند. به دلیل اینکه چارت دو بعدی است، شما تنها می توانید به دو امتیاز در هر مرحله نگاه کنید. اما اصل قضیه برای مجموعه داده های بزرگتر یکسان است.

برای محاسبه فاصله بین Toby و Lasalle در چارت، تفاوت در هر محور را محاسبه می کنیم، مقدار به دست آمده در هر محور را مربع می کنیم و همه را با هم جمع می کنیم، سپس جذر مقدار نهایی به دست آمده را محاسبه می کنیم. در پایتون شما می توانید از تابع

pow(n,2)

برای مربع کردن یک عدد استفاده کنید و برای محاسبه جذر از تابع sqrt استفاده کنید:

>> from math import sqrt
>> sqrt(pow(5-4,2)+pow(4-1,2))
3.1622776601683795 

این فرمول فاصله را محاسبه می کند. که نتیجه هرچه کوچکتر باشد افراد بیشتر به هم شبیه هستند.

ما نیاز به این داریم که برای افرادی که بیشتر به هم شبیه هستند عدد بزرگتر باشد. اینکار با افزودن ۱ به تابع امکان پذیر است ( به این شکل دیگر خطای تقسیم بر صفر نیز نخواهیم داشت) و آنرا معکوس می کنیم:

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

این تابع جدید همیشه یک مقدا بین صفر تا یک برمیگرداند. در اینجا مقدار یک به معنی ترجیهات یکسان است. شما می توانید همه چیز را برای ساخت یک سیستم پیشنهاد کنار هم قرار دهید.

کد زیر را به فایل recommendation.py اضافه کنید:

from math import sqrt

# Returns a distance-based similarity score for person1 and person2

def sim_distance(prefs,person1,person2):
# Get the list of shared_items

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

        # if they have no ratings in common, return 0
        if len(si)==0: return 0
        # Add up the squares of all the differences

   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) 

این تابع را می توانید با دو نام برای یافتن امتیاز شباهت استفاده کنید. در مفسر پایتون بنویسید:

>>> reload(recommendations)
>>> recommendations.sim_distance(recommendations.critics, 
...
'Lisa Rose','Gene Seymour')
0.148148148148

همانطور که میبینید کد بالا به شما نرخ شباهت بین Lisa Rose و Gene Seymour را می دهد. سعی کنید با نام های دیگر برنامه را امتحان کنید و افرادی که کمتر و بیشتر شبیه به هم هستند را بیابید

دیدگاه جدیدی بگذارید