- こちらやこちらで度数分布のことを書いた
- 10分割の度数分布とか、100分割の度数分布とかっていうのは、10進法表示のうち、上位何桁の違いを有効することにした上で、「同じ値」に扱われるレコードの数を数える、ということ
- では、多次元空間で、同様に、適当な「粗さ」でレコード点を格子点に集約することを考える
- 「格子点」が多すぎるときに、ひとまず、「帰属レコード」がある格子点だけを取り出したいとする
- k次元空間にあって、分割をk尺度にする場合は、10進法表示の丸めを使えばよい
- 分割をk尺度にする場合に拡張することもできる
- 準備として次をする
x <- runif(1)
x
k <- 10
n <- 10
floor(x/(k^(0:(-n))))
k <- 2
floor(x/k^(0:(-n)))
>
> x <- runif(1)
> x
[1] 0.4840452
>
> k <- 10
>
> n <- 10
> floor(x/(k^(0:(-n))))
[1] 0 4 48 484 4840
[6] 48404 484045 4840452 48404522 484045221
[11] 4840452212
>
> k <- 2
> floor(x/k^(0:(-n)))
[1] 0 0 1 3 7 15 30 61 123 247 495
- これを利用してやってみよう
- 分割すると100万点のほとんどすべてがユニークな点となるようだ
- 図は、偏りが目立つように、次元、10、100本の酔歩道、全点数10万として、各軸分割して集約したものを、軸1−5に関してペアワイズを取ってプロットしたもの
df <- 10
k <- 1000
n.pts <- rep(1000,k)
M <- NULL
for(i in 1:k){
s <- sample(1:df,n.pts[i],replace=TRUE)
tmp <- matrix(0, n.pts[i],df)
for(j in 1:length(s)){
tmp[j,s[j]]<-sample(c(-1,1),1)
}
M <- rbind(M,apply(tmp,2,cumsum))
}
M <- (M-min(M))/(max(M)-min(M))
M <- M + rnorm(length(M)) * 0.01
M <- (M-min(M))/(max(M)-min(M))
plot(M[,1:2])
M.list <- list()
unique.M.list <- list()
n.rep <- 5
k <- 2
for(i in 1:n.rep){
M.list[[i]] <- floor(M/k^(-i))
unique.M.list[[i]] <- unique(as.data.frame(M.list[[i]]))
print("No. total points")
print(length(M[,1]))
print("No. unique coordinate points")
print(length(unique.M.list[[i]][,1]))
}
plot(as.data.frame(M.list[[n.rep]][,1:5]))
[1] "No. total points"
[1] 1000000
[1] "No. unique coordinate points"
[1] 1025
[1] "No. total points"
[1] 1000000
[1] "No. unique coordinate points"
[1] 6822
[1] "No. total points"
[1] 1000000
[1] "No. unique coordinate points"
[1] 73499
[1] "No. total points"
[1] 1000000
[1] "No. unique coordinate points"
[1] 405521
[1] "No. total points"
[1] 1000000
[1] "No. unique coordinate points"
[1] 913915