Contents
logmh.m
From A First Course in Machine Learning, Chapter 4. Simon Rogers, 01/11/11 [simon.rogers@glasgow.ac.uk] Metropolis-Hastings for Logistic Regression
clear all;close all;
Load the classification data
load ../data/logregdata;
Initialise w
w = randn(2,1);
Generate N Samples
ss = 10; N = 2000; jumpvar = 1; % Jumping variance for each parameter w_all = zeros(N,2); Naccept = 0; for n = 1:N % Propose a new sample ws = w + randn(2,1).*sqrt(jumpvar); % Compute ratio of new to old priors (constants cancel) priorrat = -(1/(2*ss))*ws'*ws; priorrat = priorrat + (1/(2*ss))*w'*w; % Subtract old prior % Compute ratio of new to old likelihoods prob = 1./(1+exp(-X*w)); newprob = 1./(1+exp(-X*ws)); like = sum(t.*log(prob) + (1-t).*log(1-prob)); newlike = sum(t.*log(newprob) + (1-t).*log(1-newprob)); rat = newlike - like + priorrat; if rand<=exp(rat) % Accept Naccept = Naccept + 1; w = ws; end w_all(n,:) = w; end fprintf('\nAcceptance ratio: %g',Naccept/N);
Acceptance ratio: 0.6845
Plot the true contours and the samples
[w1,w2] = meshgrid(-5:0.1:5,-5:0.1:5); logprior = -0.5*log(2*pi) - 0.5*log(ss) - (1/(2*ss))*w1.^2; logprior = logprior + (-0.5*log(2*pi) - 0.5*log(ss) - (1/(2*ss))*w2.^2); prob_t = 1./(1+exp(-[w1(:) w2(:)]*X')); loglike = sum(log(prob_t).*repmat(t',prod(size(w1)),1),2); loglike = loglike + sum(log(1-prob_t).*repmat(1-t',prod(size(w1)),1),2); logpost = logprior + reshape(loglike,size(w1)); contour(w1,w2,exp(logpost),'k','color',[0.6 0.6 0.6]) xlabel('$w1$','interpreter','latex'); ylabel('$w2$','interpreter','latex'); hold on plot(w_all(:,1),w_all(:,2),'k.','markersize',10)

Plot the prediction contours
Create an x grid
[Xv,Yv] = meshgrid(-5:0.1:5,-5:0.1:5); % Compute the probabilities over the grid by averaging over the samples Probs = zeros(size(Xv)); for i = 1:N Probs = Probs + 1./(1 + exp(-(w_all(i,1)*Xv + w_all(i,2)*Yv))); end Probs = Probs./N; figure(1);hold off plot(X(1:20,1),X(1:20,2),'ko','markersize',10,'markerfacecolor','k') hold on plot(X(21:40,1),X(21:40,2),'ks','markersize',10,'linewidth',2) [cs,h] = contour(Xv,Yv,Probs); clabel(cs,h);
