Многомерное нормальное распределение с использованием статистики Python scipy и интеграции nquad

Пусть
Многомерное нормальное распределение с использованием статистики Python scipy и интеграции nquad
быть независимыми нормальными случайными величинами со средними значениями
Многомерное нормальное распределение с использованием статистики Python scipy и интеграции nquad
и единичные отклонения, т. е.
Многомерное нормальное распределение с использованием статистики Python scipy и интеграции nquad
Я хотел бы вычислить вероятность

Есть ли простой способ вычислить указанную выше вероятность, используя scipy.stats.multivariate_normal? Если нет, то как это сделать, используя scipy.integrate?

Я не вижу очевидного способа сделать это из документации.

butterflyknife 08.07.2024 10:46

В таком случае, как проще всего реализовать приведенные выше вычисления? Большое спасибо.

Ishigami 08.07.2024 11:25

Я преобразовал LaTex в изображение, чтобы сделать эту часть понятной. Вы уверены в пределах своего интеграла? Написано так: первый член всегда равен единице, а следующие переменные не удовлетворяют условию меньше, чем. Посмотрите свою модель и при необходимости обновите ее.

jlandercy 10.07.2024 14:12

@jlandercy Большое спасибо, предел верен, поскольку нижняя граница $\int dx_2$ зависит от x_1 и, следовательно, самый внешний интеграл не интегрируется до 1. В частности, интеграл не разделим.

Ishigami 12.07.2024 14:53

Тесно связано: math.stackexchange.com/questions/270745/…

Daniel 15.07.2024 18:39

Вы уверены, что эти средства разные? Если бы переменные были одинаково распределены, ответ был бы 1/n! из базовой теории вероятностей. В любом случае, вероятность будет очень мала, если n велико.

lastchance 16.07.2024 08:50

@Исигами, привет, не могли бы вы пометить мой ответ как принятый, пожалуйста?

Johnny Cheesecutter 21.07.2024 23:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
7
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе информации из одного из сообщений 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

Другие вопросы по теме