- こちらでGaussian Sequence Modelをなぞっている。その一環
- メモ
n.iter <- 10000
n <- 20
theta_0 <- rexp(n)
library(GPArotation)
R <- Random.Start(n)
S <- runif(n)*5
Tau <- R %*% diag(S) %*% t(R)
library(mvtnorm)
theta <- rmvnorm(n.iter,theta_0,Tau)
S2 <- runif(n)*7
R2 <- Random.Start(n)
Sigma <- R2 %*% diag(S2) %*% t(R2)
y <- matrix(0,n.iter,n)
for(i in 1:n.iter){
y[i,] <- rmvnorm(1,theta[i,],Sigma)
}
y2 <- rmvnorm(n.iter,theta_0,Tau+Sigma)
plot(y2,asp=1,pch=20)
points(y,col=2,pch=20)
y.m <- apply(y,2,mean)
y2.m <- apply(y2,2,mean)
plot(y.m,y2.m,asp=1)
abline(0,1,col=2)
y.v <- apply(y,2,var)
y2.v <- apply(y2,2,var)
plot(y.v,y2.v,asp=1)
abline(0,1,col=2)
- ここで見ているのは、ある値ベクトルから定めたルール(行列)で正規分布ずれしている真値をさらにルール(行列)で正規分布ずれしているような観測値の分布
- この観測を元にして、元の値ベクトルの事後分布を知りたいとする
- それはを中心といて、分散共分散行列がなる正規分布になる
- この中心は、という、元の2つのばらつきを定める行列の逆元に関する重み付き平均であり
- その分散共分散行列は調和平均っぽいものになっている
- 行列の演算なので見にくいけれどという逆元を「割り算すること・分母にすること」と読んでしまえば、であって、
- この式もよいけれど、場合によっては別の式表現が関連領域で用いられることもあるので、その式に従った計算も実施し、2方法での計算が一致することを確認している
Tau.inv <- solve(Tau)
Sigma.inv <- solve(Sigma)
Sigma.y <- solve(Sigma.inv + Tau.inv)
Sigma.y2 <- Tau - Tau %*% solve(Tau + Sigma) %*% Tau
range(Sigma.y-Sigma.y2)
theta.y <- Sigma.y %*% (Sigma.inv %*% y[1,] + Tau.inv %*% theta_0)
theta.y2 <- Tau %*% solve(Tau+Sigma) %*% y[1,] + Sigma %*% solve(Tau+Sigma) %*% theta_0
range(theta.y-theta.y2)
plot(theta_0,theta.y)
theta.post <- rmvnorm(n.iter,theta.y,Sigma.y)
apply(theta.post,2,mean)
theta_0
apply(theta.post,2,var)