2015-05-31 15 views
9

Per calcolare il CDF di una normale multivariata, ho seguito this esempio (per caso univariato), ma non può interpretare l'uscita prodotta da SciPy:multivariata normale CDF in Python utilizzando 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])) 

L'uscita prodotta è:

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

Se il CDF giunto è definito come:

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

quindi l'output atteso dovrebbe essere un numero reale compreso tra 0 e 1.

+0

Io non credo che si può usare 'scipy.stats.norm' per il caso multivariato. – cel

+1

'scipy.stats' ha' multivariate_normal' (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html), ma non ha un metodo 'cdf'. –

risposta

17

Dopo aver cercato molto, penso che il blog this di Noah H. Silbert descriva l'unico codice readymade da una libreria standard che può essere utilizzato per il calcolo del cdf per una normale multivariata in Python. Scipy ha un modo per farlo ma, come detto nel blog, è difficile da trovare. L'approccio è basato su un lavoro di Alan Genz.

Dal blog, è così che funziona.

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

È possibile passare una serie di punti a 'mvn.mvnun'? Ho letto il codice, sembra che posso solo "passarci sopra"? – cqcn1991

+0

@ cqcn1991 Sto cercando un cdf multivariato per tracciare un array attraverso un file. Sei riuscito a trovare le soluzioni? Potete per favore dare un'occhiata qui http://stackoverflow.com/questions/37057938/bivariate-cdf-ccdf-distribution-python –

+0

Il problema con '' 'mvn.mvnun''' è che non è deterministico. Almeno, questo codice dà ogni volta risultati diversi: https://pastebin.com/L0WSTRui –

0

Se non si cura di prestazioni (cioè eseguire solo occasionalmente), quindi è possibile creare il pdf normale multivariata utilizzando multivariate_normal, e quindi calcolare il CDF da integrate.nquad

+0

Puoi per favore approfondire come possiamo usare questo? e può essere usato per trovare l'aspettativa di una funzione che dipende da una distribuzione normale multivariata? –

Problemi correlati