孙肖宁

相似度算法之欧几里得距离
欧几里得距离算法是经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间距离的远近,如图...
扫描右侧二维码阅读全文
10
2019/08

相似度算法之欧几里得距离

欧几里得距离算法是经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间距离的远近,如图:
ojld.png

注:图片来源于《集体智慧编程》

上图是在二维空间中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}$$

oujilide.jpeg

计算图

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))
Last modification:August 31st, 2019 at 06:26 pm
If you think my article is useful to you, please feel free to appreciate

4 comments

  1. thginWalker

    哈哈,怎么也学起相似度算法之类的ヾ(≧∇≦*)ゝ

    1. 孙肖宁
      @thginWalker

      最近想研究下关于智能推荐的做法

      1. thginWalker
        @孙肖宁

        挺好的OωO

  2. 孙肖宁

    部分公式小程序无法显示,请到web端查看。

Leave a Comment