Guest User

Untitled

a guest
Apr 23rd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. #encoding:utf-8
  2.  
  3. import random
  4. import math
  5. from matplotlib import pyplot
  6. import sys
  7. import numpy
  8.  
  9. pyplot.rcParams['font.family'] = 'Times New Roman'
  10.  
  11.  
  12. def f(x, m, s):
  13. return math.exp(-0.5 * (x - m) ** 2 / s) / math.sqrt(2 * math.pi * s)
  14.  
  15.  
  16. def gaussian(m, s):
  17. def f(x):
  18. return numpy.exp(-0.5 * (x - m) ** 2 / s) / numpy.sqrt(2 * math.pi * s)
  19. return f
  20.  
  21.  
  22. def calc_likelihood(x, m, s, p):
  23. sum = 0.0
  24. for n in range(len(x)):
  25. temp = 0.0
  26. for k in range(len(p)):
  27. temp += p[k] * f(x[n], m[k], s[k])
  28. sum += math.log(temp)
  29. return sum
  30.  
  31.  
  32. # pi = [1 - random.random() for _ in range(k)]
  33. pi = [0.3, 0.7]
  34.  
  35. k = len(pi)
  36. n = 500
  37.  
  38. s = 0
  39. for elem in pi:
  40. s += elem
  41. for i in range(k):
  42. pi[i] /= s
  43.  
  44. #mu = [random.uniform(-k, k) for _ in range(k)]
  45. #sigma = [random.uniform(0.1, k) for _ in range(k)]
  46.  
  47. mu = [-5, 5]
  48. sigma = [1, 1]
  49.  
  50. x = [0 for _ in range(n)]
  51.  
  52. mini = 100000
  53. maxi = -100000
  54.  
  55. for i in range(n):
  56. r = random.uniform(0, 1)
  57. cum = 0
  58. for j in range(k):
  59. if cum <= r and r <= cum + pi[j]:
  60. x[i] = random.gauss(mu[j], sigma[j])
  61. mini = min(x[i], mini)
  62. maxi = max(x[i], maxi)
  63. cum += pi[j]
  64.  
  65. print(pi)
  66. print(mu)
  67. print(sigma)
  68.  
  69. pi_est = [1.0 / k for _ in range(k)]
  70. mu_est = [random.uniform(mini, maxi) for _ in range(k)]
  71. sigma_est = [random.uniform(0.1, maxi - mini) for _ in range(k)]
  72.  
  73. l_prev = 0
  74. step = 0
  75. while True:
  76. step += 1
  77. gamma = [[0 for _ in range(n)] for _ in range(k)]
  78.  
  79. for t in range(n):
  80. tmp = 0
  81. for i in range(k):
  82. gamma[i][t] = pi_est[i] * f(x[t], mu_est[i], sigma_est[i])
  83. tmp += gamma[i][t]
  84. for i in range(k):
  85. gamma[i][t] /= tmp
  86.  
  87. for i in range(k):
  88. tmp = 0
  89. for t in range(n):
  90. tmp += gamma[i][t]
  91. pi_est[i] = tmp / n
  92.  
  93. tmp1 = 0
  94. tmp2 = 0
  95. tmp3 = 0
  96. for t in range(n):
  97. tmp1 += gamma[i][t] * x[t] * x[t]
  98. tmp2 += gamma[i][t] * x[t]
  99. tmp3 += gamma[i][t]
  100. mu_est[i] = tmp2 / tmp3
  101. sigma_est[i] = tmp1 / tmp3 - mu_est[i] * mu_est[i]
  102.  
  103. l = calc_likelihood(x, mu_est, sigma_est, pi_est)
  104.  
  105. print(l)
  106.  
  107. if (abs(l - l_prev) < 1e-8):
  108. break
  109. l_prev = l
  110.  
  111. print("converged at step %d" % step)
  112.  
  113. print("Real Value:")
  114. print(pi)
  115. print(mu)
  116. print(sigma)
  117.  
  118. print("Estimated Value:")
  119. print(pi_est)
  120. print(mu_est)
  121. print(sigma_est)
  122.  
  123. n, bins, _ = pyplot.hist(x, 100, normed = 1, alpha = 0.3)
  124. seq = numpy.arange(-15, 15, 0.02)
  125. for i in range(len(pi_est)):
  126. pyplot.plot(seq, pi_est[i] * gaussian(mu_est[i], sigma_est[i])(seq), linewidth = 2.0)
  127. pyplot.show()
Add Comment
Please, Sign In to add comment