相似度计算的若干函数
相似度计算的若干函数 - 小小的世界
相似度计算的若干函数
from math import sqrt
def sim_distance(p1,p2):
c=set(p1.keys())&set(p2.keys())
if not c:return 0
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())
if not c:return 0
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())
if not c:return 0
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())
if not c:return 0
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)
相关阅读:
浅析C++:private、protected和public
数据结构关于简单顺序表的构建(C++)
小小的项目——简单的注释转换
宏定义实现两数交换
简易小程序(将字符型数据转换为浮点型数据)
小小比较格式运算符及截图显示
python __call__() 方法
python_selenium简单的滑动验证码
scrapy 爬虫学习二[中间件的学习]
scrapy 爬虫学习一原文地址:https://www.cnblogs.com/lexus/p/2698728.html
最新文章
TextFormat
as3 字符串 根据分隔符分隔数据
自定义的BaseAdapter实现LIstView的展示
Flash打开新窗口 被浏览器拦截 navigateToURL被拦截
flex4, 错误2032, 流错误
array objct 对象数组
SpringMVC对静态资源文件的访问(配置)
Centos配置国内yum源
mariadb配置允许远程访问方式
spring 源码
热门文章
解决maven生成的web项目下的servlet.jar与tomcat自带servlet.jar冲突的问题
Mybatis 源码分析--crud
Mybatis 源码分析--Configuration.xml配置文件加载到内存
mybatis学习2
mybatis学习
SpringMVC 对比 struts2
将博客搬至CSDN
数据结构中顺序表与链表的性能方面比较
浅谈C++多态性
浅尝C++中重载、隐藏和覆盖