エントロピーベースで分布の差異の関連検定〜続き

  • 説明変数群が空間上の点であって、目的変数が分布であるようなときのことを考える
  • 「近い」ことのみを活用する
    • 分布のエントロピーを推定するときに、度数分布を使って局所濃度の推定を介して行う方法がある(次元が大きいとうまくいかないこともあり、現実的でないことも多いのだが)
    • 局所濃度が必要だ、ということは、言い換えると、局所の情報は使うが、ある位置と遠隔位置との関係に関する情報は使わないということ
    • この「遠隔情報」を使わないというのは、いわゆる「線形回帰」と対照的である
    • 「線形回帰」の基本的な心は「近いものは近く」「遠いものは遠い」ということをもとに判断しよう、というものだから
    • この「遠隔情報を使わない」という方法は、そういう意味で、非線形関係の検出に好都合な性質
  • k-NN法
    • 「近い」ことのみを活用するのは、実は大変
    • 度数分布を使う方法が次元の影響で難しいことは書いた
    • 近傍点のみを使う方法がある
    • k-NN法は「ユークリッド距離」に基づき、第k近傍点の情報を使おうという方法
      • 変法としては第1からk近傍点の情報を使おうという方法もあるかもしれない
    • それ以外の方法としては、局所濃度の推定について、特定の距離内における近傍点のみを使う方法もありだろうか(k-NN法に比べ、その理論的根拠の整備が進んでいないかもしれない、cytoSPADEはこの方法)。とはいえk-NN法自体も標本点局所の濃度推定として位置づけられているので、目指しているところは同じ
  • 点の遠近は距離で測り、分布の遠近はKLdivergeneceなどエントロピー的な評価尺度で測ることができる。そこでもk-NNなどを使う
library(FNN)
n <- 50
X <- list()
#Y <- matrix(runif(n*3),nrow=n)
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 <- sample(round(Y[i,1]*50):round(Y[i,1]*50),1)
	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])