R Discriminant Analysis (判別分析)

#線形判別関数はlda(),2次判別の関数はqda()

###################1次判別の例###################

x1<-data.frame(hikki=c(68,85,50,54,66),mensetsu=c(65,80,95,70,75))

x2<-data.frame(hikki=c(35,56,25,43,70),mensetsu=c(55,65,75,50,40))

 

xm1 <- c(mean(x1$hikki),mean(x1$mensetsu))

names(xm1) <- c("hikki","mensetsu")

xm2 <- c(mean(x2$hikki),mean(x1$mensetsu))

names(xm2) <- c("hikki","mensetsu") 

 

#2通りで線形判別を行い、結果を比較してみる。

#1つめ

ss <- var(x1)

sss <- var(x2) 

sm <- *1

ldaz <- lda(lbl~.,data=zz)

ldaz

#1つ目と2つ目の結果が一致しないのは、 #固有ベクトルが一意でないことに起因する ldaz$means

 

ldaz$scaling

ldaz$means %*% ldaz$scaling

                                          

#判別直線軸についての平均 mean(ldaz$means%*%ldaz$scaling)

#各群の平均の中点

#線形判別の方程式は、ladz$scaling %*% x - mean(ldaz$means%*%ldaz$scaling)=0

#この方程式による正負領域によってサンプルの判別が出来る

#データに当てはめて判別結果を確認する

predict(ldaz)$class predict(ldaz)$x

                                          

#残確認

#上記では2群の分布を正規分布と仮定しているが、 #それらが異なる場合、未知の場合の変形型。

#説明変数の選択基準

#誤判別率の補正

*1:ncol(x1)-1)*ss+((ncol(x2)-1)*sss)/((ncol(x1)+ncol(x2)-2)

k <- solve(sm) %*% (xm1-xm2)

#%*%は行列積。"http://www.is.titech.ac.jp/~shimo/class/doc/r-tips.pdf" #などに詳しい。

#solve("行列")で逆行列を求める

 

#2つ目

lbl <- c(1,1,1,1,1,2,2,2,2,2)

zz <- data.frame(z1=c(68,85,50,54,66,35,56,25,43,70), z2=c(65,80,95,70,75,55,65,75,50,40