Advertisement
Guest User

Untitled

a guest
May 24th, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import pymc #2.3
  4. import pylab
  5. from scipy.special import binom
  6.  
  7. #Jaynes' PT:TLoS example 4.1
  8.  
  9. def db(x): # Decibel transform
  10. return 10.0*np.log10(x)
  11.  
  12. def evidence(x): # Equation 4.8
  13. return db(1E-100 + x/(1.0 - x + 1E-100))
  14.  
  15. def b(r, n, f): # Equation 3.86
  16. return binom(n, r)*np.power(f, r)*np.power(1.0 - f, n - r)
  17.  
  18. # Boxes prior - equation 4.31
  19. priorA = 1.0/11*(1 - 1e-6)
  20. priorB = 10.0/11*(1 - 1e-6)
  21. priorC = 1.0 - priorA - priorB
  22. sum_priors = priorA + priorB + priorC
  23. print "Priors (A, B, C, Sum): ", priorA, priorB, priorC, sum_priors
  24.  
  25. # Boxes defect rate
  26. boxA = 1.0/3.0
  27. boxB = 1.0/6.0
  28. boxC = 99.0/100.0
  29.  
  30. def real_posterior(m): # Equations 4.33 and 4.39
  31. plA = priorA*b(m, m, boxA)
  32. plB = priorB*b(m, m, boxB)
  33. plC = priorC*b(m, m, boxC)
  34.  
  35. eA = evidence(priorA) + db(b(m, m, boxA)*(priorC + priorB)/(plC + plB))
  36. eB = evidence(priorB) + db(b(m, m, boxB)*(priorA + priorC)/(plA + plC))
  37. eC = evidence(priorC) + db(b(m, m, boxC)*(priorA + priorB)/(plA + plB))
  38.  
  39. return eA, eB, eC
  40.  
  41. # PyMC binomial doesn't work properly for N = 0
  42. # so the evidence vectors must be initialized here
  43. eAplot = [evidence(priorA)]
  44. eBplot = [evidence(priorB)]
  45. eCplot = [evidence(priorC)]
  46.  
  47. realAplot = [evidence(priorA)]
  48. realBplot = [evidence(priorB)]
  49. realCplot = [evidence(priorC)]
  50.  
  51. minN = 1
  52. assert(minN > 0)
  53. maxN = 20
  54. assert(maxN >= minN)
  55.  
  56. for N in range(minN, maxN + 1):
  57. # Observtion
  58. NBad = N # Number of bad ones
  59. assert(NBad <= N) # For when it's not always bad
  60. print "Number of tests:", N
  61.  
  62. # Categorical choice (chosen box must be either A, B or C)
  63. box = pymc.Categorical('box', p = [priorA, priorB, priorC])
  64.  
  65. # Each box has a probability of having a defective piece
  66. @pymc.deterministic
  67. def box_func(choice = box):
  68. if choice == 0: #A
  69. return boxA
  70. elif choice == 1: #B
  71. return boxB
  72. elif choice == 2: #C
  73. return boxC
  74. assert(False)
  75.  
  76. # Total defective pieces found
  77. bad = pymc.Binomial('bad', n = N, p = box_func, observed = True, value = NBad)
  78.  
  79. # MCMC sampling
  80. model = pymc.MCMC([box, box_func, bad])
  81. model.sample(iter=10000, burn=1000, thin=2)
  82.  
  83. # Trace plot, autocorrelation and histogram
  84. if maxN == minN: # Debug only
  85. pymc.Matplot.plot(model)
  86. # Useful statistics
  87. print
  88. print "MCMC median, mean = ", np.median(model.trace('box')[:]), np.mean(model.trace('box')[:])
  89.  
  90. hist = list(model.trace('box')[:])
  91. total = len(hist)
  92. # Posterior probabilities for each hypothesis (box)
  93. postA = float(hist.count(0))/total
  94. postB = float(hist.count(1))/total
  95. postC = float(hist.count(2))/total
  96. print "Posterior A, B, C = ", postA, postB, postC
  97.  
  98. eA = evidence(postA)
  99. eB = evidence(postB)
  100. eC = evidence(postC)
  101.  
  102. eAplot.append(eA)
  103. eBplot.append(eB)
  104. eCplot.append(eC)
  105.  
  106. realA, realB, realC = real_posterior(N)
  107.  
  108. realAplot.append(realA)
  109. realBplot.append(realB)
  110. realCplot.append(realC)
  111.  
  112. print "Evidence (dB) A, B, C = ", eA, eB, eC
  113. print "Actual:", realA, realB, realC
  114.  
  115. fig = pylab.figure()
  116. pylab.title('MCMC approximation')
  117. pylab.plot(eAplot)
  118. pylab.plot(eBplot)
  119. pylab.plot(eCplot)
  120. ax = fig.gca()
  121. ax.set_xticks(np.arange(minN - 1, maxN + 1, 1))
  122. ax.set_yticks(np.arange(-30, 20, 3))
  123. pylab.ylabel('Evidence (dB)')
  124. pylab.ylim([-30, 20])
  125. pylab.grid()
  126. pylab.legend(['A', 'B', 'C'])
  127. pylab.show()
  128.  
  129. fig = pylab.figure()
  130. pylab.title('Jaynes\' Analytical Answer')
  131. pylab.plot(realAplot)
  132. pylab.plot(realBplot)
  133. pylab.plot(realCplot)
  134. ax = fig.gca()
  135. ax.set_xticks(np.arange(minN - 1, maxN + 1, 1))
  136. ax.set_yticks(np.arange(-30, 20, 3))
  137. pylab.ylabel('Evidence (dB)')
  138. pylab.ylim([-30, 20])
  139. pylab.grid()
  140. pylab.legend(['A', 'B', 'C'])
  141. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement