【R】マハラノビス距離のもとめ方と判別
Rでマハラノビス距離をもとめるためには,mahalanobis関数を使う。
勉強用に書いてみた。
マハラノビス距離自体は,やっぱり英語のwiki先生が詳しい。
Mahalanobis distance - Wikipedia
#2変量のマハラノビス距離をもとめる #数値例の作成 library(MASS) round(mvrnorm(n=100,mu=c(50,50),Sigma=matrix(c(100,50,50,100),2,2)))->dat #散布図による可視化 plot(dat1,xlab="x",ylab="y",pch=20,col=2,xlim=c(0,100),ylim=c(0,100)) #平均ベクトル(2次元上の中心) m.dat<-colMeans(dat) #それぞれの分散共分散行列 v.dat<-var(dat) #マハラノビス距離の計算 mahalanobis(dat,m.dat,v.dat) #----追記-------- #この関数自体はマハラノビス距離の自乗を返す。 #そのため平方根を取る sqrt(mahalanobis(dat,m.dat,v.dat)) #距離に基づいて判別する #2変量2グループの数値例を作成 round(mvrnorm(n=100,mu=c(50,50),Sigma=matrix(c(100,50,50,100),2,2)))->dat1 round(mvrnorm(n=100,mu=c(50,60),Sigma=matrix(c(100,50,50,100),2,2)))->dat2 #それぞれの平均ベクトル(2次元上の中心) m.dat1<-colMeans(dat1) m.dat2<-colMeans(dat2) #それぞれの分散共分散行列 v.dat1<-var(dat1) v.dat2<-var(dat2) #マハラノビス距離の計算 mah11<-sqrt(mahalanobis(dat1,m.dat1,v.dat1)) mah12<-sqrt(mahalanobis(dat2,m.dat1,v.dat1)) mah21<-sqrt(mahalanobis(dat1,m.dat2,v.dat2)) mah22<-sqrt(mahalanobis(dat2,m.dat2,v.dat2)) #dat1について判別 res1<-ifelse(mah11<mah21,1,2) #dat2について判別 res2<-ifelse(mah12>mah22,2,1) #結果としてテーブルで出力 table.result<-table(data.frame(answer=c(rep(1,100),rep(2,100)),Result=c(res1,res2))) table.result #正判別率 (table.result[1,1]+table.result[2,2])/(nrow(dat1)+nrow(dat2)) #誤判別率 1-(table.result[1,1]+table.result[2,2])/(nrow(dat1)+nrow(dat2))