概要
- エントロピー差が最小になるような最も近い分布を求める案件
- 平均2.2の正規分布から平均2.3の分布を求める
Rコード
参考サイト1にMatlabコードがあるのでそれをR用に書き写した
library(pipeR) #------------------------------------------------------------------------------ # Definitions #------------------------------------------------------------------------------ N <- 1000 mu <- 2.2 sigma <- 0.2 mu_new <- 2.3 f <- function(lambda){ sum(prior_pdf * exp(lambda * (x - mu_new))) } #------------------------------------------------------------------------------ # Cross Entropy Minimisation #------------------------------------------------------------------------------ x <- rnorm(N, mu, sigma) prior_pdf <- dnorm(x, mu, sigma) prior_pdf <- prior_pdf / sum(prior_pdf) ret <- optimize(f, c(-10, 10)) tmp <- exp(ret$minimum * x) posterior_pdf <- (prior_pdf * tmp) / sum(prior_pdf * tmp) weighted.mean(x, prior_pdf) %>>% print #equals to 2.2 weighted.mean(x, posterior_pdf) %>>% print #equals to 2.3 out <- cbind(x, prior_pdf, posterior_pdf) out.sort <- out[order(out[, 1]), ] plot(out.sort[, 1], out.sort[, 2], type = "l", ylim = c(0, range(out.sort[, 2:3])[2]), xlab = "x", ylab = "pdf", main = "Cross Entropy Minimisation") lines(out.sort[, 1], out.sort[, 3], type = "l", col = 2) legend("topleft", c(paste0("Prior, mu = ", mu), paste0("Posterior, mu = ", mu_new)), lty = rep(1, 2), col = c(1, 2), bty="n")
結果
期待値2.2と2.3がそれぞれ求められているのであっているっぽい。
> weighted.mean(x, prior_pdf) %>>% print #equals to 2.2 [1] 2.196425 > weighted.mean(x, posterior_pdf) %>>% print #equals to 2.3 [1] 2.3
PDFをプロットすると以下の様な感じ。参考サイト1と同じに見えるっぽい?
参考
Tutorial Demo on Cross Entropy minimization (I) [Matlab Octave]
http://www.quantcode.com/modules/mydownloads/singlefile.php?lid=478
Forecasting Using Relative Entropy
https://www.frbatlanta.org/-/media/Documents/filelegacydocs/wp0222.pdf
(元論文。あまり読んでいない。)