Я пытаюсь смоделировать геометрическое распределение, используя метод Inverse CDF, однако я получаю немного неправильные результаты, и я не уверен, почему.
Точнее, геометрическое распределение с коэффициентом формыр = 0,8, должен иметь следующие характеристики:
mean: 1.25
variance: 0.31
Однако, запустив приведенный ниже код, я получаю:
mean: 0.6224363901913519
var: 0.391813011265263
[Finished in 0.3s]
Как вы видите, я получаю дико другоесреднее значение по сравнению с ожидаемым.
np.log (iform [i]) / np.log (1-p) является результатом решения уравнения: F (X) = R дляX в терминах R, F (X) = CDF геометрического распределения = 1 - (1 - p) ^ k.
R - равномерное распределение по интервалу (0,1).
Таким образом, его решение приводит к следующему:
X = ln (1-R) / ln (1-p)
Однако, поскольку оба1-R и R равномерно распределены по (0,1), мы можем сделать следующее упрощение:
X = ln (R) / ln (1-p)
Выше приведено уравнениеи должен привести к образцу геометрического распределения.
import numpy as np
n = 10000
p = 0.8
geo_dist = np.zeros(n,dtype = np.float64)
uniform = np.random.uniform(0, 1, n)
for i in range(n):
geo_dist[i] = np.log(uniform[i])/np.log(1-p)
print("mean: " +str(geo_dist.mean()))
print("var: " +str(geo_dist.var()))
Я попытался увеличить точность вычислений с помощью np.float64 в отчаянной попытке исправить то, что должно быть тривиальным скриптом, но безрезультатно.
Я также попытался сгенерировать равномерное распределение, используя scipyiform.rvs () вместо np.uniform, и проблема сохраняется.
Если p = 0,5:
expected mean: 2
expected variance : 2
код, который я написал, имеет следующий результат:
mean: 1.4440009653569306
var: 2.0421079966161093
[Finished in 0.3s]
У кого-нибудь есть идеи, почему это не работает?Спасибо.