今天看了一篇文章写的挺好的,所以自己总结一下,发出来大家一起学习一下
欧几里德距离(百度来的哦):欧几里得度量(euclidean metric)(也称欧式距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离),在二维和三维空间中的欧氏距离就是两点之间的实际距离。
计算相似度评价值的一个非常简单的方法就是欧几里德距离评估法,它以经过人们一致评价的物品作为坐标轴,然后将参与评价的人绘制在图上,并考察他们彼此的距离,如下图所示
该图显示了人员的分布情况,Toby在Snakes轴上和Dupree轴上坐标值为:4.5,1.0,在图中两人距离越近,他们兴趣偏好就约相近。
为了计算图上Toby和LaSalle之间的距离,我们计算出每一轴向上得差值,穷平方后再相加,最后对总和取平方根。
在python中可以使用pow(n,2)对某数求平方,并使用sqrt函数求平方根:
>>> from math import sqrt >>> sqrt(pow(4.5-4,2)+pow(1-2,2)) 1.118033988749895
上述代码可以计算出距离值,偏好越相近的人,距离就越短。不过,我们还需要一个函数,来对偏好越相近的情况给出最大的值,为此,我们可以将函数值加1(这样避免遇到被零整除的错误),并取其倒数:
>>> 1/(1+sqrt(pow(4.5-4,2)+pow(1-2,2))) 0.4721359549995794
这个数字的值总是在0和1 之间,返回1则表示两人具有相同的爱好,下面的代码是计算相似度的函数。
from math import sqrt #先定义一个字典,里面是用户的评价 critics = { 'Lisa Rose': {'Lady in the Water':2.5, 'Snakes on a Plane':3.5, 'Just My Luck':3.0, 'Superman Returns':3.5,'You, Me and Dupree':2.5, 'The Night Listener':3.0}, 'Gene Seymour': {'Lady in the Water':3.0, 'Snakes on a Plane':3.5, 'Just My Luck':1.5, 'Superman Returns':5.0,'You, Me and Dupree':3.0, 'The Night Listener':3.5}, 'Michael phillips': {'Lady in the Water':2.5, 'Snakes on a Plane':3.0, 'Superman Returns':3.5,'The Night Listener':4.0}, 'Claudia Puig': {'Snakes on a Plane':3.5, 'Just My Luck':3.0, 'Superman Returns':4.0,'The Night Listener':4.5,'You, Me and Dupree':2.5}, 'Toby': {'Snakes on a Plane':4.5, 'Superman Returns':4.0,'You, Me and Dupree':1.0} } #本函数来计算用户相似度 def sim_distance(prefs,preson1,preson2): #得到shared_items的列表 si = {} for item in prefs[preson1]: if item in prefs[preson2]: si[item]=1 #无相似度返回0 if len(si) == 0: return 0 #求平方和 sum_of_squares = sum([pow(prefs[preson1] [item]-prefs[person2] [item],2) for itme in prefs[preson1] if item in prefs[preson2]]) print sum_of_squares return 1/(1+sqrt(sum_of_squares))