- 2項分布の連続化:β分布
- 多項分布の連続化:ディリクレ分布
- に制約をつけつつ、確率を最大にするようなが知りたいとする
- Rのoptim()関数で最適化することにする
- 少し普通ではない変数の置き方をする
- 長さのベクトルを考える
- これをある回転ベクトルXで回転したとしてなるベクトルが得られる
- の個の要素のうち、個は可変変数とし、残りの個は不変とするような制約を考える
k <- 6
f <- runif(k)
f <- f/sum(f)
library(MCMCpack)
V <- c(rdirichlet(1,rep(1,k)))*100
library(GPArotation)
X <- Random.Start(k)
U <- X%*%V
k_pr <- k-1
frees <- 2:k
non.frees <- (1:k)[-frees]
my.lgamma <- function(x){
ret <- rep(0,length(x))
for(i in 1:length(x)){
if(x[i] >= 0){
ret[i] <- lgamma(x[i])
}else{
ret[i] = exp(-x[i])
}
}
ret
}
my.fx <- function(init.var){
new.U <- U
new.U[frees] <- init.var
new.V <- t(X)%*%new.U
return(-(my.lgamma(sum(new.V)+1)-sum(my.lgamma(new.V+1)) + sum(new.V * log(f))))
}
n.iter <- 10
for(i in 1:n.iter){
init.var <- U[frees]+rnorm(k_pr)*0.0001
optim.out <- optim(init.var,my.fx)
print(optim.out$value)
opt.U <- U
opt.U[frees] <- optim.out$par
opt.V <- t(X) %*% opt.U
print(c(opt.V))
}
R <- 3
N <- 3
f <- runif(R)
f <- f/sum(f)
n.iter <- 10000
X <- rdirichlet(n.iter,rep(1,R)) * N
v <- lgamma(apply(X,1,sum)+1) - apply(lgamma(X+1),1,sum) + apply(t(X) * log(f),2,sum)
v.2 <- apply((t(X)-f*N)^2,2,sum)
d <- apply((t(X)-f*N)^2,2,sum)
plot(d,v.2)
cols <- (v * 0.1) %%3
plot3d(X,col=cols)
library(rgl)
library(MCMCpack)
R <- 3
N <- 1000
f <- runif(R)
f <- f/sum(f)
n.iter <- 10000
X <- rdirichlet(n.iter,rep(1,R)) * N
X <- X + matrix(rnorm(n.iter*R),ncol=R)*N/10
v <- lgamma(apply(X,1,sum)+1) - apply(lgamma(X+1),1,sum) + apply(t(X) * log(f),2,sum)
v.2 <- apply((t(X)-f*N)^2/(f*N),2,sum)
v.2 <- v.2 - min(v.2)+0.01
d <- apply((t(X)-f*N)^2,2,sum)
plot(v,v.2)
cols <- (v * 0.5) %%3
plot3d(X,col=cols)
open3d()
plot3d(X,col=(d * 0.0001) %%3)
plot3d(X,col=(v.2/(d)) %% 3)
plot3d(X,col=gray((max(d/v.2)-d/v.2)/(max(d/v.2)-min(d/v.2))))