Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4.  
  5. def direct_sum(x):
  6. """Последовательная сумма всех элементов вектора x"""
  7. s = 0.
  8. for e in x:
  9. s += e
  10. return s
  11.  
  12.  
  13. def relative_error(x0, x):
  14. """Погрешность x при точном значении x0"""
  15. return np.abs(x0 - x) / np.abs(x)
  16.  
  17.  
  18. # параметры выборки
  19. mean = 1e6 # среднее
  20. delta = 1e-5 # величина отклонения от среднего
  21.  
  22.  
  23. def samples(N_over_two):
  24. """Генерирует выборку из 2*N_over_two значений с данным средним и среднеквадратическим
  25. отклонением."""
  26. x = np.full((2 * N_over_two,), mean, dtype=np.double)
  27. x[:N_over_two] += delta
  28. x[N_over_two:] -= delta
  29. return np.random.permutation(x)
  30.  
  31.  
  32. def exact_mean():
  33. """Значение среднего арифметического по выборке с близкой к машинной точностью."""
  34. return mean
  35.  
  36.  
  37. def exact_variance():
  38. """Значение оценки дисперсии с близкой к машинной точностью."""
  39. return delta ** 2
  40.  
  41.  
  42. x = samples(1000000)
  43. print("Размер выборки:", len(x))
  44. print("Среднее значение:", exact_mean())
  45. print("Оценка дисперсии:", exact_variance())
  46. print("Ошибка среднего для встроенной функции:", relative_error(exact_mean(), np.mean(x)))
  47. print("Ошибка дисперсии для встроенной функции:", relative_error(exact_variance(), np.var(x)))
  48.  
  49.  
  50. def direct_mean(x):
  51. """Среднее через последовательное суммирование."""
  52. return direct_sum(x) / len(x)
  53.  
  54.  
  55. print("Ошибка среднего для последовательного суммирования:", relative_error(exact_mean(), direct_mean(x)))
  56.  
  57.  
  58. def direct_first_var(x):
  59. """Первая оценка дисперсии через последовательное суммирование."""
  60. return direct_mean((x - direct_mean(x)) ** 2)
  61.  
  62.  
  63. print("Ошибка первой оценки дисперсии для последовательного суммирования:",
  64. relative_error(exact_variance(), direct_first_var(x)))
  65.  
  66.  
  67. def direct_second_var(x):
  68. """Вторая оценка дисперсии через последовательное суммирование."""
  69. return direct_mean(x ** 2) - direct_mean(x) ** 2
  70.  
  71.  
  72. def online_second_var(x):
  73. """Вторая оценка дисперсии через один проход по выборке"""
  74. m = x[0] # накопленное среднее
  75. m2 = x[0] ** 2 # накопленное среднее квадратов
  76. for n in range(1, len(x)):
  77. m = (m * (n - 1) + x[n]) / n
  78. m2 = (m2 * (n - 1) + x[n] ** 2) / n
  79. return m2 - m ** 2
  80.  
  81.  
  82. # print("Ошибка второй оценки дисперсии для последовательного суммирования:",
  83. # relative_error(exact_variance(), direct_second_var(x)))
  84. print("Ошибка второй оценки дисперсии для однопроходного суммирования:",
  85. relative_error(exact_variance(), online_second_var(x)))
  86.  
  87.  
  88. def ideal_calculate_val(x):
  89. n = len(x)
  90. m = x[0] # мат ожидание
  91. m2 = (x[0] + x[1]) / 2.0 # следующее мат ожидание
  92. res = (x[0] - m) ** 2 + n * (m - m2) ** 2
  93. alpha = 0
  94. for i in range(1, n - 1):
  95. alpha = (m - m2) ** 2
  96. m = m2
  97. m2 = (m2 * (i + 1) + x[i + 1]) / (i + 2)
  98. res = (x[i] - m) ** 2 + alpha
  99. # res += alpha * n
  100. return res
  101.  
  102.  
  103. val = ideal_calculate_val(x)
  104. print("Ошибка оценки дисперсии для однопроходного вычисления", relative_error(exact_variance(), val))
  105. print(val)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement