%matplotlib inline from collections import defaultdict import json import numpy as np import scipy as sp import matplotlib.pyplot as plt import pandas as pd from matplotlib import rcParams import matplotlib.cm as cm import matplotlib as mpl #colorbrewer2 Dark2 qualitative color table dark2_colors = [(0.10588235294117647, 0.6196078431372549, 0.4666666666666667), (0.8509803921568627, 0.37254901960784315, 0.00784313725490196), (0.4588235294117647, 0.4392156862745098, 0.7019607843137254), (0.9058823529411765, 0.1607843137254902, 0.5411764705882353), (0.4, 0.6509803921568628, 0.11764705882352941), (0.9019607843137255, 0.6705882352941176, 0.00784313725490196), (0.6509803921568628, 0.4627450980392157, 0.11372549019607843)] rcParams['figure.figsize'] = (10, 6) rcParams['figure.dpi'] = 150 rcParams['axes.color_cycle'] = dark2_colors rcParams['lines.linewidth'] = 2 rcParams['axes.facecolor'] = 'white' rcParams['font.size'] = 14 rcParams['patch.edgecolor'] = 'white' rcParams['patch.facecolor'] = dark2_colors[0] rcParams['font.family'] = 'StixGeneral' def remove_border(axes=None, top=False, right=False, left=True, bottom=True): """ Minimize chartjunk by stripping out unnecesasry plot borders and axis ticks The top/right/left/bottom keywords toggle whether the corresponding plot border is drawn """ ax = axes or plt.gca() ax.spines['top'].set_visible(top) ax.spines['right'].set_visible(right) ax.spines['left'].set_visible(left) ax.spines['bottom'].set_visible(bottom) #turn off all ticks ax.yaxis.set_ticks_position('none') ax.xaxis.set_ticks_position('none') #now re-enable visibles if top: ax.xaxis.tick_top() if bottom: ax.xaxis.tick_bottom() if left: ax.yaxis.tick_left() if right: ax.yaxis.tick_right() pd.set_option('display.width', 500) pd.set_option('display.max_columns', 100) a0=-0.3 a1=0.5 N=20 noiseSD=0.2 priorPrecision=2.0 u=np.random.rand(20) x=2.*u -1. def randnms(mu, sigma, n): return sigma*np.random.randn(n) + mu y=a0+a1*x+randnms(0.,noiseSD,N) plt.scatter(x,y) from scipy.stats import norm likelihoodSD = noiseSD # Assume the likelihood precision, beta, is known. likelihoodPrecision = 1./(likelihoodSD*likelihoodSD) from _multivariate import multivariate_normal def cplot(f): plt.figure() xx,yy=np.mgrid[-1:1:.01,-1:1:.01] pos = np.empty(xx.shape + (2,)) pos[:, :, 0] = xx pos[:, :, 1] = yy ax=plt.contourf(xx, yy, f(pos)) #data = [x, y] return ax priorMean = np.zeros(2) priorSigma = np.eye(2)/priorPrecision #Covariance Matrix priorPDF = lambda w: multivariate_normal.pdf(w,priorMean,priorSigma) priorPDF([1,2]) np.transpose(priorMean) cplot(priorPDF) def plotSampleLines(mu, sigma, numberOfLines, dataPoints=None): #Plot the specified number of lines of the form y = w0 + w1*x in [-1,1]x[-1,1] by # drawing w0, w1 from a bivariate normal distribution with specified values # for mu = mean and sigma = covariance Matrix. Also plot the data points as # blue circles. #print "datap",dataPoints fig=plt.figure() for i in range(numberOfLines): w = np.random.multivariate_normal(mu,sigma) func = lambda x: w[0] + w[1]*x xx=np.array([-1,1]) plt.plot(xx,func(xx),'r') if dataPoints: plt.scatter(dataPoints[0],dataPoints[1]) ax=plt.gca() ax.set_xlim([-1,1]) ax.set_ylim([-1,1]) plt.show() plotSampleLines(priorMean,priorSigma,6) # Given the mean = priorMu and covarianceMatrix = priorSigma of a prior # Gaussian distribution over regression parameters; observed data, xtrain # and ytrain; and the likelihood precision, generate the posterior # distribution, postW via Bayesian updating and return the updated values # for mu and sigma. xtrain is a design matrix whose first column is the all # ones vector. def update(x,y,likelihoodPrecision,priorMu,priorSigma): postSigmaInv = np.linalg.inv(priorSigma) + likelihoodPrecision*np.outer(x.T,x) postSigma = np.linalg.inv(postSigmaInv) postMu = np.dot(np.dot(postSigma,np.linalg.inv(priorSigma)),priorMu) + likelihoodPrecision*np.dot(postSigma,np.outer(x.T,y)).flatten() postW = lambda w: multivariate_normal.pdf(w,postMu,postSigma) return postW,postMu,postSigma # For each iteration plot the # posterior over the first i data points and sample lines whose # parameters are drawn from the corresponding posterior. mu = priorMean sigma = priorSigma iterations=2 muhash={} sigmahash={} for i in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]: postW,mu,sigma = update(np.array([1,x[i]]),y[i],likelihoodPrecision,mu,sigma) muhash[i]=mu sigmahash[i]=sigma if i in [1,4,7,10,19]: cplot(postW) #plotSampleLines(mu,sigma,6,(x[0:i],y[0:i])) #print "=========", i, x[0:i],y[0:i] for i in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]: if i in [1,4,7,10,19]: plotSampleLines(muhash[i],sigmahash[i],6, (x[0:i],y[0:i])) Nmc=200000 burnin=40000 t1 = np.zeros(Nmc) i=0 #Try 0.1, 1.0, 10.0, 100.0 sig=1. t1_prev=np.random.randn() print "Init",t1_prev def randnms(mu, sigma): return sigma*np.random.randn() + mu posterior = lambda x: np.exp(-x*x/2.) proposal=randnms while i < Nmc: #proposal t1_star=proposal(t1_prev, sig) #New Posterior P_star=posterior(t1_star) #Old Posterior P_prev=posterior(t1_prev) A=np.min([P_star/P_prev, 1.0]) U=np.random.rand() if U < A :#accept t1[i]=t1_star t1_prev=t1_star else:#reject t1[i]=t1_prev i=i+1 t1clean=t1[burnin:Nmc:5] plt.plot(range(len(t1clean)),t1clean,'.') plt.acorr(t1clean-np.mean(t1clean), maxlags=100, lw=1 , normed=True); plt.hist(t1clean, bins=50);