- カーネル・トリックについて昨日書いた
- 簡単にまとめると、動かす前の測度から簡単に計算できるような測度を動かした後の測度として定義すると線形サポートベクターマシンに持ち込める、ということだった
- Rのe1071パッケージのsvm()関数では、動かす前の座標から動かした後の測度を計算してくれるカーネル関数をオプションで指定している
- したがって、オプションにあるカーネル関数は使えるが、それ以外の変換は受け付けてくれない
- 「それ以外の変換」がしたくなったらどうすればいいか、という話
- 変換前の座標から、変換後のペアワイズ距離を出す
- その距離行列からmdsで座標を決めて、それに対してサポートベクターマシンする
- 変換後のペアワイズ距離がどれくらい簡単に計算できるか、鍵
library(igraph)
library(rgl)
Ns <- 500
Nm <- 50
Ns.pt <- Ns
Nm.pt <- 10
trail <- matrix(rnorm(Ns.pt*Nm.pt),Ns.pt,Nm.pt)
trail <- apply(trail,2,cumsum)
library(rgl)
plot3d(trail[,1:3])
matplot(trail,type="l")
library(MCMCpack)
ps <- rdirichlet(1,rep(1,Ns.pt))
pm <- rdirichlet(1,rep(1,Nm.pt))
ss <- sample(1:Ns.pt,Ns,replace=TRUE,prob=ps)
sm <- sample(1:Nm.pt,Nm,replace=TRUE,prob=pm)
M <- trail[ss,sm]
M <- jitter(M,100)
center <- apply(M,2,mean)
d.from.center <- apply((t(M)-center)^2,2,sum)
phenotype <- rep(0,length(M[,1]))
phenotype[which(d.from.center>mean(d.from.center))] <- 1
plot3d(M[,1:3],col = phenotype +1)
library(vegan)
make.mst.graph <- function(X){
mst.x <- spantree(dist(X))
e.x <- cbind(2:(length(mst.x$kid)+1),mst.x$kid)
return(list(g = graph.edgelist(e.x),mst=mst.x))
}
g <- make.mst.graph(M)
sp.g <- shortest.paths(g$g)
mds <- cmdscale(sp.g,length(M[1,]))
library(e1071)
svm.out <- svm(phenotype ~ mds)
print(svm.out)
summary(svm.out)
pred <- predict(svm.out,mds)
table(pred,phenotype)
pred <- predict(svm.out,mds,decision.values = TRUE)
attr(pred,"decision.values")
plot(cmdscale(dist(mds)),col=as.integer(phenotype+1))