前言
有些时候我们需要获得一些事物的相似度评价值,例如我们可以获取到大量的数据用以分析人们在品味方面的相似度,为此,我们可以将没个人与所有其他人进行对比,并计算他们的相似度评价。有很多种方法能够帮助我们来实现这个目的,而我们今天要提到的则是欧几里得距离和皮耶尔逊相关度,同时作为引申,简单地涉及一些曼哈顿距离的算法。
欧几里德距离
计算相似度评价值的一个非常简单的方法是使用欧几里德距离的评价方法,因为很多人都用了那个书上的例子,但是如果没看过这本书的人没有看前面的介绍可能理解起来也不那么舒服,因为这个算法本身很简单所以在此我使用一个更简单的图来解释一下这个 算法。下面这个图 是对两种性格的评价,一共有四个人对此作出了评价,A,B,C,D。图上很明显的表现出来了。
那么我们如何判断这些人对一些性格的相关度呢?这里的欧几里得算法其实质就是一个简单粗暴的方法。我们简单看一下这个算法的定义:1欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。对,其实说白了就是两个点之间的距离。(当然,这里我们所说的仅限于二维和三维空间)。
以上就是其公式。使用欧几里得算法要注意的有一点的是,在使用欧几里得距离时需要十分注意不能对不同单位的量度使用,比如常见的容易混淆的身高体重之类。
下面是其实现的代码:
from math import sqrt#需要使用开方
def sim_distance(prefs,person1,person2)
si = {}#准备一个列表
for item in prefs[person1]:
if item in prefs[person2]:
si[item] = 1
if len(si) == 0: return 0#两者没有共同之处,返回0
sum_of_squares = sum([pow(prefs[person1][item]-pow(prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])
return