Rについて
をベースに学んでいく。
今回は非線形判別分析(PP.170-178)を扱う。
14. 非線形判別分析
線形判別関数以外の方法による判別分析を非線形判別分析と呼び、多くの方法が提案されている。
非線形判別分析のうち、判別関数を用いるものは2次式など初等関数が多用される。
14.1 距離による判別分析
2群判別分析を扱う。まず学習データからグループの中心を求め、次に未知の個体とグル-プの中心との距離を測り、距離が近いグループに属するものと判断する。ただし等距離の場合は判別不能である。多群に対しても適用できる。
距離による判別分析には、データの分散を用いた距離が頻用される。距離は
で定義され、多変量正規分布のカーネル部分に他ならない。ここではデータセット、はグループの中心(普通、平均ベクトル。)およびは分散共分散行列の逆行列である。
14.2 多数決による判別分析
最近傍法は伝統的なパターン分類アルゴリズムである。判別すべき個体の周辺の個体で最も近いものを個見つけ、その個での多数決により、所属する群を決定する。距離測度には一般的に距離を用いる。
14.3 ベイズ判別法
個体の特徴量に関する行列、目的変数のベクトルをとする。個体の特徴量ベクトルはであり、は個体が属するグループのラベルである。通常である、
説明変数を条件、目的変数を結果だと考えた場合、条件の下で結果が起こる条件付確率はの定理から
を得る。
ベイジアン・アプローチによる判別分析では、学習データからが最大になるよう確率モデルを求め、所属不明のが所属するグループを判別する。事後確率を最大にすることは、の最大化と同値である。
14.4 シミュレーション
14.4.1 Mahalanobis距離による判別
################################# ### Mahalanobis距離による判別 ### ################################# ### データの準備 data(iris) iris_train <- iris[seq(1,nrow(iris),2),] iris_test <- iris[-seq(1,nrow(iris),2),] # 平均ベクトル・分散共分散行列の推定 seto_mean <- apply(iris_train[1:25,-5],2,mean) seto_var <- var(iris_train[1:25,-5]) vers_mean <- apply(iris_train[26:50,-5],2,mean) vers_var <- var(iris_train[26:50,-5]) virg_mean <- apply(iris_train[51:75,-5],2,mean) virg_var <- var(iris_train[51:75,-5]) # 訓練データのMahalanobis距離 D_seto <- mahalanobis(iris_train[-5], seto_mean, seto_var) D_vers <- mahalanobis(iris_train[-5], vers_mean, vers_var) D_virg <- mahalanobis(iris_train[-5], virg_mean, virg_var) # テストデータのMahalanobis距離 D_seto_test <- mahalanobis(iris_test[-5], seto_mean, seto_var) D_vers_test <- mahalanobis(iris_test[-5], vers_mean, vers_var) D_virg_test <- mahalanobis(iris_test[-5], virg_mean, virg_var) ### テストデータの格納 df_test_result <- as.data.frame(cbind(D_seto_test,D_vers_test,D_virg_test)) df_test_result <- cbind(df_test_result,apply(df_test_result,1,function(vc){ if(sum(vc==min(vc))==1){ return(c("setosa","versicolor","virginica")[vc==min(vc)]) }else{ return(NA) } }),iris_test[,5]) colnames(df_test_result)[4:5] <- c("Estimate","True") ### 正答率 tbl_est_mhlnbs <- table(df_test_result$Estimate,df_test_result$True) num_true <- sum(diag(tbl_est_mhlnbs))/sum(tbl_est_mhlnbs) # 正答率は96% num_error <- 1-num_true # 誤判別率は4%
14.4.2 k近傍法
############### ### k近傍法 ### ############### library("class") iris_knn <- knn(iris_train[,-5], iris_test[,-5], iris_train[,5], k = 5) tbl_est_knn <- table(iris_knn,iris_test[,5]) num_true <- sum(diag(tbl_est_knn))/sum(tbl_est_knn) # 98.666...% num_error <- 1-num_true # 1.333...%
14.4.3 ナイーブベイズ
######################### ### Naive Bayes分類器 ### ######################### ### mlbenchパッケージにあるGlassデータセットを用いる library("e1071") library("mlbench") data(Glass) df_glass <- Glass[,c(1:5,10)] # 一部変数は除外することにする ls_m1 <- naiveBayes(Type~., data = df_glass) vc_m1_p <- predict(ls_m1,newdata = df_glass,) # 汎化性能をチェック tbl_est_nb <- table(vc_m1_p,df_glass$Type) (num_true <- sum(diag(tbl_est_nb))/sum(tbl_est_nb)) (num_error <- 1-num_true)
補足 スペック情報
エディション | Windows 10 Home |
バージョン | 20H2 |
プロセッサ | Intel(R) Core(TM) i5-1035G4 CPU @ 1.10GHz 1.50 GHz |
実装 RAM | 8.00 GB |
システムの種類 | 64 ビット オペレーティング システム、x64 ベース プロセッサ |
R バージョン | 4.1.3 (March, 2022) |
RStudio バージョン | 2022.02.2 Build 485 |
*1:最も事後確率が高い仮説を採用する規則。