Rについて
をベースに学んでいく。
今回はカーネル法とサポートベクターマシン(PP.206-215)を扱う。
17. カーネル法とサポートベクターマシン
非線形的なデータ構造を線形構造に変換できれば、線型的なデータ解析手法で非線形データを扱うことが可能である。データを異なる空間に射影することで、非線形構造を線形構造に変換することが可能な場合がある。
カーネル法とはカーネル関数を用いてデータを表現し直す方法で、によりデータを異なる空間へ写像し、データの中に含まれている情報を表現する。
17.1 カーネル主成分分析
カーネル主成分分析は非線形主成分分析とも呼ばれ、大まかには以下の手順で計算する:
(1) | カーネル関数を決める。 | |
(2) | データからの写像行列を求める。 | |
(3) | の固有値と固有ベクトルを求める。 | |
(4) | 固有値と固有ベクトルを正規化する。 |
########################## ### カーネル主成分分析 ### ########################## library("kernlab") op <- par(mfrow = c(2,2), mai = c(rep(0,3,4))) x <- as.matrix(iris[,1:4]) # iris_kpc1 <- kpca(x, kernel = "rbfdot", kpar = list(sigma = 0.1), features = 2) plot(rotated(iris_kpc1), col = as.integer(iris[,5])) # iris_kpc3 <- kpca(x, kernel = "polydot", kpar = list(degree = 1), features = 2) plot(rotated(iris_kpc3), col = as.integer(iris[,5])) # iris_kpc5 <- kpca(x, kernel = "polydot", kpar = list(degree = 5), features = 2) plot(rotated(iris_kpc5), col = as.integer(iris[,5])) # iris_kpc6 <- kpca(x, kernel = "polydot", kpar = list(degree = 6), features = 2) plot(rotated(iris_kpc6), col = as.integer(iris[,5])) par(op)
17.2 サポートベクターマシン
サポートベクターマシンは分類と回帰問題を主としたデータ解析手法であり、線形分離が可能な高次元の仮説空間において線形的なアプローチで学習を行う手法である。
学習データがあるとすると、は個体の特徴ベクトルで、は目的変数であり、回帰問題では数値、分類問題ではクラスのラベルを与える。線形回帰と線形判別の問題では、
で定式化できる。ここでは各説明変数に与えるウェイトである。
判別方法として
を考える。
平面の間隔であるマージンを最大にすることとする。これはすなわちを最小にすることに等しい。そのような解を求める第1ステップは、乗数の関数を導入し、を推測する。すなわち
を考える。
まず本式の両辺をで偏微分した方程式
を解くことで
が得られる。これらを代入することで
を得る。
次にを最大にするようなを求める、すなわち
を、制約条件の下で解く。これにより
を得る。多クラス分類でも同様の考え方で導出できる。
########### ### SVM ### ########### library("kernlab") data(spam) dim(spam) table(spam[,58]) ### ランダムに学習データとテストデータを生成する set.seed[50] tr_num <- sample(4601, 2500) spam_train <- spam[tr_num,] spam_test <- spam[-tr_num,] # SVMの構築 (spm_svm <- ksvm(type~., data = spam_train, cross = 3)) # spm_pre <- predict(spm_svm, spam_test[,-58]) spm_tbl <- table(spam_test[,58],spm_pre) (1-sum(diag(spm_tbl))/sum(spm_tbl)) # 誤判別率