欧几里得距离算法是经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间距离的远近,如图:
注:图片来源于《集体智慧编程》
上图是在二维空间中6位用户对Snakes 和 Dupree 这两Item评价的直观体现
就其意义而言,欧几里得距离越小,两个用户相似度就越大,欧氏距离越大,两个用户相似度就越小。
在日常使用中,一般习惯于将相似度与1类比,相似度在数值上反映为0<=Similarity(X,y)<=1,越接近1,相似度越高;等于1时则表示两人具有一样的偏好。那么我们在使用欧几里得距离时,可以通过 1/(1+Distance(X,Y))来贯彻上一理念,加一是为了避免遇到被零整除的情况。
欧几里德距离是指多维空间两点间的距离,这是一种用直尺测量出来的距离。如果将两个点分别标记为$(p_1,p_2,p_3....p_n)$和$(q_1,q_2,q_3.....q_n)$,则欧几里德距离的计算公式为:
$$\sqrt{(p_1-q_1)^2+(p_2-q_2)^2...+(p_n-q_n)^2} = \sqrt{\sum_{i=1}^{n}(p_i-q_i)^2}$$
计算图
python代码的实现
#返回一个有关person1与person2的基于距离的相似度评价
def sim_distance(prefs,person1,persion2):
#得到shared_items的列表
si = {}
for item in prefs[person1]:
if item in prefs[persion2]:
si[item] = 1
#如果两者没有共同之处,则返回0
if len(si) == 0: return 0
#计算所有差值的平方和
sum_of_squares = sum([pow(prefs[person1][item]-prefs[persion2][item],2) for item in prefs[person1] if item in prefs[persion2]])
#返回(距离+1)的倒数
return 1/(1+sqrt(sum_of_squares))
4 条评论
哈哈,怎么也学起相似度算法之类的ヾ(≧∇≦*)ゝ
最近想研究下关于智能推荐的做法
挺好的OωO
部分公式小程序无法显示,请到web端查看。