Advertisement
vatman

Untitled

May 21st, 2024
783
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.03 KB | None | 0 0
  1. import numpy as np
  2. import random as rand
  3. from scipy.stats import chi2
  4.  
  5.  
  6. def isVer(p):
  7.     return 0 <= p <= 1
  8.  
  9.  
  10. def ver(p1, p2, error=0.01):
  11.     result = {}
  12.     for i in range(100):
  13.         if i == 0:
  14.             result[i] = p1
  15.         else:
  16.             ver_p = (
  17.                 p2 * (1 - p1) ** i * (1 - p2) ** (i - 1)
  18.                 + p1 * (1 - p1) ** i * (1 - p2) ** i
  19.             )
  20.             result[i] = ver_p
  21.             if ver_p < error:
  22.                 break
  23.     return result
  24.  
  25.  
  26. def getVer(first_p, second_p, count):
  27.     result = {}
  28.     if isVer(first_p) and isVer(second_p):
  29.         for i in range(count):
  30.             local_p_1 = rand.random()
  31.             local_p_2 = rand.random()
  32.             sum = 0
  33.             while local_p_1 > first_p and local_p_2 > second_p:
  34.                 sum += 1
  35.                 local_p_1 = rand.random()
  36.                 local_p_2 = rand.random()
  37.  
  38.             if local_p_1 < first_p:
  39.                 result[sum] = result.get(sum, 0) + 1
  40.             else:
  41.                 result[sum + 1] = result.get(sum + 1, 0) + 1
  42.     else:
  43.         print("p not ver")
  44.     return result
  45.  
  46.  
  47. number_intervals = int(input("Введите количество интервалов: "))
  48. intervals = []
  49. for i in range(number_intervals):
  50.     interval = float(input(f"Введите верхнюю границу интервала {i+1}: "))
  51.     intervals.append(interval - 1)
  52.  
  53. first_p = float(input("first_p = "))
  54. second_p = float(input("second_p = "))
  55. error = 0.0001
  56. count = int(input(f"count = "))
  57. theoretical_prob = ver(first_p, second_p, error)
  58.  
  59. theoretical_frequencies = [0] * (len(intervals) + 1)
  60. for k, freq in theoretical_prob.items():
  61.     for i, upper_bound in enumerate(intervals):
  62.         if k <= upper_bound:
  63.             theoretical_frequencies[i] += freq * count
  64.             break
  65.     else:
  66.         theoretical_frequencies[-1] += freq * count
  67.  
  68. print("Теоретические вероятности:")
  69. for i in range(len(theoretical_frequencies)):
  70.     print(f"q{i} = {theoretical_frequencies[i]/count}")
  71. alpha = float(input("Введите уровень значимости (например, 0.05): "))
  72. number_exp = int(input("number_exp = "))
  73. accept_hyp = 0
  74. reject_hyp = 0
  75. for i in range(number_exp):
  76.     empirical_prob = getVer(first_p, second_p, count)
  77.     empirical_frequencies = [0] * (len(intervals) + 1)
  78.     for k, freq in empirical_prob.items():
  79.         for i, upper_bound in enumerate(intervals):
  80.             if k <= upper_bound:
  81.                 empirical_frequencies[i] += freq
  82.                 break
  83.         else:
  84.             empirical_frequencies[-1] += freq
  85.     chi_squared = sum(
  86.         (empirical_frequencies[i] - theoretical_frequencies[i]) ** 2
  87.         / theoretical_frequencies[i]
  88.         for i in range(len(theoretical_frequencies))
  89.     )
  90.     critical_value = chi2.ppf(1 - alpha, df=number_intervals)
  91.  
  92.     if chi_squared < critical_value:
  93.         accept_hyp += 1
  94.     else:
  95.         reject_hyp += 1
  96. print(f"{accept_hyp = }")
  97. print(f"{reject_hyp = }")
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement