Многомерное нормальное 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