مسئله
میخواهیم شباهت فیلمها را با توجه به امتیازات کاربران به آنها در مجموعه دادهای ratings_grade_inflation2 که جزئیات آن در داده کاوی - ۳ - جزئیات دیتاستها در دسترس است محاسبه کنیم.
u1 | u2 | u3 | u4 | |
---|---|---|---|---|
Interstellar | 1 | 2 | 3 | 4 |
Inception | 1 | 2 | 3 | 4 |
Hangover | 4 | 3 | 2 | 1 |
با نگاهی کوتاه به نظرات کاربران میتوان به این نتیجه رسید که شباهت دو فیلم interstellar و inception بیشتر از شباهت interstellar و hangover هست، به عبارتی در بهترین حالت انتظار داریم معیار ما شباهت کامل را برای دو فیلم interstellar و inception نتیجه دهد و عدم شباهت کامل برای دو مورد بعدی زیرا نظر کاربران برای دو فیلم interstellar و inception کاملا مشابه و برعکس نظر هر کاربر برای interstellar و hangover متفاوت بوده.
ابتدا با روش شباهت کسینوسی که در داده کاوی - ۵ - شباهت کسینوسی به شرح آن پرداختیم میزان شباهت فیلمها را محاسبه میکنیم و به نتیجه زیر میرسیم.
Interstellar-Inception:1.000000
Interstellar-Hangover:0.666667
خروجی بدست آمده به نتاج مورد نظر ما نزدیک است، همانطور که انتظار داشتیم میزان شباهت Interstellar-Inception برابر شباهت کامل یعنی مثبت یک شد ولی برای دو فیلم Interstellar-Hangover که انتظار عدم شباهت کامل یعنی منفی یک را داشتیم عدد مثبت 0.666 حاصل شد!
فرمول شباهت کسینوسی تعدیل یافته یا Adjusted Cosine Similarity
در فرمول بالا برابر میانگین مقادیر ثبت شده برای ویژگی i است که در مثال ما برابر میانگین امتیازات یک فرد مثل alireza است. در روش شباهت کسینوسی تعدیل شده با کم کردن میانگین امتیازات کاربر از امتیازهایش سعی شده تا مشکل تورم درجه حل شود.
پیادهسازی شباهت کسینوسی تعدیل یافته در پایتون
def mean(lst):
return sum(lst) / len(lst)
def dot(A,B,a_mean,b_mean):
return (sum((a-a_mean)*(b-b_mean) for a,b in zip(A,B)))
def get_adjusted_cosine_similarity(rating1,rating2):
a = rating1.values()
a_mean = mean(a)
b = rating2.values()
b_mean = mean(b)
return dot(a,b,a_mean,b_mean) / ( (dot(a,a,a_mean,a_mean) **.5) * (dot(b,b,b_mean,b_mean) ** .5) )
همانطور که مشاهده میکنید تغییر اصلی متد شباهت کسینوسی که در داده کاوی - ۵ - شباهت کسینوسی مطرح شد شامل اضافه شدن تابع mean برای محاسبهی میانگین امتیازات دو کاربر و کم کردن میانگین امتیازات هر فرد زمان استفاده از امتیاز اوست.
حال مجددا میزان شباهت را با استفاده از روش شباهت کسینوسی تعدیل یافته با متد get_adjusted_cosine_similarity بدست میآوریم.
Interstellar-Inception:1.000000
Interstellar-Hangover:-1.000000
همانطور که مشاهده میکنید جواب بدست آمده با روش کسینوسی تعدیل یافته برابر جواب مورد انتظار ما است یعنی شباهت کامل دو فیلم Interstellar و Inception و عدم شباهت کامل Interstellar و Hangover.