Пусть
быть независимыми нормальными случайными величинами со средними значениями
и единичные отклонения, т. е.
Я хотел бы вычислить вероятность
Есть ли простой способ вычислить указанную выше вероятность, используя scipy.stats.multivariate_normal
? Если нет, то как это сделать, используя scipy.integrate
?
В таком случае, как проще всего реализовать приведенные выше вычисления? Большое спасибо.
Я преобразовал LaTex в изображение, чтобы сделать эту часть понятной. Вы уверены в пределах своего интеграла? Написано так: первый член всегда равен единице, а следующие переменные не удовлетворяют условию меньше, чем. Посмотрите свою модель и при необходимости обновите ее.
@jlandercy Большое спасибо, предел верен, поскольку нижняя граница $\int dx_2$ зависит от x_1 и, следовательно, самый внешний интеграл не интегрируется до 1. В частности, интеграл не разделим.
Тесно связано: math.stackexchange.com/questions/270745/…
Вы уверены, что эти средства разные? Если бы переменные были одинаково распределены, ответ был бы 1/n! из базовой теории вероятностей. В любом случае, вероятность будет очень мала, если n велико.
@Исигами, привет, не могли бы вы пометить мой ответ как принятый, пожалуйста?
На основе информации из одного из сообщений SO, упомянутого в комментариях: https://math.stackexchange.com/questions/270745/compute-probability-of-a-private-ordering-of-normal-random-variables
Также тот же метод, упомянутый здесь в вики: https://en.wikipedia.org/wiki/Multivariate_normal_distribution#Affine_transformation
Вам следует преобразовать F(X) в F(Y) следующим образом:
import numpy as np
from scipy.stats import norm, multivariate_normal
mvn = multivariate_normal
def compute_probability(thetas):
"""
following:
https://en.wikipedia.org/wiki/Multivariate_normal_distribution#Affine_transformation
F(X1<X2<X3<...<Xn) = F(Y1<0, Y2<0, ... Y_{n-1}<0)
where:
Y_i = X_{i-1} - X_{i}
...
or what is the same:
Y = c + BX
mean and sigma of Y can be found based on formulas from wikipedia
"""
n = len(thetas)
# set diagonal to 1
B = np.eye(n)
# set right to diagonal to -1
idx = np.arange(n-1)
B[idx,idx+1] = -1
# remove last row
B = B[:-1]
# calculate multivate sigma and mu
sigma = np.eye(n)
mu_new = B.dot(thetas.T)
sigma_new = B.dot(sigma).dot(B.T)
MVN = mvn(mean=mu_new, cov = sigma_new)
x0 = np.zeros(shape = n-1)
p = MVN.cdf(x = x0)
return p
# Example usage:
theta = np.array([1, -2, 0.5]) # Example coefficient
p = compute_probability(theta)
print(p)
Выходы:
theta = (0,0)
p = 0.5
theta = (0,0,0)
p = 0.1666
theta = (100, -100)
p = 0
theta = (-100, 100)
p = 1
theta = (0,0,0,100, -100)
p = 0
Я не вижу очевидного способа сделать это из документации.