Scipy 是最快的!
我对上面的代码以及在我的 comp 中找到的版本进行了一些测试,结果和代码见下文:
皮尔逊 14.7597990757
sim_pearson 15.6806837987
scipy:pearsonr 0.451986019188
尝试:
导入 psyco
psyco.full()
导入错误除外:
经过
从数学导入 sqrt
def sim_pearson(set1, set2):
si={}
对于 set1 中的项目:
如果 set2 中的项目:
si[项目] = 1
#元素个数
n = 长度 (si)
#如果没有共同点,返回0相似度
如果 n == 0:返回 0
#把所有的偏好加起来
sum1 = sum([set1[item] for item in si])
sum2 = sum([set2[item] for item in si])
#对正方形求和
sum_sq1 = sum([pow(set1[item], 2) for item in si])
sum_sq2 = sum([pow(set2[item], 2) for item in si])
#总结产品
sum_p = sum([set1[item] * set2[item] for item in si])
标称 = sum_p - ((sum1 * sum2) / n )
den = sqrt( (sum_sq1 - (sum1)**2 / n) * (sum_sq2 - (sum2)**2 / n) )
如果 den==0:返回 0
返回名义/登
# 来自 http://stackoverflow.com/questions/1307016/pearson-similarity-score-how-can-i-optimise-this-further
定义皮尔逊(v1,v2):
vs = [(v1[val],v2[val]) for val in v1 if val in v2]
n = 长度 (vs)
如果 n==0:返回 0.0
sum1,sum2,sum1_sq,sum2_sq,p_sum = 0.0, 0.0, 0.0, 0.0, 0.0
对于 v1,v2 在 vs 中:
和1+=v1
sum2+=v2
sum1_sq+=v1*v1
sum2_sq+=v2*v2
p_sum+=v1*v2
# 计算皮尔逊分数
num = p_sum-(sum1*sum2/n)
temp = max((sum1_sq-pow(sum1,2)/n) * (sum2_sq-pow(sum2,2)/n),0)
如果温度:
返回 num / sqrt(temp)
返回 1.0
如果 __name__ == "__main__":
导入时间
tsetup = """
从随机导入 randrange
从 __main__ 进口皮尔逊,sim_pearson
从 scipy.stats 导入 pearsonr
v1 = [randrange(0,1000) for x in range(1000)]
v2 = [randrange(0,1000) for x in range(1000)]
#gc.enable()
"""
t1 = timeit.Timer(stmt="pearson(v1,v2)", setup=tsetup)
t2 = timeit.Timer(stmt="sim_pearson(v1,v2)", setup=tsetup)
t3 = timeit.Timer(stmt="pearsonr(v1,v2)", setup=tsetup)
tt = 1000
打印“皮尔逊”,t1.timeit(tt)
打印“sim_pearson”,t2.timeit(tt)
打印 'scipy:pearsonr', t3.timeit(tt)