import numpy as np import matplotlib.pyplot as plt plt.xkcd() fig = plt.figure( figsize=(6,5) ) # the data: n = 40 rng = np.random.RandomState(54637281) sigma = 0.5 rmu = 2.0 xd = rng.randn(n)*sigma+rmu # and possible pdfs: x = np.arange( 0.0, 4.0, 0.01 ) mus = [1.5, 2.0, 2.5] g=np.zeros((len(x), len(mus))) for k, mu in enumerate(mus) : g[:,k] = np.exp(-0.5*((x-mu)/sigma)**2.0)/np.sqrt(2.0*np.pi)/sigma # plot it: ax = fig.add_subplot( 2, 1, 1 ) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.set_xlim(0.5, 3.5) ax.set_ylim(-0.02, 0.85) ax.set_xticks( np.arange(0, 5)) ax.set_yticks( np.arange(0, 0.9, 0.2)) ax.set_xlabel('x') ax.set_ylabel('Probability density') s = 1 for mu in mus : r = 5.0*rng.rand()+2.0 cs = 'angle3,angleA={:.0f},angleB={:.0f}'.format(90+s*r, 90-s*r) s *= -1 ax.annotate('', xy=(mu, 0.02), xycoords='data', xytext=(mu, 0.75), textcoords='data', arrowprops=dict(arrowstyle="->", relpos=(0.5,0.5), connectionstyle=cs), zorder=1 ) if mu > rmu : ax.text(mu-0.1, 0.04, '?', zorder=1, ha='right') else : ax.text(mu+0.1, 0.04, '?', zorder=1) for k in xrange(len(mus)) : ax.plot(x, g[:,k], zorder=5) ax.scatter(xd, 0.05*rng.rand(len(xd))+0.2, s=30, zorder=10) # likelihood: thetas=np.arange(1.5, 2.6, 0.01) ps=np.zeros((len(xd),len(thetas))); for i, theta in enumerate(thetas) : ps[:,i]=np.exp(-0.5*((xd-theta)/sigma)**2.0)/np.sqrt(2.0*np.pi)/sigma p=np.prod(ps,axis=0) # plot it: ax = fig.add_subplot( 2, 2, 3 ) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.set_xlabel(r'Parameter $\theta$') ax.set_ylabel('Likelihood') ax.set_xticks( np.arange(1.6, 2.5, 0.4)) ax.annotate('Maximum', xy=(2.0, 5.5e-11), xycoords='data', xytext=(1.0, 1.1), textcoords='axes fraction', ha='right', arrowprops=dict(arrowstyle="->", relpos=(0.0,0.5), connectionstyle="angle3,angleA=10,angleB=70") ) ax.annotate('', xy=(2.0, 0), xycoords='data', xytext=(2.0, 5e-11), textcoords='data', arrowprops=dict(arrowstyle="->", relpos=(0.5,0.5), connectionstyle="angle3,angleA=90,angleB=80") ) ax.plot(thetas,p) ax = fig.add_subplot( 2, 2, 4 ) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.set_xlabel(r'Parameter $\theta$') ax.set_ylabel('Log-Likelihood') ax.set_ylim(-50,-20) ax.set_xticks( np.arange(1.6, 2.5, 0.4)) ax.set_yticks( np.arange(-50, -19, 10.0)) ax.annotate('Maximum', xy=(2.0, -23), xycoords='data', xytext=(1.0, 1.1), textcoords='axes fraction', ha='right', arrowprops=dict(arrowstyle="->", relpos=(0.0,0.5), connectionstyle="angle3,angleA=10,angleB=70") ) ax.annotate('', xy=(2.0, -50), xycoords='data', xytext=(2.0, -26), textcoords='data', arrowprops=dict(arrowstyle="->", relpos=(0.5,0.5), connectionstyle="angle3,angleA=80,angleB=100") ) ax.plot(thetas,np.log(p)) plt.tight_layout(); plt.savefig('mlemean.pdf') #plt.show();