Contenu connexe
Similaire à マルコフ連鎖モンテカルロ法入門-2 (20)
マルコフ連鎖モンテカルロ法入門-2
- 16. メトロポリス法で正規乱数を生成 in R-2
#不変分布(今の場合は標準正規分布)返却関数。
#メトロポリス法を使う場合、前回の資料で述べたように規格化因子は必要ない!(もちろんあってもOK)
InvariantDistribution <- function(x){
return(exp(-0.5 * x^2))
}
#推移したい次の状態(以前はお天気、今は位置)を返却する関数
#適当でいいので今回は-0.5~0.5の一様乱数で移動先候補を決めた
NextState <- function(x,dx){
return(x+dx*(runif(1)-0.5))
}
size <- 10000 #サンプリング回数
result <- c() #結果格納
dx <- 10 #次の状態を決める時に使う適当な定数。値自体に深い意味はなし
state.now <- 0 #現在の状態(位置)
#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリング
for(i in 1:size){
result <- c(result,state.now)
#遷移したい次の天気を指定
state.next <- NextState(state.now,dx)
#メトロポリス法による推移確率の計算
transition.probability <- min(1,
InvariantDistribution(state.next)/InvariantDistribution(state.now))
#推移確率に応じて状態を推移
state.now <- ifelse(transition.probability > runif(1),state.next,state.now)
}
- 20. メトロポリス法で2次元正規乱数を生成 in R-2
#不変分布返却関数。前回同様規格化因子は必要ない
InvariantDistribution <- function(x,cov.mat){
return(exp(-0.5*t(x)%*%solve(cov.mat)%*%x))
}
#推移したい次の状態を返却する関数。角度と半径を指定して移動先を極座標のノリで決めてみた
NextState <- function(x,dr){
radius <- dr*runif(1)
theta <- 2*pi*runif(1)
return(x + matrix(dr* c(cos(theta),sin(theta)),nrow=2))
}
size <- 10000 #サンプリング回数
result <- c() #結果格納
dr <- 1 #次の状態を決める時に使う適当な定数。深い意味はなし
cov.mat <- matrix(c(1,0.5,0.5,1),nrow=2)#共分散(分散1にしてるので、=相関行列)
state.now <- matrix(0,nrow=2)#現在の状態(位置)
#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリング
for(i in 1:size){
result <- cbind(result,state.now)
#遷移したい次の天気を指定
state.next <- NextState(state.now,dr)
#メトロポリス法による推移確率の計算
transition.probability <- min(1,
InvariantDistribution(state.next,cov.mat)/InvariantDistribution(state.now,cov.mat))
#推移確率に応じて状態を推移(ifelseのままだと値1個しか返してきよらんかった・・・)
if(transition.probability > runif(1)){
state.now <- state.next
}
}
- 21. メトロポリス法で2次元正規乱数を生成 in R-3
#結果の表示
plot(t(result))
#平均値と標準偏差、相関行列。
> apply(result,1,mean)
[1] 0.00603927 -0.01952479
> apply(result,1,sd)
[1] 1.014926 1.019436
> cor(t(result))
[,1] [,2]
[1,] 1.0000000 0.5099159
[2,] 0.5099159 1.0000000
- 25. メトロポリス法でよくわからん分布を生成 in R-3
#よくわからん不変分布返却関数
InvariantDistribution <- function(x){
return(ifelse(x>=-7,exp(-(x+7)),0))
}
#推移したい次の状態(以前はお天気、今は位置)を返却する関数
#適当でいいので今回は-0.5~0.5の一様乱数で移動先候補を決めた
NextState <- function(x,dx){
return(x+dx*(runif(1)-0.5))
}
size <- 10000 #サンプリング回数
result <- c() #結果格納
dx <- 10 #次の状態を決める時に使う適当な定数。値自体に深い意味はなし
state.now <- 0 #現在の状態(位置)
#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリング
for(i in 1:size){
result <- c(result,state.now)
#遷移したい次の天気を指定
state.next <- NextState(state.now,dx)
#メトロポリス法による推移確率の計算
transition.probability <- min(1,
InvariantDistribution(state.next)/InvariantDistribution(state.now))
#推移確率に応じて状態を推移
state.now <- ifelse(transition.probability > runif(1),state.next,state.now)
}
- 35. 熱浴法で2次元正規乱数を生成 in R-3
#条件付分布関数
#標準正規分布を発生させて平均と分散を調整し、望む条件付確率にしている
ConditionalDistribution <- function(fixed,correlation){
return(correlation*fixed + sqrt(1-correlation^2)*rnorm(1))
}
size <- 10000 #サンプリング回数
result <- c() #結果格納
correlation <- 0.5 #相関
state.now <- matrix(0,nrow=2)#現在の状態(位置)
#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリング
for(i in 1:size){
result <- cbind(result,state.now)
#熱浴法による推移計算,前回のx.0を使ってx.1を決めて、そのx.1を使ってx.0を更新する
x.1 <- ConditionalDistribution(state.now[1,1],correlation)
x.0 <- ConditionalDistribution(x.1,correlation)
#状態の更新
state.now <- matrix(c(x.0, x.1),nrow=2)
}
- 36. 熱浴法で2次元正規乱数を生成 in R-4
#結果の表示
plot(t(result))
#平均値と標準偏差、相関行列。
> apply(result,1,mean)
[1] -0.01151708 -0.01209051
> apply(result,1,sd)
[1] 1.0034438 0.9926755
> cor(t(result))
[,1] [,2]
[1,] 1.000000 0.495733
[2,] 0.495733 1.000000