PRML 4.1 の最小二乗法&フィッシャーの線形判別を試してみた

社内でやってる PRML 読書会が4章に入って、Fisher の線形判別分析(LDA)とかをちょうどやっつけたところ。
4.1.5 で Fisher's LDA と「最小二乗との関連」をわざわざ述べているのはどうして? というあたりで、最小二乗と互換性があるということはそれだけで理論的裏付けになるし(分散最小化)、あるいは(もしも)確率化したいときに加法性のガウスノイズを想定することもできたりするよね、的な話をしたりしてた(的外れなら乞うツッコミ)。


で、ぶっちゃけ単純な最小二乗と Fisher's LDA だと具体的にどれくらい違うんだろうねえ、という話になって、そりゃあデータ数の多いクラスタに決定面が寄るんだろうねえ、と推測。
それくらいなら簡単に確かめられるんだから、ちょっこり R でスクリプトを書いてみた。

library(MASS);
blue <- 50
red <- 100
x1 <- mvrnorm(blue, c(1,3), matrix(c(2,0,0,0.5),2));
x2 <- mvrnorm(red, c(4,-1), matrix(c(3,0,0,0.5),2));
xx <- rbind(x1, x2);
plot(xx, col=c(rep("blue",blue),rep("red",red)));

X_tilda <- cbind(rep(1,blue+red),xx);
X_dagger <- solve(t(X_tilda) %*% X_tilda) %*% t(X_tilda);

# least squares (PRML 4.1.3)
T1 <- cbind(c(rep(1,blue),rep(0,red)),c(rep(0,blue),rep(1,red)));
W1 <- X_dagger %*% T1
W <- W1[,1]-W1[,2]
abline(-W[1]/W[3], -W[2]/W[3], col="purple");

# Fisher's LDA (PRML 4.1.4 original)
SW <- var(x1) * (blue - 1) + var(x2) * (red - 1)
w <- solve(SW) %*% (colMeans(x2)-colMeans(x1))
m <- colMeans(xx)
abline(w[1]/w[2]*m[1]+m[2], -w[1]/w[2], col="black");

# Fisher's LDA (PRML 4.1.5 least squares compatible)
T2 <- c(rep((blue+red)/blue,blue),rep(-(blue+red)/red,red))
W2 <- X_dagger %*% T2
abline(-W2[1]/W2[3], -W2[2]/W2[3], col="green");



青がデータ数が50のクラスタ、赤が100のクラスタ、紫が最小二乗、緑が Fisher's LDA の決定面。確かに決定面が赤クラスタに寄っている。
なお、一応 Fisher's LDA は総クラス内共分散を使うオリジナルと、最小二乗の目標変数をいじる版の両方を引いたのだけど、ちゃんと同じ決定面が導出されてぴったり上書きされているので、チャート上では1本にしか見えない。