相似度计算的若干函数

相似度计算的若干函数

from math import sqrt

def sim_distance(p1,p2):

c=set(p1.keys())&set(p2.keys())

ifnot c:return0

sum_of_squares=sum([pow(p1.get(sk)-p2.get(sk),2) for sk in c])

p=1/(1+sqrt(sum_of_squares))

return p

def sim_distance_pir(p1,p2):

c=set(p1.keys())&set(p2.keys())

ifnot c:return0

s1=sum([p1.get(sk)for sk in c])

s2=sum([p2.get(sk)for sk in c])

sq1=sum([pow(p1.get(sk),2) for sk in c])

sq2=sum([pow(p2.get(sk),2) for sk in c])

ss=sum([p1.get(sk)*p2.get(sk) for sk in c])

n=len(c)

num=ss-(s1*s2/n)

den=sqrt((sq1-pow(s1,2)/n)*(sq2-pow(s2,2)/n))

#print s1,s2,sq1,sq2,ss,n,num,den

if den==0:return 0

p=num/den

return p

def sim_distance_jacc(p1,p2):

c=set(p1.keys())&set(p2.keys())

ifnot c:return0

ss=sum([p1.get(sk)*p2.get(sk) for sk in c])

sq1=sum([pow(sk,2) for sk in p1.values()])

sq2=sum([pow(sk,2) for sk in p2.values()])

p=float(ss)/(sq1 + sq2 - ss)

return p

def sim_distance_cos(p1,p2):

c=set(p1.keys())&set(p2.keys())

ifnot c:return0

ss=sum([p1.get(sk)*p2.get(sk) for sk in c])

sq1=sqrt(sum([pow(sk,2) for sk in p1.values()]))

sq2=sqrt(sum([pow(sk,2) for sk in p2.values()]))

p=float(ss )/(sq1*sq2)

return p

#

#a={'a':4.5,'b':1.0,'c':7}

from distance import *

def topsimilar(item,data,n=5,sim_func=sim_distance):

score=[(sim_func(data.get(item),data.get(ik)),ik) for ik in data.keys() if ik!=item]

score.sort()

score.reverse()

return score

prefs= {

"A" : { "1" : 3, "2" : 4 , "3" : 0, "4":3, "5":3},

"B" : { "1" : 2, "2" : 3 , "3" : 2},

"C" : {"1" : 2, "2" : 4, "3" : 4, "4":3, "5":0},

"D" : {"1" : 0, "2" : 4, "3" : 0, "4": 2, "5":4}

}

print topsimilar('A', prefs,)

print topsimilar('A', prefs,sim_func=sim_distance_pir)

print topsimilar('A', prefs,sim_func=sim_distance_cos)

print topsimilar('A', prefs,sim_func=sim_distance_jacc)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
  1. 本站完全免费,所有资源仅用于学习,如需商用,请购买版权
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
  2. 本站为非经营性网站,没有任何付费项目
    本站为非经营性网站,如果觉得我们网站好,请转发到朋友圈让更多的人知道。
  3. 本站站长联系方式
    站长邮箱 liujun100@vip.qq.com
    商业合作 service@yuucn.cn
    投诉举报 jb@yuucn.cn

    我们这个网站不卖,请不要幻想着收购我们。

评论(0)

提示:请文明发言