- 任意の多様体に任意の多次元タイルを敷き詰めて、その上で度数分布を取りたいとする
- 次元は基本的にはどこも同じと考えるのが通常だが、場合によっては、多様体次元が連続的に変化することもあるとする
- ひとまず単純に多次元直方体でのタイリングをしておこう
- どのように変形・融合処理をすることになるかわからないので、なるべく条件を緩く作るのがよいだろうか
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