- 説明変数群が空間上の点であって、目的変数が分布であるようなときのことを考える
- 「近い」ことのみを活用する
- 分布のエントロピーを推定するときに、度数分布を使って局所濃度の推定を介して行う方法がある(次元が大きいとうまくいかないこともあり、現実的でないことも多いのだが)
- 局所濃度が必要だ、ということは、言い換えると、局所の情報は使うが、ある位置と遠隔位置との関係に関する情報は使わないということ
- この「遠隔情報」を使わないというのは、いわゆる「線形回帰」と対照的である
- 「線形回帰」の基本的な心は「近いものは近く」「遠いものは遠い」ということをもとに判断しよう、というものだから
- この「遠隔情報を使わない」という方法は、そういう意味で、非線形関係の検出に好都合な性質
- k-NN法
- 「近い」ことのみを活用するのは、実は大変
- 度数分布を使う方法が次元の影響で難しいことは書いた
- 近傍点のみを使う方法がある
- k-NN法は「ユークリッド距離」に基づき、第k近傍点の情報を使おうという方法
- 変法としては第1からk近傍点の情報を使おうという方法もあるかもしれない
- それ以外の方法としては、局所濃度の推定について、特定の距離内における近傍点のみを使う方法もありだろうか(k-NN法に比べ、その理論的根拠の整備が進んでいないかもしれない、cytoSPADEはこの方法)。とはいえk-NN法自体も標本点局所の濃度推定として位置づけられているので、目指しているところは同じ
- 点の遠近は距離で測り、分布の遠近はKLdivergeneceなどエントロピー的な評価尺度で測ることができる。そこでもk-NNなどを使う
library(FNN)
n <- 50
X <- list()
Y <- matrix(0,n,2)
y <- runif(n)
Y[,1] <- cos(y*2*pi)
Y[,2] <- sin(y*2*pi)
Y <- Y + rnorm(length(Y),0,0.1)
plot(Y)
norm.Y <- sqrt(apply(Y^2,1,sum))
D <- as.matrix(dist(Y))
ord.D <- t(apply(D,1,order))
plot(ord.D[,1])
N <- 200
d <- 2
for(i in 1:n){
X[[i]] <- matrix(rnorm(N*d),ncol=d)
n.s <- round((sin(norm.Y[i]*pi)+1)*50)
print(n.s)
if(n.s>0){
X[[i]][1:n.s,1:2] <- matrix(rnorm(n.s*2,(sin(norm.Y[i]*2*pi)+1)*0.5),ncol=2)
}
}
library(rgl)
XX <- X[[1]]
for(i in 2:n){
XX <- rbind(XX,X[[i]])
}
plot3d(cbind(XX,rep(Y[,1],each=N)))
open3d()
plot3d(cbind(XX[,1],rep(Y[,1],each=N),rep(Y[,2],each=N)))
KL.D <- matrix(0,n,n)
for(i in 1:n){
for(j in 1:n){
KL.D[i,j] <- KL.divergence(X[[i]],X[[j]])[1]
}
}
K <- 10
St.Ori <- rep(0,K)
for(i in 1:n){
St.Ori <- St.Ori + (KL.D[i,ord.D[i,2:(K+1)]])
}
n.iter <- 100
St.Perm <- matrix(0,n.iter,K)
for(j in 1:n.iter){
tmp.Y <- sample(1:n)
for(i in 1:n){
St.Perm[j,] <- St.Perm[j,] + KL.D[tmp.Y[i],ord.D[i,2:(K+1)]]
}
}
plot(c(sort(St.Perm[,1],decreasing=TRUE),St.Ori[1]))
abline(h=St.Ori[1])