Programming Collective Intelligence#1

というわけでノロノロと読み始め。キーワードは本当はPCIが正しいんだけどなんか後からヤヤコシクなりそうなのでCIPにしてる。
サンプルコードは
http://examples.oreilly.com/9780596529321/PCI_Code.zip
にある。

1. Introduction to Collective Intelligence

まあ導入ということで基本的には、何をイマサラ、な内容。流しつつ読む。

  • Netflixとか Googleとか
    • 共通項 = "人々から収集した膨大なデータを巧みに処理するアルゴリズム" を利用
    • 凄いコラボ and ユーザや顧客の理解
    • 日進月歩
    • machine learning や統計の手法が重要。特に世界中の人々が吐き出す膨大な情報を解釈したり組織化することが重要
  • Collective Intelligenceとは?
    • 集合知自体は別にインターネット以前でも不可能ではなかった
      • 金融市場が例:値段を決めているのは1個人でもなければ,統一体があるわけでもない。個々の人々の集合。
    • ネット上では、買い物するとか、研究や単なる面白いものを調べるとか、Webサイトを作るとかが日々行われているが、これらの情報を利用者を明示的な「アンケート」などで邪魔せずに収集できる=障壁が低い

これ結構重要。障壁が低いということは、生物、という怠け者の頂点に立った存在を対象にする場合大きい。
#というか、自然界全体が「怠け者」キーワードで出来上がっている気もする

  • Machine Learning?
    • AIの一分野で「学習」がテーマ
    • 過去のデータからパタンを読み取って、将来起こるデータを予想
    • モデルを用意し、これを訓練することで変化させ学習
    • spam filterの例
    • アルゴリズムには決定木のような透過な奴(中で何が起こってるかわかる)と、ニューラルネットのようなブラックボックスな奴(何が起こってるかわかりにくい)がある。
  • Machine Learningの限界
    • 現在あるパターン・モデルにあってるものしか分類できない(当たり前)
    • 過学習の危険性

propensity = 傾向 (知らなかった・・・) over generalizationって本来なんて訳すんだろう? そのまんま過度の一般化?

  • 現実世界での例とか
  • 他の使い道とか

2. Making Recommendations

以降はPython使って実習編。まずはあるユーザへの「おすすめムービー」を計算で出す、というテーマを通して類似度とかを勉強。Collaborative Filteringとか言うらしい。
2段階で行う。

  1. 適当な類似度を設定し、全ユーザについてこの類似度を計算。これをソートしてターゲットユーザと傾向が似ている人を抽出する
  2. 類似度で重み付けして各評価の和を取り正規化する

類似度については単純なユークリッド距離と、相関係数(ピアソンの積率相関係数)を利用する。

これね、\mu = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2+\cdots+(x_n-y_n)^2}

    • ただ、この本では 類似度関数は「近いほど大」にするため、1/μを使っている。この関係で(zero divide避ける意味で) 1/(1+μ)を使っている。

ついでに本文のプログラムはtypoってる。sqrt()のところが *sqr*t()とかわけのわからんものになっている。しかも、ダウンロードサイトのサンプルプログラムは sqrtしてねぇぇぇぇぇぇ。まあ、一貫してればどうでもいいんだろうけどさ(日本語版はどうなってるんだろう?)。

 r = \frac{\sum_i \left(x_i - \bar{x}\right)\left(y_i - \bar{y}\right)}{\sqrt{\sum_i \left(x_i - \bar{x}\right)^2} \sqrt{\sum_i \left(y_i - \bar{y}\right)^2}

一見ややこしいんだけど、ヨーク見ると単なるベクトルの内積を正規化したもの(=cos)。平均値ベクトルからの偏差ベクトルどうしのcosなので、バイアス分除いた同じっぽい度が得られるという仕組み。こっちはifで場合わけして分母が0なら0を返すようにしているみたい。

  • 類似度に使えるものとして、他にもManhattan距離やJaccard係数なんかがある。どれが良いかは対象次第。

http://en.wikipedia.org/wiki/Metric_%28mathematics%29#Examples
に他の方法とかあるらしい。

  • サンプルの実装はこの類似度をリスト内包で全ユーザについて計算し、リスト作成 -> sort -> reverse -> 上から n個を返す、としている。
    • 似たもの同志がわかった!
  • でも似たものわかっただけじゃダメじゃん → そうそう目的は「おすすめムービー」だった。
    • [続く]

追記:括弧の位置が間違ってた。ハズぃ。