Многомерное нормальное CDF в Python с использованием scipy

чтобы вычислить CDF многомерного нормального, я следовал этой пример (для одномерного случая), но не может интерпретировать результат, полученный scipy:

from scipy.stats import norm
import numpy as np
mean = np.array([1,5])
covariance = np.matrix([[1, 0.3 ],[0.3, 1]])
distribution = norm(loc=mean,scale = covariance)
print distribution.cdf(np.array([2,4]))

произведенной продукции-это:

[[  8.41344746e-01   4.29060333e-04]
 [  9.99570940e-01   1.58655254e-01]]

Если совместное CDF определено как:

P (X1 ≤ x1, . . . ,Xn ≤ xn)

тогда ожидаемый результат должен быть вещественным числом от 0 до 1.

3 ответов


после поиска много, я думаю этой запись в блоге Ноя Х. Сильберта описывает единственный готовый код из стандартной библиотеки, который может быть использован для вычисления cdf для многомерного нормального в Python. У Scipy есть способ сделать это, но, как упоминалось в блоге, его трудно найти. Подход основан на работе Алана Генца.

из блога, Вот как это работает.

from scipy.stats import mvn
import numpy as np
low = np.array([-10, -10])
upp = np.array([.1, -.2])
mu = np.array([-.3, .17])
S = np.array([[1.2,.35],[.35,2.1]])
p,i = mvn.mvnun(low,upp,mu,S)
print p

0.2881578675080012

Если вы не заботитесь о производительности (т. е. выполняете ее только иногда), то вы можете создать многомерный обычный pdf, используя multivariate_normal, а затем вычислить cdf по integrate.nquad


и составляющей multi_variate_normal из v1.1.0 имеет встроенную функцию cdf:

from scipy.stats import multivariate_normal as mvn
mean = np.array([1,5])
covariance = np.matrix([[1, 0.3 ],[0.3, 1]])
mvn = multivariate_normal(mean=mean, cov=covariance)
print "CDF:", mvn.cdf(np.array([2,4]))

CDF: 0.14833820905742245