個人的な正誤表 2章
とはいえ、個人的にこの本で扱っているテーマは非常に面白く出来れば学部生相手の教科書に使いたいと思うので、読んで直せた部分だけでも個人的な正誤表を作ってみようと思います。他にも教科書に使っている人がいるのであれば、共有した方がよりいいでしょうというくらいな気持ちで載せてみます。まずは2章からでも始めてみます。
個人的にはpythonインタープリタを起動し、対話的に代入してみたり関数呼んでみたりする場合は、pythonよりもipythonで行った方が楽だと思います。関数名とか変数名はTabで補完出きるし、上矢印で過去実行した文が呼び出せたりするので、打ち込む手間が省けますから。教科書として本に沿っていくと反復練習が発生するので。あと、オライリー本家にこの本で入力することになるソースコードやデータファイルがダウンロード出きるので、それもあわせて手元において勉強するのがベストでしょう。
それでは、間違えを載せておきますね。
p.9 実行部分
で、間違いはp.8の通りにコードを打ち込んでいるのなら、
critics['Toby']['Snakes on a Plane']=4.5
と代入するのはなんか意味ないですよね。すでにそのディクショナリのそのキーの値は4.5なのですから。
次の行で
critics['Toby']
の値を見たなら
{'Snakes on a Plane': 4.5, 'Superman Returns': 4.0, 'You, Me and Dupree': 1.0}
となるべきです。本ではSuperman Returnsがなぜか消えてますね。
p.10 実行部分
TobyとLaSalleの距離を求める時の彼等の座標がいきなり整数値に丸めらてしまっています。しかも、Tobyは(1,4.5)でLaSalleは(2,4)なので、あえて丸めるなら
sqrt(pow(5-4,2)+pow(1-2,2))
1.4142135623730951
となるべきです。本だと座標の値がずれていますよね。
さらに厳密にいえば、
sqrt(pow(4.5-4,2)+pow(1-2,2))
1.1180339887498949
でしょうね。
p.11 上の実行部分
0で割ることが起きるのを防ぐコード部分。これもp.10の続きなのでこれも厳密には間違い。
1/(1+sqrt(pow(4.5-4,2)+pow(1-2,2)))
0.47213595499957939
となるべきかな。
p.11 真ん中のコードを紹介している部分
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])
の部分は
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in si])
とした方が理解が出きると思うのですが。Python初学者にリスト内表記を強要している時点で分かりにくいですけどね。Python分かってくるとリスト内表記にしたくなりますが。でも、アルゴリズムを教えたいのなら、あえてネストにしてもいいと思うけど。まぁ、とりあえずリスト内表記にするなら、こっちの方がいいかなと。
さらに、その下に間違いがあります。さっき上で例題を出してまで強調したのに、肝心のコードが間違ってますね。
return 1/(1+sqrt(sum_of_squares))
が正解。
p.11 下の実行部分
ここでいきなりreload()が出てくる。そもそも著者はどのようにコードを編集して、Pythonインタープリタと対話させること想定しているのだろう。どちらにしても、いつrecommendationsをimportしたのか?本には一度も出てきてない。エディタを開きながら本のコードを記入して、別のウィンドウかシェルでpythonを実行するのを想定しているとするならば、始めてモジュールを利用するのだから、
import recommendations
recommendations.sim_distance(recommendations.critics,'Lisa Rose','Gene Seymour')
あるいはcriticsディクショナリとsim_distance関数は両方使うので最初から
from recommendations import *
sim_distance(critics,'Lisa Rose','Gene Seymour')
かなぁと思うのですが?ちなみに前述した通り距離関数にsqrtが入っていないので、結果は本の値ではなく
0.29429805508554946
となるのが正しいはずです。
とにかく、以降のreload()は自分がどのように実行しているかによって、適宜読み替えるのが吉。
p.17 実行部分
二回目のgetRecommendations()は距離関数をsim_distanceに戻したので、前述した箇所を変えていないと値が違っているはずです。正しくは、
getRecommendations(critics,'Toby',similarity=sim_distance)
[(3.457128694491423, 'The Night Listener'),
(2.7785840038149239, 'Lady in the Water'),
(2.4224820423619167, 'Just My Luck')]
じゃないでしょうか。
そもそも2.4と2.7.2は
推薦度の考え方が怪しいような気がします.時間を見つけて検討したい.とりあえず本にあるコードの通りやりたいのなら上記の誤植を直せば試せます.
del.icio.usのAPI関連とMovieLensのデータセット
del.icio.usのAPIを使った実行部分は今現在のデータをとってくるのでもちろん本の通りの実行結果にはならないので適宜確認しながら行いましょう。
p.28のコードですが、当たり前すぎますが、データセットへのpathを指定していますので、自分がどのディレクトリにMovieLensのデータを展開したのか確認してからコードを変えましょう。