多次元度数分布

  • 任意の多様体に任意の多次元タイルを敷き詰めて、その上で度数分布を取りたいとする
  • 次元は基本的にはどこも同じと考えるのが通常だが、場合によっては、多様体次元が連続的に変化することもあるとする
  • ひとまず単純に多次元直方体でのタイリングをしておこう
  • どのように変形・融合処理をすることになるかわからないので、なるべく条件を緩く作るのがよいだろうか
multi.hist <- function(X,ns,bins=NULL){
	if(is.null(bins)){
		range.X <- apply(X,2,range)
		range.X[2,] <- range.X[2,] + min(range.X[2,]-range.X[1,])*0.0001
		bins <- list()
		for(i in 1:length(X[1,])){
			bins[[i]] <- seq(from=range.X[1,i],to=range.X[2,i],length=ns[i]+1)
		}
	}
	tmp.list <- list()
	for(i in 1:length(ns)){
		tmp.list[[i]] <- 1:ns[i]
	}
	H.X.2 <- expand.grid(tmp.list)
	hist.cnt.X <- rep(0,length(H.X.2[,1]))
	for(i in 1:length(hist.cnt.X)){
		tmp <- matrix(FALSE,length(X[1,]),length(X[,1]))
		for(j in 1:length(X[1,])){
			tmp[j,] <- (X[,j] >= bins[[j]][H.X.2[i,j]] & X[,j] < bins[[j]][H.X.2[i,j]+1])
		}
		hist.cnt.X[i] <- sum(apply(tmp,2,prod))
	}
	return(list(hist.cnt = hist.cnt.X,bins =bins))
}

X <- matrix(rnorm(100000*3),ncol=3) + matrix(rnorm(100000*3,mean=3,sd=2),ncol=3)

ns <- c(5,4,3)
mult.hist.out <- multi.hist(X,ns = ns)
array(mult.hist.out$hist.cnt,ns)
> array(mult.hist.out$hist.cnt,ns)
, , 1

     [,1] [,2] [,3] [,4]
[1,]    0    9    5    0
[2,]   19  625  512   11
[3,]   83 2044 1754   38
[4,]   14  432  426    9
[5,]    0    3    1    1

, , 2

     [,1]  [,2]  [,3] [,4]
[1,]    4   101   103    1
[2,]  351  8383  6972  192
[3,] 1264 29844 24792  653
[4,]  280  6344  5334  133
[5,]    1    66    53    3

, , 3

     [,1] [,2] [,3] [,4]
[1,]    0    6   10    0
[2,]   37  939  720   21
[3,]  119 3218 2670   83
[4,]   33  674  578   17
[5,]    0    7    8    0