【Rによるデータサイエンス】非線形判別分析

【Rによるデータサイエンス】線形判別分析」と「【Rによるデータサイエンス】線形判別分析 〜 結果の検証」で線形判別分析について勉強してきた。

線形判別分析は、等分散の制約条件*1があることと、大量の変数には向いていない短所がある。

そこで次に非線形判別分析を勉強する。

【定義】
非線形判別分析とは。。。
本では、線形判別分析以外の方法による判別分析を非線形判別分析と呼ぶらしい・・・w。
具体的には非線形関数を用いる方法」「距離に基づいた判別方法」「多数決の判別方法」ベイズ判別方法」「コンピュータの計算・学習機能を活かした機械学習法」など。

【手法紹介】
◎判別関数による判別分析
非線形判別分析なので、判別関数は当然非線形関数を使用する。
RのMASSパッケージに含まれている、2次式による判別分析関数qdaを使用する。

> library(MASS)
> Z.qda<-qda(Species~.,iris.train)
> table(iris.train[,5],predict(Z.qda)$class)
   
     C  S  V
  C 24  0  1
  S  0 25  0
  V  0  0 25

求めた判別モデル(判別関数)にテスト用データをセットして、判別結果を求めると次のようになる。

> Y.qda<-predict(Z.qda,iris.test[,-5])
> table(iris.test[,5],Y.qda$class)
   
     C  S  V
  C 24  0  1
  S  0 25  0
  V  2  0 23

qdaにてCV=TRUEとしてみると。。。

> Z.qda<-qda(Species~.,iris.train,CV=TRUE)
> (qda.tab<-table(iris.test[,5],Z.qda$class))
   
     C  S  V
  C 23  0  2
  S  0 25  0
  V  0  0 25

結果悪くなってる。

◎距離による判別分析
距離による判別分析とは。。。。
例えば、2群判別分析を例にすると、学習データを2つの群(G1、G2とする)に分けて各群の中心を求めて、未知の個体とG1、G2との距離を測定し、距離が近い方に個体が属すると判断する方法。
学習データが従っている確率分布に関する条件を必要としないのが長所。

距離による判別分析で使用する距離には「マハラノビス距離」が多く用いられている。
マハラノビス距離とは次のように定義されている。
D(X,\mu)=\{(X-\mu)^{t}V^{-1}(X-\mu)\}^{\frac{1}{2}}
ここで、Xはデータセット\muは群の中心、V^{-1}は分散共分散行列の逆行列である。

Rでマハラノビス距離を求めるには関数mahalanobisを使用すると良い。
データセットは再びirisを使用する。

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
・・・・
50           5.0         3.3          1.4         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
・・・・
100          5.7         2.8          4.1         1.3 versicolor
101          6.3         3.3          6.0         2.5  virginica
102          5.8         2.7          5.1         1.9  virginica
・・・・
149          6.2         3.4          5.4         2.3  virginica
150          5.9         3.0          5.1         1.8  virginica

1から25番目のsetデータを使用する。

> iris.train[1:25,-5]
   Sepal.Length Sepal.Width Petal.Length Petal.Width
1           5.1         3.5          1.4         0.2
3           4.7         3.2          1.3         0.2
5           5.0         3.6          1.4         0.2
7           4.6         3.4          1.4         0.3
9           4.4         2.9          1.4         0.2
11          5.4         3.7          1.5         0.2
13          4.8         3.0          1.4         0.1

このデータの平均ベクトルを求めるために、各列に対してmean関数を適用する。

> (seto.mean<-apply(iris[1:25,-5],2,mean))
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.028        3.480        1.460        0.248 

次は、分散共分散行列を求めるために、var関数を使用する。

> (seto.var<-var(iris[1:25,-5]))
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.16043333   0.1180833  0.024083333 0.019433333
Sepal.Width    0.11808333   0.1358333  0.006250000 0.022250000
Petal.Length   0.02408333   0.0062500  0.039166667 0.006583333
Petal.Width    0.01943333   0.0222500  0.006583333 0.010933333

同様のことを、versicolorとvirginicaに対しても行う。

> vers.mean<-apply(iris[26:50,-5],2,mean)
> vers.var<-var(iris[26:50,-5])
> virg.mean<-apply(iris[51:75,-5],2,mean)
> virg.var<-var(iris[51:75,-5])

次に、mahalanobis距離を求める。

> D1<-mahalanobis(iris.train[,-5],seto.mean,seto.var)
> D2<-mahalanobis(iris.train[,-5],vers.mean,vers.var)
> D3<-mahalanobis(iris.train[,-5],virg.mean,virg.var)

マハラノビス距離は良い性質を持っているが、分散共分散行列の逆行列を求められないデータには適用できない

*1:分類した各グループの母分散が全て等しい制約条件