3 円周上の分布の基礎 ぱらぱらめくる『Directional Statistics』

  • 円周上の分布
    • 直線上の分布の特性関数・フーリエ変換は容易に円周上に拡張できる(周期性の制約を入れる)
    • 円周上に定義されている分布
      • 指数関数モデルと、直線上分布の円周上への巻きつけ
  • トーラス上の分布、円柱上の分布
    • 2つの独立な円周上のvon Mises分布を使って、トーラス上の"von Mises 分布"を描いてみる
    • ソースは任意次元の2つの球面の掛け合わせになっている

d1 <- 2
d2 <- 2
r1 <- 1
r2 <- 0.3
mu1 <- c(1,rep(0,d1-1))
mu2 <- c(1,rep(0,d2-1))
k1 <- 1.2
k2 <- 1.8
n <- 1000
out1 <- RvonMisesFisher(n,mu1,k1)

out2 <- RvonMisesFisher(n,mu2,k2)


torus.coords <- function(x1,x2){
	r1 <- sqrt(apply(x1^2,1,sum))
	r2 <- sqrt(apply(x2^2,1,sum))
	
	X <- matrix(0,length(x1[,1]),length(x1[1,])+length(x2[1,])-1)
	X[,1:length(x1[1,])] <- x1
	X <- X * (1+x2[,1])
	X[,(length(x1[1,])+1):length(X[1,])] <- x2[,2:length(x2[1,])]
	X
}

x1 <- out1[[1]]*r1
x2 <- out2[[1]]*r2

theta <- pi/2
M <- matrix(c(cos(theta),sin(theta),-sin(theta),cos(theta)),byrow=TRUE,2,2)

x2 <- x2 %*% M

my.torus <- torus.coords(x1,x2)
rg <- range(my.torus)
my.torus <- rbind(my.torus,rep(rg[1],length(my.torus[1,])))
my.torus <- rbind(my.torus,rep(rg[2],length(my.torus[1,])))
library(rgl)
plot3d(my.torus)
    • 3次元球と円とのトーラスは4次元。それの3次元分を描図

d1 <- 3
d2 <- 2
r1 <- 1
r2 <- 0.2
mu1 <- c(1,rep(0,d1-1))
mu2 <- c(1,rep(0,d2-1))
k1 <- 3
k2 <- 1
n <- 5000
out1 <- RvonMisesFisher(n,mu1,k1)

out2 <- RvonMisesFisher(n,mu2,k2)


torus.coords <- function(x1,x2){
	r1 <- sqrt(apply(x1^2,1,sum))
	r2 <- sqrt(apply(x2^2,1,sum))
	
	X <- matrix(0,length(x1[,1]),length(x1[1,])+length(x2[1,])-1)
	X[,1:length(x1[1,])] <- x1
	X <- X * (1+x2[,1])
	X[,(length(x1[1,])+1):length(X[1,])] <- x2[,2:length(x2[1,])]
	X
}

x1 <- out1[[1]]*r1
x2 <- out2[[1]]*r2

theta <- pi/1
M <- matrix(c(cos(theta),sin(theta),-sin(theta),cos(theta)),byrow=TRUE,2,2)

x2 <- x2 %*% M

my.torus <- torus.coords(x1,x2)
rg <- range(my.torus)
my.torus <- rbind(my.torus,rep(rg[1],length(my.torus[1,])))
my.torus <- rbind(my.torus,rep(rg[2],length(my.torus[1,])))
library(rgl)
plot3d(my.torus)