『集合知プログラミング』をR言語で書く

集合知プログラミング

集合知プログラミング

といっても、実は発注したばかりで手元に届いていない。
Pythonのコードが載っているそうだけど、自分でやるならR言語で書き直すことになる。
ググってみるとすでに R で書こうとしている方(id:mrkn:20080725:collective_intelligence_in_gnu_r)や Perl で書いている方(id:ksmemo:20080804:p1)、Rubyで書いている方々(id:ma2:20071016:p1、id:mrkn:20080722)などが見つかった。どちらも類似性の高い評者を抽出するしくみの箇所らしい。

私がRで書くならこんな感じかな。

# データの用意
Lisa.Rose        <- c(2.5, 3.5, 3.0, 3.5, 2.5, 3.0)
Gene.Seymour     <- c(3.0, 3.5, 1.5, 5.0, 3.5, 3.0)
Michael.Phillips <- c(2.5, 3.0, NA, 3.5, NA, 4.0)
Claudia.Puig     <- c(NA, 3.5, 3.0, 4.0, 2.5, 4.5)
Mick.LaSalle     <- c(3.0, 4.0, 2.0, 3.0, 2.0, 3.0)
Jack.Matthews    <- c(3.0, 4.0, NA, 5.0, 3.5, 3.0)
Toby             <- c(NA, 4.5, NA, 4.0, 1.0, NA)
critics          <- cbind(Lisa.Rose, Gene.Seymour, Michael.Phillips, Claudia.Puig,
                          Mick.LaSalle, Jack.Matthews, Toby)
rownames(critics)<- c("Lady.in.the.Water", "Snakes.on.a.Plane", "Just.My.Luck",
                      "Superman.Returns", "You.Me.and.Dupree", "The.Night.Listener")
critics

# 類似性スコアの算出
(critics.dist     <- 1/(1+dist(t(critics))^2))

# 相関係数の算出
(critics.cor <- cor(critics, use="pairwise.complete.obs"))

# 類似性スコアから"Toby"にマッチするもの上位三つ
head(sort(as.matrix(critics.dist)[,"Toby"], decreasing=TRUE)[-ncol(critics)],3)

# 相関係数から"Toby"にマッチするもの上位三つ
head(sort(critics.cor[,"Toby"], decreasing=TRUE)[-1],3)

気が向いたらデータはcsvファイルから読み込んで、処理は一つの関数にまとめるようにしてみる。

それと、理屈でいえばピアソンの積率相関係数よりもスピアマンの順位相関係数のほうが適切なはずだからそれを試してみる。類似性スコアもユークリッドだけじゃなくてマンハッタン距離やキャンベラ距離、ミンコフスキー距離も試してみたい。