/Lab1/Astro 585 Lab 1 Ford.py

https://github.com/benelson/Astro585-1 · Python · 247 lines · 145 code · 67 blank · 35 comment · 13 complexity · a5d421ccb4d6a43236b030e28d261cd0 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. # <nbformat>3.0</nbformat>
  3. # <codecell>
  4. srand(42);
  5. N = 10000;
  6. true_mean = 10000.;
  7. y = true_mean+randn(N);
  8. sample_mean = mean(y);
  9. sample_var = var(y);
  10. sample_mean , sample_var
  11. # <codecell>
  12. y32bit = convert(Array{Float32,1},y);
  13. y16bit = convert(Array{Float16,1},y);
  14. sample_mean32bit = mean(y32bit);
  15. sample_mean16bit = mean(y16bit);
  16. sample_var32bit = var(y32bit);
  17. sample_var16bit = var(y16bit);
  18. (sample_mean32bit - sample_mean, sample_mean16bit - sample_mean)
  19. # <codecell>
  20. (sample_var32bit -sample_var, sample_var16bit -sample_var)
  21. # <codecell>
  22. srand(42);
  23. N = 10000;
  24. true_mean = 100000.;
  25. y = true_mean+randn(N);
  26. sample_mean = mean(y);
  27. sample_var = var(y);
  28. sample_mean , sample_var
  29. # <codecell>
  30. y32bit = convert(Array{Float32,1},y);
  31. y16bit = convert(Array{Float16,1},y);
  32. sample_mean32bit = mean(y32bit);
  33. sample_mean16bit = mean(y16bit);
  34. sample_var32bit = var(y32bit);
  35. sample_var16bit = var(y16bit);
  36. sample_mean32bit - sample_mean, sample_mean16bit - sample_mean
  37. # <codecell>
  38. sample_var32bit -sample_var, sample_var16bit -sample_var
  39. # <codecell>
  40. function var_1pass(y::Array)
  41. n = length(y);
  42. sum = zero(y[1]);
  43. sumsq = zero(y[1]);
  44. for i in 1:n
  45. sum = sum + y[i];
  46. sumsq = sumsq + y[i]*y[i];
  47. end
  48. variance = (sumsq - (sum*sum)/n)/(n-1);
  49. end
  50. # <codecell>
  51. function var_2pass(y::Array)
  52. n = length(y);
  53. sum1 = zero(y[1]);
  54. for i in 1:n
  55. sum1 = sum1 + y[i];
  56. end
  57. mean = sum1 / n;
  58. sum2 = zero(y[1]);
  59. for i in 1:n
  60. sum2 = sum2 + (y[i]-mean)*(y[i]-mean);
  61. end
  62. variance = sum2/(n-1);
  63. end
  64. # <codecell>
  65. srand(42);
  66. N = 100000;
  67. true_mean = 100000.;
  68. y = true_mean+randn(N);
  69. var_1pass(y)-var(y), var_2pass(y)-var(y)
  70. # <codecell>
  71. function var_online(y::Array)
  72. n = length(y);
  73. sum1 = zero(y[1]);
  74. mean = zero(y[1]);
  75. M2 = zero(y[1]);
  76. for i in 1:n
  77. diff_by_i = (y[i]-mean)/i;
  78. mean = mean +diff_by_i;
  79. M2 = M2 + (i-1)*diff_by_i*diff_by_i+(y[i]-mean)*(y[i]-mean);
  80. end;
  81. variance = M2/(n-1);
  82. end
  83. var_online(y)-var(y)
  84. # <codecell>
  85. srand(42);
  86. Nobs = 100;
  87. z = zeros(Nobs);
  88. sigma = 2. * ones(Nobs);
  89. y = z + sigma .* randn(Nobs);
  90. # <codecell>
  91. normal_pdf(z, y, sigma) = exp(-0.5.*((y.-z)./sigma).^2)./(sqrt(2*pi).*sigma);
  92. # <codecell>
  93. function likelihood(y::Array, sigma::Array, z::Array)
  94. n = length(y);
  95. assert(length(sigma)==n);
  96. assert(length(z)==n);
  97. prod = one(y[1]);
  98. for i in 1:n
  99. prod = prod * normal_pdf(y[i],z[i],sigma[i]);
  100. end;
  101. return prod;
  102. end
  103. # <codecell>
  104. @time likelihood(y,sigma,z)
  105. # <codecell>
  106. likelihood_prod(y::Array, sigma::Array, z::Array) = prod(normal_pdf(y,z,sigma));
  107. # <codecell>
  108. likelihood_prod(y,sigma,z)
  109. # <codecell>
  110. likelihood_reduce_map(y::Array, sigma::Array, z::Array) = reduce(*,map(normal_pdf,y,z,sigma));
  111. # <codecell>
  112. likelihood_reduce_map(y,sigma,z)
  113. # <codecell>
  114. likelihood_mapreduce(y::Array, sigma::Array, z::Array) = mapreduce(i->normal_pdf(y[i],z[i],sigma[i]),*,1:length(y));
  115. # <codecell>
  116. likelihood_mapreduce(y,sigma,z)
  117. # <codecell>
  118. srand(42);
  119. Nobs = 600;
  120. z = zeros(Nobs);
  121. sigma = 2. * ones(Nobs);
  122. y = z + sigma .* randn(Nobs);
  123. # <codecell>
  124. likelihood(y,sigma,z)
  125. # <codecell>
  126. function log_likelihood(y::Array, sigma::Array, z::Array)
  127. n = length(y);
  128. assert(length(sigma)==n);
  129. assert(length(z)==n);
  130. ll= zero(y[1]);
  131. for i in 1:n
  132. ll = ll + log(normal_pdf(z[i],y[i],sigma[i]));
  133. end;
  134. return ll;
  135. end
  136. # <codecell>
  137. log_likelihood(y,sigma,z)
  138. # <codecell>
  139. log_normal_pdf(z, y, sigma) = -0.5*( ((y-z)/sigma)^2 + log(2*pi*sigma*sigma));
  140. # <codecell>
  141. function log_likelihood_2(y::Array, sigma::Array, z::Array)
  142. n = length(y);
  143. assert(length(sigma)==n);
  144. assert(length(z)==n);
  145. ll= zero(y[1]);
  146. for i in 1:n
  147. ll = ll + log_normal_pdf(z[i],y[i],sigma[i]);
  148. end;
  149. return ll;
  150. end
  151. # <codecell>
  152. log_likelihood_2(y,sigma,z)
  153. # <codecell>
  154. function round_down_to_power_of_ten(x::Real)
  155. if(!isfinite(x))
  156. if(isnan(x)) return nan(x) end
  157. if(isinf(x)) return x end
  158. end
  159. assert(x>0.);
  160. z = 1.0;
  161. if x >= 1.0;
  162. while z*10.<=x
  163. z = z * 10.0;
  164. end
  165. else
  166. while z > x # correct
  167. z = z / 10.0;
  168. end
  169. end
  170. return z;
  171. end
  172. # <codecell>
  173. round_down_to_power_of_ten(0.1)
  174. # <codecell>
  175. round_down_to_power_of_ten(-0.1)
  176. # <codecell>
  177. round_down_to_power_of_ten(NaN)
  178. # <codecell>
  179. round_down_to_power_of_ten(x::Real) = 10.0^(floor(log10(x)));
  180. # <codecell>