Scipyは最速です!
上記のコードと、コンプで見つけたバージョンを使用していくつかのテストを行いました。結果とコードについては、以下を参照してください。
ピアソン 14.7597990757
sim_pearson 15.6806837987
scipy:pearsonr 0.451986019188
試す:
輸入サイコ
psyco.full()
ImportError を除く:
合格
数学インポート平方根から
def sim_pearson (セット 1、セット 2):
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])
nom = 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 v1 の val if v2 の val]
n = レン(対)
n==0 の場合: 0.0 を返す
sum1,sum2,sum1_sq,sum2_sq,p_sum = 0.0, 0.0, 0.0, 0.0, 0.0
vs の v1、v2 の場合:
sum1+=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)
一時的な場合:
戻り値 / sqrt(temp)
1.0を返す
if __name__ == "__main__":
輸入時間
tsetup = """
from random import randrange
from __main__ import pearson, sim_pearson
from scipy.stats import pearsonr
v1 = [Randrange(0,1000) for x in range(1000)]
v2 = [range(1000) 内の x の randrange(0,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
print 'ピアソン', t1.timeit(tt)
print 'sim_pearson', t2.timeit(tt)
print 'scipy:pearsonr', t3.timeit(tt)