From 0dbcb9f0348a77b429c2dc08f79a2469e022b1e6 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:07:26 -0400 Subject: [PATCH 01/12] Remove ch06.r duplicate --- ch06.r | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++ ch6.R | 169 --------------------------------------------------------- 2 files changed, 148 insertions(+), 169 deletions(-) delete mode 100644 ch6.R diff --git a/ch06.r b/ch06.r index cc44527..d7a13ec 100644 --- a/ch06.r +++ b/ch06.r @@ -1,3 +1,24 @@ +############# +# Chapter 6.2 (Probability Inequality) + +## Compare Chebyshev's and Chernoff's bounds + +# R code to compare the probability bounds + +library(pracma) + +epsilon <- 0.1 +sigma <- 1; +N <- logspace(1,3.9,50) +p_exact <- 1-pnorm(N**(1/2)*epsilon/sigma, 0, 1) +p_cheby <- sigma**2. / (epsilon**2*N) +p_chern <- exp(-epsilon**2*N/(2*sigma**2)) + +plot(log(N), log(p_exact), pch=1, col="orange", lwd=2, xlab="log(N)", ylab="log(Probability)") +points(log(N), log(p_cheby), pch=15, col="green", lwd=2) +lines(log(N), log(p_chern), pch=19, col="blue", lwd=2) +legend("bottomleft", c("Exact","Chebyshev","Chernoff"), fill=c("orange", "green", "blue")) + ############# # Chapter 6.3 (Law of Large Numbers) @@ -19,3 +40,130 @@ Nset_grid <- repmat(Nset, m=1, n=1000) semilogx(Nset_grid, x, col='black', pch=19) points(Nset, p + 3*(((p*(1-p))/Nset)^(1/2)), col='red', pch=19, lwd=1) points(Nset, p - 3*(((p*(1-p))/Nset)^(1/2)), col='red', pch=19, lwd=1) + +############# +# Chapter 6.4 (Central Limit Theorem) + +## PDF of the sum of two Gaussians + +# Plot the PDF of the sum of two Gaussians + +library(pracma) + +n <- 10000 +K <- 2 +Z <- rep(0, n) + +for (i in 1:K) { + X <- runif(n, min=1, max=6) + Z <- Z + X +} +hist(Z,breaks=(K-0.5):(6*K+0.5),freq=FALSE) + +# Visualize convergence in distribution + +library(pracma) + +N <- 10 +N <- 50 +x <- linspace(0, N, 1001) +p <- 0.5 +p_b <- dbinom(x, N, p) +p_n <- dnorm(x, N*p, (N*p*(1-p))**(1/2)) + +c_b <- pbinom(x, N, p) +c_n <- pnorm(x, N*p, (N*p*(1-p))**(1/2)) + +plot(x, p_n, lwd=1, col='red') +lines(x, p_b, lwd=2, col='black') +legend("topright", c('Binomial', 'Gaussian'), fill=c('black', 'red')) + +# Poisson to Gaussian: convergence in distribution + +library(pracma) + +N <- 4 +# N = 10 +# N = 50 + +x <- linspace(0,2*N,1001) +lambda <- 1 +p_b <- dpois(x, N*lambda) +p_n <- dnorm(x, N*lambda, sqrt(N*lambda)) + +c_b <- ppois(x, N*lambda); +c_n = pnorm(x, N*lambda, sqrt(N*lambda)); + +plot(x, p_n, col="red") +lines(x, p_b, col="black") +legend("topright", c('Poisson', 'Gaussian'), fill=c('black', 'red')) + +plot(x, c_n, col="red") +lines(x, c_b, col="black") +legend("topright", c('Poisson', 'Gaussian'), fill=c('black', 'red')) + +# Visualize the Central Limit Theorem + +library(pracma) + +N <- 10 +x <- linspace(0,N,1001) +p <- 0.5 +p_b <- dbinom(x, N, p); +p_n <- dnorm(x, N*p, sqrt(N*p*(1-p))); + +c_b <- pbinom(x, N, p); +c_n <- pnorm(x, N*p, sqrt(N*p*(1-p))); + +x2 <- linspace(5-2.5,5+2.5,1001); +q2 <- dnorm(x2,N*p, sqrt(N*p*(1-p))); + +plot(x, p_n, col="red") +points(x, p_b, col="black", pch=19) + +polygon(c(min(x2), x2, max(x2)), c(0, q2, 0), col='lightblue') + +# How moment generating of Gaussian approximates in CLT + +library(pracma) + +p <- 0.5 +s <- linspace(-10,10,1001) +MX <- 1-p+p*exp(s) +N <- 2 +semilogy(s, (1-p+p*exp(s/N))**N, lwd=4, col="lightblue", xlim=c(-10,10), ylim=c(10**-2, 10**5)) +mu <- p +sigma <- sqrt(p*(1-p)/N); +MZ <- exp(mu*s + sigma^2*s**2/2); +lines(s, MZ, lwd=4); +legend("topleft", c('Binomial MGF', 'Gaussian MGF'), fill=c('lightblue', 'black')) + + +# Failure of Central Limit Theorem at tails + +library(pracma) + +x <- linspace(-1,5,1001) +lambda <- 1 + +N <- 1 +f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) +semilogy(x, f1, lwd=1, col='lightgray', xlim=c(-1,5), ylim=c(10**-6, 1)) + +N <- 10 +f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) +lines(x, f1, lwd=2, col='gray') + +N <- 100 +f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) +lines(x, f1, lwd=2, col='darkgray') + +N <- 1000 +f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) +lines(x, f1, lwd=2, col='black') + +g <- dnorm(x,0,1) +lines(x, g, lwd=2, pch=1, col='red') + +legend("bottomleft", c('N=1', 'N=10', 'N=100', 'N=1000', 'Gaussian'), fill=c('lightgray', 'gray', 'darkgray', 'black', 'red')) + diff --git a/ch6.R b/ch6.R deleted file mode 100644 index d7a13ec..0000000 --- a/ch6.R +++ /dev/null @@ -1,169 +0,0 @@ -############# -# Chapter 6.2 (Probability Inequality) - -## Compare Chebyshev's and Chernoff's bounds - -# R code to compare the probability bounds - -library(pracma) - -epsilon <- 0.1 -sigma <- 1; -N <- logspace(1,3.9,50) -p_exact <- 1-pnorm(N**(1/2)*epsilon/sigma, 0, 1) -p_cheby <- sigma**2. / (epsilon**2*N) -p_chern <- exp(-epsilon**2*N/(2*sigma**2)) - -plot(log(N), log(p_exact), pch=1, col="orange", lwd=2, xlab="log(N)", ylab="log(Probability)") -points(log(N), log(p_cheby), pch=15, col="green", lwd=2) -lines(log(N), log(p_chern), pch=19, col="blue", lwd=2) -legend("bottomleft", c("Exact","Chebyshev","Chernoff"), fill=c("orange", "green", "blue")) - -############# -# Chapter 6.3 (Law of Large Numbers) - -## Weak law of large numbers - -# R code to illustrate the weak law of large numbers - -library(pracma) - -p <- 0.5 -Nset <- as.integer(round(logspace(2,5,100))) -x <- matrix(rep(0, 1000*length(Nset)), nrow=1000) -for (i in 1:length(Nset)) { - N = Nset[i] - x[,i] <- rbinom(1000, N, p) / N -} -Nset_grid <- repmat(Nset, m=1, n=1000) - -semilogx(Nset_grid, x, col='black', pch=19) -points(Nset, p + 3*(((p*(1-p))/Nset)^(1/2)), col='red', pch=19, lwd=1) -points(Nset, p - 3*(((p*(1-p))/Nset)^(1/2)), col='red', pch=19, lwd=1) - -############# -# Chapter 6.4 (Central Limit Theorem) - -## PDF of the sum of two Gaussians - -# Plot the PDF of the sum of two Gaussians - -library(pracma) - -n <- 10000 -K <- 2 -Z <- rep(0, n) - -for (i in 1:K) { - X <- runif(n, min=1, max=6) - Z <- Z + X -} -hist(Z,breaks=(K-0.5):(6*K+0.5),freq=FALSE) - -# Visualize convergence in distribution - -library(pracma) - -N <- 10 -N <- 50 -x <- linspace(0, N, 1001) -p <- 0.5 -p_b <- dbinom(x, N, p) -p_n <- dnorm(x, N*p, (N*p*(1-p))**(1/2)) - -c_b <- pbinom(x, N, p) -c_n <- pnorm(x, N*p, (N*p*(1-p))**(1/2)) - -plot(x, p_n, lwd=1, col='red') -lines(x, p_b, lwd=2, col='black') -legend("topright", c('Binomial', 'Gaussian'), fill=c('black', 'red')) - -# Poisson to Gaussian: convergence in distribution - -library(pracma) - -N <- 4 -# N = 10 -# N = 50 - -x <- linspace(0,2*N,1001) -lambda <- 1 -p_b <- dpois(x, N*lambda) -p_n <- dnorm(x, N*lambda, sqrt(N*lambda)) - -c_b <- ppois(x, N*lambda); -c_n = pnorm(x, N*lambda, sqrt(N*lambda)); - -plot(x, p_n, col="red") -lines(x, p_b, col="black") -legend("topright", c('Poisson', 'Gaussian'), fill=c('black', 'red')) - -plot(x, c_n, col="red") -lines(x, c_b, col="black") -legend("topright", c('Poisson', 'Gaussian'), fill=c('black', 'red')) - -# Visualize the Central Limit Theorem - -library(pracma) - -N <- 10 -x <- linspace(0,N,1001) -p <- 0.5 -p_b <- dbinom(x, N, p); -p_n <- dnorm(x, N*p, sqrt(N*p*(1-p))); - -c_b <- pbinom(x, N, p); -c_n <- pnorm(x, N*p, sqrt(N*p*(1-p))); - -x2 <- linspace(5-2.5,5+2.5,1001); -q2 <- dnorm(x2,N*p, sqrt(N*p*(1-p))); - -plot(x, p_n, col="red") -points(x, p_b, col="black", pch=19) - -polygon(c(min(x2), x2, max(x2)), c(0, q2, 0), col='lightblue') - -# How moment generating of Gaussian approximates in CLT - -library(pracma) - -p <- 0.5 -s <- linspace(-10,10,1001) -MX <- 1-p+p*exp(s) -N <- 2 -semilogy(s, (1-p+p*exp(s/N))**N, lwd=4, col="lightblue", xlim=c(-10,10), ylim=c(10**-2, 10**5)) -mu <- p -sigma <- sqrt(p*(1-p)/N); -MZ <- exp(mu*s + sigma^2*s**2/2); -lines(s, MZ, lwd=4); -legend("topleft", c('Binomial MGF', 'Gaussian MGF'), fill=c('lightblue', 'black')) - - -# Failure of Central Limit Theorem at tails - -library(pracma) - -x <- linspace(-1,5,1001) -lambda <- 1 - -N <- 1 -f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) -semilogy(x, f1, lwd=1, col='lightgray', xlim=c(-1,5), ylim=c(10**-6, 1)) - -N <- 10 -f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) -lines(x, f1, lwd=2, col='gray') - -N <- 100 -f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) -lines(x, f1, lwd=2, col='darkgray') - -N <- 1000 -f1 <- (N**(1/2)/lambda)*dgamma((x+sqrt(N))/(lambda/sqrt(N)), N, lambda) -lines(x, f1, lwd=2, col='black') - -g <- dnorm(x,0,1) -lines(x, g, lwd=2, pch=1, col='red') - -legend("bottomleft", c('N=1', 'N=10', 'N=100', 'N=1000', 'Gaussian'), fill=c('lightgray', 'gray', 'darkgray', 'black', 'red')) - From 45f90f131c11be8dfe9a436bfc2146c0bff15a0a Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 27 Oct 2021 12:18:52 -0400 Subject: [PATCH 02/12] Visualise the likelihood function --- ch08.r | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ch08.r diff --git a/ch08.r b/ch08.r new file mode 100644 index 0000000..b308eee --- /dev/null +++ b/ch08.r @@ -0,0 +1,20 @@ +############# +# Chapter 8.1 Maximum-likelihood Estimation + +## Visualizing the likelihood function + +# R: Visualize the likelooh function +library(pracma) +library(plot3D) + +N = 50 +S = 1:N +theta = seq(0.1, 0.9, (0.9+0.1)/100) +mesh = meshgrid(S, theta) +S_grid = mesh$X +theta_grid = mesh$Y +L = S_grid * log(theta_grid) + (N-S_grid) * log(1-theta_grid) +L = t(L) +persp3D(S, theta, L, theta=65, phi=15) + +############# From 678d558ec1ba7f39ed9b42be58e25a9ff67aecbf Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 27 Oct 2021 18:24:19 -0400 Subject: [PATCH 03/12] Complete visualising likelihood function --- ch08.r | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ch08.r b/ch08.r index b308eee..c966b9f 100644 --- a/ch08.r +++ b/ch08.r @@ -15,6 +15,16 @@ S_grid = mesh$X theta_grid = mesh$Y L = S_grid * log(theta_grid) + (N-S_grid) * log(1-theta_grid) L = t(L) -persp3D(S, theta, L, theta=65, phi=15) +persp3D(S, theta, L, theta=65, phi=15, border="black", lwd=0.3, bty="b2", xlab="S", ylab="θ", zlab="", ticktype="detailed") + +N = 50 +S = seq(from=1, to=N, by=0.1) +theta = seq(0.1, 0.9, (0.1+0.9)/1000) +mesh = meshgrid(S, theta) +S_grid = mesh$X +theta_grid = mesh$Y +L = S_grid * log(theta_grid) + (N-S_grid) * log(1-theta_grid) +L = t(L) +image(S, theta, L, col=rainbow(256), ylim=c(0.9, 0.1)) ############# From 886b457d256638e5a5a98ad168dd75a09e5bef5b Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Mon, 1 Nov 2021 08:59:29 -0400 Subject: [PATCH 04/12] Add plot of theta against L --- ch08.r | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ch08.r b/ch08.r index c966b9f..42fa871 100644 --- a/ch08.r +++ b/ch08.r @@ -3,7 +3,7 @@ ## Visualizing the likelihood function -# R: Visualize the likelooh function +# R: Visualize the likelood function library(pracma) library(plot3D) @@ -27,4 +27,26 @@ L = S_grid * log(theta_grid) + (N-S_grid) * log(1-theta_grid) L = t(L) image(S, theta, L, col=rainbow(256), ylim=c(0.9, 0.1)) +## Visualizing the likelihood function + +# R code +library(pracma) + +N = 50 +S = 1:N +theta = seq(0.1, 0.9, (0.1+0.9)/100) +mesh = meshgrid(S, theta) +S_grid = mesh$X +theta_grid = mesh$Y +L = S_grid * log(theta_grid) + (N-S_grid) * log(1-theta_grid) +L_df = data.frame(L) +colnames(L_df) = S + +plot(theta, L_df$"12", type="n") +lines(theta, L_df$"12", lwd=6) +title(expression(paste("L(", theta, " | S = 12)"))) +grid() + + + ############# From 62d4da7102d83bf518c14ee813987aba29172f1b Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Mon, 1 Nov 2021 08:59:54 -0400 Subject: [PATCH 05/12] Upload cameraman.tif --- cameraman.tif | Bin 0 -> 65126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cameraman.tif diff --git a/cameraman.tif b/cameraman.tif new file mode 100644 index 0000000000000000000000000000000000000000..2fd7bbda6abecaf6e60d342f23c79c6f378f4938 GIT binary patch literal 65126 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 literal 0 HcmV?d00001 From 43ea696b267d981a0102943251c7694459a5c6a9 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Mon, 1 Nov 2021 19:20:56 -0400 Subject: [PATCH 06/12] Add single photon imaging demo --- ch08.r | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ch08.r b/ch08.r index 42fa871..659bf9d 100644 --- a/ch08.r +++ b/ch08.r @@ -47,6 +47,27 @@ lines(theta, L_df$"12", lwd=6) title(expression(paste("L(", theta, " | S = 12)"))) grid() +## ML estimation for single-photon imaging +# R code +library(imager) +lambda = as.data.frame(load.image("cameraman.tif")) +lambda = xtabs(value ~ x+y, data=lambda) +T = 100 +x = c() +for (i in 1:T) x = append(x, rpois(length(lambda), lambda)) +x = array(x, c(256, 256, 100)) +y = (x>=1) +mu = apply(y, c(1,2), mean) +lambdahat = -log(1-mu) +fig1 = x[,,1] + +# Flip matrix since image reads the matrix bottom up +flip_matrix = function(m) m[,nrow(m):1] + +image(flip_matrix(fig1), col=gray.colors(255)) + +image(flip_matrix(lambdahat), col=gray.colors(255)) ############# + From 99d9ec9e4c13e62308635e954b6a32d6cd73385c Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Tue, 2 Nov 2021 17:12:55 -0400 Subject: [PATCH 07/12] Ignore vim swapfiles --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d772925 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +*.swp +*.swo From 66090c2b359da70197c4758b60f4529cfd29b758 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Tue, 2 Nov 2021 17:13:18 -0400 Subject: [PATCH 08/12] Add invariance principle visualization --- ch08.r | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/ch08.r b/ch08.r index 659bf9d..3ff9cb5 100644 --- a/ch08.r +++ b/ch08.r @@ -55,7 +55,9 @@ lambda = as.data.frame(load.image("cameraman.tif")) lambda = xtabs(value ~ x+y, data=lambda) T = 100 x = c() -for (i in 1:T) x = append(x, rpois(length(lambda), lambda)) +for (i in 1:T) { + x = append(x, rpois(length(lambda), lambda)) +} x = array(x, c(256, 256, 100)) y = (x>=1) mu = apply(y, c(1,2), mean) @@ -70,4 +72,29 @@ image(flip_matrix(fig1), col=gray.colors(255)) image(flip_matrix(lambdahat), col=gray.colors(255)) ############# +# Chapter 8.2 Properties of the ML estimation + +## Visualizing the invariance principle + +# R code +N = 50 +S = 20 +theta = seq(0.1, 0.9, (0.1+0.9)/1000) +L = S * log(theta) + (N-S) * log(1-theta) +plot(theta, L, type="n", xlab=expression(theta), ylab=expression(paste("Log L(", theta, "|S = 20)"))) +title("Bernoulli") +lines(theta, L, lwd=6, col="#8080BF") +grid() + +h_theta = -log(1-theta) +plot(theta, h_theta, type="n", xlab=expression(theta), ylab=expression(paste(eta, " = h(", theta, ")"))) +lines(theta, h_theta, lwd=6) +grid() + +theta = seq(0.1, 2.5, (0.1+2.5)/1000) +L = S * log(1-exp(-theta)) - theta * (N-S) +plot(theta, L, type="n") +title("Truncated Poisson") +lines(theta, L, lwd=6, col="#0000BF") +grid() From 968b587098d396a35d6709b1c232f7fc6c0e54e0 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:03:56 -0400 Subject: [PATCH 09/12] Complete MaP estimation --- ch08.r | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ch08.r b/ch08.r index 3ff9cb5..5e44ea7 100644 --- a/ch08.r +++ b/ch08.r @@ -98,3 +98,38 @@ title("Truncated Poisson") lines(theta, L, lwd=6, col="#0000BF") grid() +############# +# Chapter 8.3 Maximum-a-Posteriori Estimation + +## Influence of the priors + +# R code +N = 5 +mu0 = 0.0 +sigma0 = 1 +theta = 5 +x = rnorm(N, 5, 1) +xbar = mean(x) +t = seq(-3, 7, (10)/1000) + +q = numeric(1000) +for (i in 1:N) { + x = abs(t-x[i]) + a = min(x) + q[match(a, x)] = 0.1 +} + +thetahat = (sigma0^2. * xbar + mu0/N)/(sigma0^2. + 1. /N) +sigmahat = sqrt(1. / (1. / sigma0^2 + N)) +p0 = dnorm(t, xbar, 1.) +p1 = dnorm(t, thetahat, sigmahat) +prior = dnorm(t, mu0, sigma0)/10 +plot(t, p1, type="n") +title("N = 5") +legend(-2, 0.9, legend=c("Likelihood", "Posterior", "Prior", "Data"), col=c("blue", "orange", "green", "purple"), lty=1:1) +lines(t, p0, lwd = 4, col="blue") +lines(t, p1, lwd = 4, col="orange") +lines(t, prior, lwd = 4, col="green") +lines(t, q, lwd = 4, col="purple") +grid() + From 4db0e9c8c51f3f3651b546dabc1cd45824c32786 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:58:34 -0400 Subject: [PATCH 10/12] Add conjugate priors plot --- ch08.r | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/ch08.r b/ch08.r index 5e44ea7..27fb09f 100644 --- a/ch08.r +++ b/ch08.r @@ -133,3 +133,40 @@ lines(t, prior, lwd = 4, col="green") lines(t, q, lwd = 4, col="purple") grid() +## Conjugate priors + +# R code +sigma0 = 0.25 +mu0 = 0.0 + +mu = 1 +sigma = 0.25 + +Nset = c(0, 1, 2, 5, 8, 12, 20) +x0 = sigma * rnorm(100) +posterior = list() + +for (i in 1:7) { + N = Nset[i] + x = x0[1:N] + t = seq(-1, 1.5, 2.5/1000) + + p0 = dnorm(t, 0, 1) + theta = mu*(N*sigma0^2)/(N*sigma0^2+sigma^2) + mu0*(sigma^2)/(N*sigma0^2+sigma^2) + sigmaN = sqrt(1/(1/sigma0^2+N/sigma^2)); + posterior[[i]] = dnorm(t, theta, sigmaN) +} + +plot(t, posterior[[7]], type="n", xlab="", ylab="") +lines(t, posterior[[1]], lwd=3, col="red") +lines(t, posterior[[2]], lwd=3, col="orange") +lines(t, posterior[[3]], lwd=3, col="yellow") +lines(t, posterior[[4]], lwd=3, col="green") +lines(t, posterior[[5]], lwd=3, col="turquoise") +lines(t, posterior[[6]], lwd=3, col="blue") +lines(t, posterior[[7]], lwd=3, col="purple") + +legend(-0.9, 7, legend=c("N = 0", "N = 1", "N = 2", "N = 5", "N = 8", "N = 12", "N = 20"), col=c("red", "orange", "yellow", "green", "turquoise", "blue", "purple"), lty=1:1, lwd=3) +grid() + +############# From 4b206e21dc763be88514e35eff71d6e220912c22 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 3 Nov 2021 12:07:25 -0400 Subject: [PATCH 11/12] Update comment phrasing --- ch08.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch08.r b/ch08.r index 27fb09f..ff4bc7c 100644 --- a/ch08.r +++ b/ch08.r @@ -64,7 +64,7 @@ mu = apply(y, c(1,2), mean) lambdahat = -log(1-mu) fig1 = x[,,1] -# Flip matrix since image reads the matrix bottom up +# Flip matrix since `image()` reads the matrix bottom up flip_matrix = function(m) m[,nrow(m):1] image(flip_matrix(fig1), col=gray.colors(255)) From 0c2c8ee8bc2a125d7eefcb3a33b2263ad4a3dc75 Mon Sep 17 00:00:00 2001 From: aaaakshat <33050725+aaaakshat@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:52:07 -0400 Subject: [PATCH 12/12] Move grid behind lines --- ch08.r | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ch08.r b/ch08.r index ff4bc7c..7866ea7 100644 --- a/ch08.r +++ b/ch08.r @@ -43,9 +43,9 @@ L_df = data.frame(L) colnames(L_df) = S plot(theta, L_df$"12", type="n") +grid() lines(theta, L_df$"12", lwd=6) title(expression(paste("L(", theta, " | S = 12)"))) -grid() ## ML estimation for single-photon imaging @@ -83,20 +83,20 @@ theta = seq(0.1, 0.9, (0.1+0.9)/1000) L = S * log(theta) + (N-S) * log(1-theta) plot(theta, L, type="n", xlab=expression(theta), ylab=expression(paste("Log L(", theta, "|S = 20)"))) title("Bernoulli") -lines(theta, L, lwd=6, col="#8080BF") grid() +lines(theta, L, lwd=6, col="#8080BF") h_theta = -log(1-theta) plot(theta, h_theta, type="n", xlab=expression(theta), ylab=expression(paste(eta, " = h(", theta, ")"))) -lines(theta, h_theta, lwd=6) grid() +lines(theta, h_theta, lwd=6) theta = seq(0.1, 2.5, (0.1+2.5)/1000) L = S * log(1-exp(-theta)) - theta * (N-S) plot(theta, L, type="n") title("Truncated Poisson") -lines(theta, L, lwd=6, col="#0000BF") grid() +lines(theta, L, lwd=6, col="#0000BF") ############# # Chapter 8.3 Maximum-a-Posteriori Estimation @@ -127,11 +127,11 @@ prior = dnorm(t, mu0, sigma0)/10 plot(t, p1, type="n") title("N = 5") legend(-2, 0.9, legend=c("Likelihood", "Posterior", "Prior", "Data"), col=c("blue", "orange", "green", "purple"), lty=1:1) +grid() lines(t, p0, lwd = 4, col="blue") lines(t, p1, lwd = 4, col="orange") lines(t, prior, lwd = 4, col="green") lines(t, q, lwd = 4, col="purple") -grid() ## Conjugate priors @@ -158,6 +158,7 @@ for (i in 1:7) { } plot(t, posterior[[7]], type="n", xlab="", ylab="") +grid() lines(t, posterior[[1]], lwd=3, col="red") lines(t, posterior[[2]], lwd=3, col="orange") lines(t, posterior[[3]], lwd=3, col="yellow") @@ -167,6 +168,5 @@ lines(t, posterior[[6]], lwd=3, col="blue") lines(t, posterior[[7]], lwd=3, col="purple") legend(-0.9, 7, legend=c("N = 0", "N = 1", "N = 2", "N = 5", "N = 8", "N = 12", "N = 20"), col=c("red", "orange", "yellow", "green", "turquoise", "blue", "purple"), lty=1:1, lwd=3) -grid() #############