2015-05-31 23 views
9

W celu obliczenia CDF wielowymiarową normalny, i następnie this przykładu (na jednoczynnikowej przypadku), ale nie może interpretować sygnał wyjściowy wytwarzany przez scipy:wieloczynnikowa normalny CDF Pythona pomocą 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])) 

produktów wytworzonych oznacza:

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

Jeżeli wspólny CDF jest zdefiniowany jako:

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

to oczekiwane wyjście powinno być rzeczywistą liczbą z zakresu od 0 do 1.

+0

Nie sądzę cię może użyć 'scipy.stats.norm' dla przypadku wielowymiarowego. – cel

+1

'scipy.stats' ma' multivariate_normal' (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html), ale nie ma metody 'cdf'. –

Odpowiedz

17

Po wielu poszukiwaniach uważam, że wpis na blogu autorstwa Noah H. Silberta opisuje jedyny kod odczytu z biblioteki standardowej, który może być użyty do obliczenia cdf dla wielu odmian normalnych w języku Python. Scipy ma na to sposób, ale jak wspomniano na blogu, trudno go znaleźć. Podejście opiera się na pracy Alana Genza.

To właśnie z tego bloga działa.

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 
+0

Czy można przekazać tablicę punktów do 'mvn.mvnun'? Czytałem kod, wydaje się, że mogę tylko "pętla" przez to? – cqcn1991

+0

@ cqcn1991 Poszukuję wielowariantowego cdf do wydruku, przekazując tablicę przez plik. Czy byłeś w stanie znaleźć rozwiązania? Czy możesz zajrzeć tutaj http://stackoverflow.com/questions/37057938/bivariate-cdf-ccdf-distribution-python –

+0

Problem z '' 'mvn.mvnun''' jest taki, że nie jest deterministyczny. Przynajmniej ten kod daje różne wyniki za każdym razem: https://pastebin.com/L0WSTRui –

0

Jeśli nie dbają o wydajności (czyli wykonać go tylko sporadycznie), wówczas można utworzyć za pomocą wieloczynnikowej normalnego pdf multivariate_normal, a następnie obliczyć CDF przez integrate.nquad

+0

Czy możesz wyjaśnić, w jaki sposób możemy z tego skorzystać? i czy można to wykorzystać do znalezienia oczekiwanej funkcji zależnej od wielowymiarowej dystrybucji normalnej? –