ピアソン係数を使ってLisa RoseとGene Seymourの相関スコアを得たいのですが以下のようなエラーが出てしまいます。 どこが間違っているのかわからない状態です。ご回答のほどよろしくお願いします。
^
python
1critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a Plane':3.5, 2'Just My Luck':3.0, 'Superman Returns':3.5,'You, Me and Dupree':2.5, 3'The Night Listener':3.0}, 4 5'Gene Seymour':{'Lady in the Water':3.0,'Snakes on a Plane':3.5, 6'Just My Luck':3.0, 'Superman Returns':5.0,'You, Me and Dupree':3.5, 7'The Night Listener':3.0}, 8 9'Michael Phillips':{'Lady in the Water':2.5,'Snakes on a Plane':3.0, 10 'Superman Returns':3.5, 11'The Night Listener':4.0}, 12 13'Claudia Puig':{'Snakes on a Plane':3.5, 14'Just My Luck':3.0, 'Superman Returns':4.0,'You, Me and Dupree':2.5, 15'The Night Listener':4.5}, 16 17'Mick LaSalle':{'Lady in the Water':3.0,'Snakes on a Plane':4.0, 18'Just My Luck':2.0, 'Superman Returns':3.0,'You, Me and Dupree':2.0, 19'The Night Listener':3.0}, 20 21'Jack Mtthews':{'Lady in the Water':3.0,'Snakes on a Plane':4.0, 22 'Superman Returns':5.0,'You, Me and Dupree':3.5, 23'The Night Listener':3.0}, 24 25'Toby':{'Snakes on a Plane':4.5, 26 'Superman Returns':4.0,'You, Me and Dupree':1.0,}} 27 28# ここから処理 29 30from math import sqrt 31#person1とperson2の距離を基にした類似性スコアを返す 32def sim_distance(prefs,person1,person2): 33 # 二人とも評価しているリストを得る 34 si={} 35 for item in prefs[person1]: 36 if item in prefs[person2]: 37 si[item]=1 38 39# 両者ともに評価しているものがなければ0を返す 40 if len(si)==0: return 0 41# 全ての差の兵法を足し合わせる 42 sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 43 for item in prefs[person1] if item in prefs[person2]]) 44 45 return 1/(1+sum_of_squares) 46 47#ピアソン相関係数 48# p2とP1のピアソン相関係数を返す 49def sim_pearson(prefs,p1,p2): 50 #両者がお互いに評価しているアイテムのリストを取得 51 si={} 52 for item in prefs[p1]: 53 if item in prefs[p2]: si[item]=1 54#要素の数を調べる 55 n=len(si) 56 57 58#ともに評価しているアイテムがなければ0を返す 59 if n==0: return 0 60 61# 全ての嗜好を合計する 62 sum1=sum([prefs[p1][it] for it in si]) 63 sum2=sum([prefs[p2][it] for it in si]) 64#平方を合計する 65 sum1Sq=sum([pow(prefs[p1][it],2) for it in si]) 66 sum2Sq=sum([pow(prefs[p1][it],2) for it in si]) 67#積を合計する 68 pSum=sum([prefs[p1][it]*prefs[p2][it]for it in si]) 69#ピアニソンによるスコアを計算する 70 num=pSum-(sum1*sum2/n) 71 den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n)) 72 if den==0: return 0 73 74 r=num/den 75 76 return r
terminal
1>>> import recommendations 2>>> from importlib import reload 3>>> reload(recommendations) 4<module 'recommendations' from '/Users/kajimurarita/Desktop/python_project/recommendations.py'> 5>>> recommendations.topMatches(recommendations.critics,'Toby',n=3) 6Traceback (most recent call last): 7 File "<stdin>", line 1, in <module> 8 File "/Users/kajimurarita/Desktop/python_project/recommendations.py", line 81, in topMatches 9 scores=[(similarity(prefs,person,other),other) 10 File "/Users/kajimurarita/Desktop/python_project/recommendations.py", line 81, in <listcomp> 11 scores=[(similarity(prefs,person,other),other) 12 File "/Users/kajimurarita/Desktop/python_project/recommendations.py", line 71, in sim_pearson 13 den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n)) 14ValueError: math domain error 15
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/16 12:01