ここではtopMatches関数を移植するわけですが、その前に13ページの下記の記述について疑問を挙げておきます。
ピアソン相関係数を利用する上で興味深いことの一つとして、よい成績の大盤振る舞いによる誤差を修正してくれるという点が挙げられる。
それは全く正しいんだけれど、文脈上、距離を使った場合はそうでないように読めてしまうのに違和感がある。
評者ごとに評点の中心化を行えば、距離を使っても個人差は補正できるはず。
なので、topMatches関数に評者ごとに評点の中心化を行ってから算出した距離も利用できるようにオプションを付けてみました。
# 指定した評者に好みの似た順のリストを出す関数。 # prefs 行が作品、列が評者のマトリクス # person 対象者 # n 出力する上位からの件数。既定値は3。 # similarity 類似性の指標。既定値はピアソンの積率相関係数。 # "euclidean" ユークリッド平方距離 # "euclidean.center" 評者ごとに中心化したユークリッド平方距離 # "manhattan" マンハッタン距離 # "manhattan.center" 評者ごとに中心化したマンハッタン距離 # "pearson" ピアソンの積率相関係数 # "spearman" スピアマンの順位相関係数 # "kendall" ケンドールの順位相関係数 topMatches <- function(prefs, person, n=3, similarity="pearson"){ switch(similarity, "euclidean" = sim.index <- as.matrix(1/(1+dist(t(prefs))^2)), "euclidean.center" = sim.index <- as.matrix(1/(1+dist(t(scale(prefs, scale=FALSE)))^2)), "manhattan" = sim.index <- as.matrix(1/(1+dist(t(prefs), method="manhattan"))), "manhattan.center" = sim.index <- as.matrix(1/(1+dist(t(scale(prefs, scale=FALSE)), method="manhattan"))), "pearson" = sim.index <- cor(prefs, use="pairwise.complete.obs"), "spearman" = sim.index <- cor(prefs, use="pairwise.complete.obs", method="spearman"), "kendall" = sim.index <- cor(prefs, use="pairwise.complete.obs", method="kendall") ) diag(sim.index) <- 0 head(sort(sim.index[,person], decreasing=TRUE),n) }
使い方。ピアソンの積率相関係数に基づいてTobyと好みの似た人を3位まで出力する場合。
topMatches(critics, "Toby") # 出力 # Lisa.Rose Mick.LaSalle Claudia.Puig # 0.9912407 0.9244735 0.8934051
評者ごとに中心化したマンハッタン距離に基づいてTobyと好みの似た人を5位まで出力する場合。
topMatches(critics, "Toby", 5, "manhattan.center") # 出力 # Mick.LaSalle Lisa.Rose Claudia.Puig Michael.Phillips Jack.Matthews # 0.1875000 0.1500000 0.1500000 0.1333333 0.1260504