2015-05-31 17 views
9

Để tính toán CDF của một bình thường đa biến, tôi theo this dụ (đối với trường hợp đơn biến) nhưng không thể giải thích đầu ra sản xuất bởi scipy:đa biến bình thường CDF bằng Python sử dụng 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])) 

Sản lượng sản xuất là:

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

Nếu CDF chung được định nghĩa là:

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

thì đầu ra dự kiến ​​phải là một số thực trong khoảng từ 0 đến 1.

+0

Tôi không nghĩ rằng bạn có thể sử dụng 'scipy.stats.norm' cho trường hợp đa biến. – cel

+1

'scipy.stats' có' multivariate_normal' (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html), nhưng nó không có phương thức 'cdf'. –

Trả lời

17

Sau khi tìm kiếm rất nhiều, tôi nghĩ rằng đoạn mã readymade duy nhất từ ​​thư viện chuẩn có thể được sử dụng để tính toán cdf cho một biến bình thường đa biến trong Python. Scipy có một cách để làm điều đó nhưng như đã đề cập trong blog, rất khó để tìm thấy. Cách tiếp cận này dựa trên một bài báo của Alan Genz.

Từ blog, đây là cách hoạt động của blog.

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

Có thể truyền một mảng các điểm tới 'mvn.mvnun' không? Tôi đọc mã, có vẻ như tôi chỉ có thể 'loop' qua nó? – cqcn1991

+0

@ cqcn1991 Tôi đang tìm kiếm cdf đa biến để vẽ bằng cách truyền mảng thông qua một tệp. Bạn có thể tìm ra giải pháp không? Bạn có thể vui lòng xem tại đây http://stackoverflow.com/questions/37057938/bivariate-cdf-ccdf-distribution-python –

+0

Vấn đề với '' 'mvn.mvnun''' là nó không xác định. Ít nhất, mã này cho kết quả khác nhau mỗi lần: https://pastebin.com/L0WSTRui –

0

Nếu bạn không quan tâm đến hiệu suất (tức là thực hiện nó chỉ thỉnh thoảng), sau đó bạn có thể tạo pdf bình thường đa biến sử dụng multivariate_normal, và sau đó tính toán lũy bởi integrate.nquad

+0

Bạn có thể vui lòng giải thích cách chúng ta có thể sử dụng điều này không? và điều này có thể được sử dụng để tìm ra kỳ vọng của một hàm phụ thuộc vào phân phối bình thường đa biến không? –

Các vấn đề liên quan