Вычислить вероятность по многомерной нормали

Мой вопрос касается как математических проблем, так и проблем CS, но, поскольку мне нужна эффективная реализация, я публикую ее здесь.

Проблема:

У меня есть примерное нормальное двумерное распределение, определенное как матрица Python, но тогда мне нужно будет перенести то же вычисление в Java. (здесь фиктивные значения)

mean = numpy.matrix([[0],[0]])
cov = numpy.matrix([[1,0],[0,1]])

Когда я получаю inupt вектор-столбец со значениями целых чисел (x, y), я хочу вычислить вероятность этого заданного кортежа.

value = numpy.matrix([[4],[3]])
probability_of_value_given_the_distribution = ???

Теперь, с математической точки зрения, это был бы интеграл для 3.5 < x < 4.5 и 2.5 < y < 3.5 по функции плотности вероятности моей нормы.

Что я хочу знать:

Есть ли способ избежать эффективной реализации этого, что подразумевает работу с выражениями, определенными над матрицами и с двойными интегралами? Кроме того, мне потребовалось бы время, если бы мне пришлось реализовать это самостоятельно, это было бы дорогостоящим в вычислительном отношении. Приблизительное решение меня вполне устроило бы.

Мои рассуждения:

В одномерном нормальном можно просто использовать кумулятивную функцию распределения (или даже сохранить ее значения для стандартной, а затем нормализовать), но, к сожалению, появляется не быть закрытой формой cdf для многовариантных значений.

Другой подход для одномерного - использовать обратное двумерное приближение (так, приблизить нормаль к биному), но, расширив это до многомерного, я не могу понять, как учитывать ковариации.

Я очень надеюсь, что кто-то уже реализовал это, мне это нужно скоро (заканчиваю диссертацию), и я ничего не нашел.


person unziberla    schedule 27.02.2013    source источник
comment
Вы проверили Вычислить многомерный нормальный CDF в Java, кажется, будь именно тем, что ты пытаешься сделать   -  person iTech    schedule 28.02.2013
comment
Cdf - это именно то, что мне нужно. Прошу прощения за то, что это не указано явно. По-видимому, это не так тривиально, я либо сделаю некоторое приближение, либо использую Matlab для вычисления значений, которые представляют интерес в моей программе, и сохраню их в таблице (программа работает на Android, поэтому нет возможности выполнить там код fortran)   -  person unziberla    schedule 28.02.2013


Ответы (2)


OpenTURNS обеспечивает эффективную реализацию CDF для многоязычного распределения (см. код).

import numpy as np

mean = np.array([0.0, 0.0])
cov = np.array([[1.0, 0.0],[0.0, 1.0]])

Создадим мультинормальное распределение с этими параметрами.

import openturns as ot
multinormal = ot.Normal(mean, ot.CovarianceMatrix(cov))

Теперь давайте вычислим вероятность квадрата [3.5, 4.5] x | 2.5, 3.5]:

prob = multinormal.computeProbability(ot.Interval([3.5,2.5], [4.5,3.5])) 
print(prob)

Вычисленная вероятность:

1.3701244220201715e-06
person josephmure    schedule 09.10.2020

Если вы ищете вероятностную функцию плотности двумерного нормального распределения, ниже приведены несколько строк, которые мог сделать работу:

import numpy as np

def multivariate_pdf(vector, mean, cov):
    quadratic_form = np.dot(np.dot(vector-mean,np.linalg.inv(cov)),np.transpose(vector-mean))
    return np.exp(-.5 * quadratic_form)/ (2*np.pi * np.linalg.det(cov))

mean = np.array([0,0])
cov = np.array([[1,0],[0,1]])
vector = np.array([4,3])

pdf = multivariate_pdf(vector, mean, cov)
person Minet Jean    schedule 27.02.2013
comment
извините, но мне нужна кумулятивная функция плотности - person unziberla; 28.02.2013