Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import numpy as np
  4. from numpy.linalg import inv
  5. from numpy.linalg import det
  6. import pylab as pb
  7. from matplotlib import rc
  8. from math import pi
  9. from scipy.spatial.distance import cdist
  10. from scipy.stats import multivariate_normal
  11. import random
  12.  
  13. # To sample from a multivariate Gaussian
  14. # f = np.random.multivariate_normal(mu,K)
  15. # To compute a distance matrix between two sets of vectors
  16. # D = cdist(x1,x2)
  17. # To compute the exponential of all elements in a matrix
  18. # E = np.exp(D)
  19.  
  20.  
  21. # FUNCTIONS #
  22. def normal_pdf_prob(x, mean, cov):
  23. return multivariate_normal.pdf(x, mean, cov)
  24.  
  25.  
  26. # PRIOR
  27. def normal_prior_pdf(mean, cov):
  28. Nx = np.size(W0,1)
  29. Ny = np.size(W1,1)
  30. Z = np.zeros((Nx,Ny))
  31. for i in range(Nx):
  32. for j in range(Ny):
  33. Z[i,j] = normal_pdf_prob(np.array([W0[i,j],W1[i,j]]), mean, cov)
  34. return Z
  35.  
  36.  
  37. # LIKELIHOOD
  38. def normal_likelihood_pdf(x, y, cov):
  39. Nx = np.size(W0,1)
  40. Ny = np.size(W1,1)
  41. Z = np.zeros((Nx,Ny))
  42. for i in range(Nx):
  43. for j in range(Ny):
  44. W = np.array([W0[i,j],W1[i,j]])
  45. mean = np.inner(W,x)
  46. Z[i,j] = normal_pdf_prob(y, mean, cov)
  47. return Z
  48.  
  49.  
  50. def plot_normal_pdf_sample_space(mean, cov, nsamples, name=None):
  51. F = np.random.multivariate_normal(np.transpose(mean)[0],cov,nsamples)
  52. for f in F:
  53. pb.plot(f)
  54. pb.show()
  55.  
  56.  
  57. # GENERATE SYNTHETIC DATA #
  58. # Input
  59. X = np.linspace(-1,1,201)
  60. X = np.vstack([X,np.ones(len(X))])
  61. X = np.matrix(np.transpose(X))
  62. # Weights
  63. W = np.array([-1.3,0.5])
  64. #print ("Real W = ", W)
  65. # Gaussian noise
  66. beta= 1./.3
  67. epsilon = np.random.normal(0,beta**(-.5),np.size(X,0))
  68. # Output
  69. Y = np.transpose(W*np.transpose(X)+epsilon)
  70.  
  71. # GLOBAL PARAMETERS, INITIALIZATION #
  72. L = 150
  73. w0 = np.linspace(-2,2,L)
  74. w1 = np.linspace(-2,2,L)
  75. W0, W1 = np.meshgrid(w0,w1)
  76. alpha = 2
  77. mean_prior = np.array([0,0])
  78. cov_prior = alpha*np.identity(2)
  79. cov_like = beta**(-1)
  80.  
  81. # LaTeX
  82. pb.rc('text', usetex=True)
  83. pb.rc('font', family='serif')
  84.  
  85. # PRIOR #
  86. prior = normal_prior_pdf(mean_prior,cov_prior)
  87. pb.subplot(4,3,2)
  88. pb.pcolor(W0, W1, prior)
  89. pb.xlabel(r'$w_0$', fontsize=16)
  90. pb.ylabel(r'$w_1$', fontsize=16)
  91. pb.title(r'Prior/Posterior', fontsize=17)
  92.  
  93.  
  94. pb.subplot(4,3,1)
  95. pb.title(r'Likelihood', fontsize=17)
  96. pb.subplot(4,3,3)
  97. nsamples = 20
  98. F = np.random.multivariate_normal(mean_prior,cov_prior,nsamples)
  99. for f in F:
  100. pb.plot(f)
  101. pb.title(r'Data space', fontsize=17)
  102.  
  103. #plot_normal_pdf_sample_space(mean_prior, cov_prior, 6, name=r'prior_samples')
  104.  
  105. # N OBSERVATIONS #
  106. N = 20
  107. I = np.random.randint(0, 201, N)
  108. posterior = prior
  109. cont = 0
  110. for i in I:
  111. x_i = X[i]
  112. y_i = Y[i]
  113. #print ("Observed: [",x_i[0,0],",",y_i[0,0],"]")
  114.  
  115. # LIKELIHOOD #
  116. likelihood = normal_likelihood_pdf(x_i, y_i, cov_like)
  117.  
  118. # POSTERIOR #
  119. posterior *= likelihood
  120. posterior /= sum(sum(posterior))
  121.  
  122. if (cont == 0 or cont == 1 or cont == 19):
  123. pb.subplot(4,3,4+3*cont%17)
  124. pb.pcolor(W0, W1, likelihood)
  125. pb.xlabel(r'$w_0$', fontsize=16)
  126. pb.ylabel(r'$w_1$', fontsize=16)
  127. pb.subplot(4,3,5+3*cont%17)
  128. pb.pcolor(W0, W1, posterior)
  129. pb.xlabel(r'$w_0$', fontsize=16)
  130. pb.ylabel(r'$w_1$', fontsize=16)
  131.  
  132. X_obs = X[I[:cont+1]]
  133. Y_obs = Y[I[:cont+1]]
  134. # Update covariance and mean of posterior
  135. cov_post = inv(inv(cov_prior)+beta*np.transpose(X_obs)*X_obs)
  136. _mean_post = np.dot(inv(cov_prior),mean_prior)+np.transpose(beta*np.transpose(X_obs)*Y_obs)
  137. mean_post = np.inner(cov_post,_mean_post)
  138. mean_post = np.squeeze(np.asarray(mean_post))
  139. # DATA SPACE #
  140. pb.subplot(4,3,6+3*cont%17)
  141. F = np.random.multivariate_normal(mean_post,cov_post,nsamples)
  142. for f in F:
  143. #print (f)
  144. y0 = f[0]*(-3)+f[1]
  145. y1 = f[0]*(3)+f[1]
  146. pb.plot([-2, 2],[y0, y1])
  147. pb.axis([-2, 2, -3.3, 3.3])
  148.  
  149. for j in I[:cont+1]:
  150. pb.plot(X[j][0,0], Y[j][0,0], 'ro')
  151. cont += 1
  152. #i += 3
  153.  
  154.  
  155.  
  156.  
  157. #print ("mean = ", mean_post)
  158. #print ("cov = ", cov_post)
  159.  
  160. #pb.subplot(4,3,8)
  161. #posterior_th = normal_prior_pdf(mean_post,cov_post)
  162. #pb.pcolor(W0, W1, posterior_th)
  163. pb.savefig("q11.pdf")
  164. pb.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement