实在不能理解为啥搜狗输入法每次我打biji的时候总是给我跳出荸荠(qi) (づ ̄ 3 ̄)づ,还有biaoshi,总是出标识(zhi)..╭(╯^╰)╮哼
- 基于距离的相似度计算
prefs[person][item]
数据集格式如下:
example:
aaaa={‘WANG’:{‘Lady in the Water’:3,’HAHA story’:2},…}
from math import sqrt
传入参数:
prefs person1 person2
我们要计算两个人的品味相似程度,首先要找到有没有相同的item,如果没有,那么则返回0
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0:
return 0
如果有相同的item,我们得到相应的score,可以计算其欧式距离:
totalsum=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person]])
因为要返回一个0-1值的函数,0代表很差,1代表口味完全相同,而上述的欧式距离是距离越小口味越相近,距离为0时口味相同
return 1/(1+sqrt(totalsum))
- pearson相关系数
仅仅计算距离是不够的,假设person1对item评价为1.2,2.3,3.6,person2对item评价为:2.2,3.3,4.6,实际上这两个人的口味相同,但是person2评价稍高,用上述方法计算则会出现很大的误差,这时候我们引入一个相关系数的概念来修正“夸大分值”的情况。
(PS:为啥我打xishu总是出现洗漱,╭(╯^╰)╮)
pearson相关系数是判断两组数据与某一直线拟合程度的一种度量,它在数据不是很规范的时候,会倾向于给出更好的结果
采用第四种计算方法:
def pearson_distance(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]:
si[item]=1
n=len(si)
if n==0:
return 0
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
sum1sq=