2013-12-17 36 views
35

Làm cách nào để tính toán nghịch đảo của hàm phân phối tích lũy (CDF) của phân bố chuẩn trong Python?Làm thế nào để tính toán nghịch đảo của hàm phân phối tích lũy chuẩn trong python?

Tôi nên sử dụng thư viện nào? Có thể scipy?

+1

Bạn có nghĩa là sự phân bố Gaussian nghịch đảo (http://en.wikipedia.org/wiki/ Inverse_Gaussian_distribution), hoặc nghịch đảo của hàm phân phối tích lũy của phân bố chuẩn (http://en.wikipedia.org/wiki/Normal_distribution), hay cái gì khác? –

+0

@WarrenWeckesser thứ hai: nghịch đảo của hàm phân phối tích lũy của phân phối chuẩn – Yueyoum

+0

@WarrenWeckesser i có nghĩa là phiên bản python của hàm "normsinv" trong excel. – Yueyoum

Trả lời

69

NORMSINV (được đề cập trong nhận xét) là nghịch đảo của CDF của phân bố chuẩn chuẩn. Sử dụng scipy, bạn có thể tính toán điều này bằng phương pháp ppf của đối tượng scipy.stats.norm. Từ viết tắt ppf là viết tắt của percent point function, là một tên khác cho số quantile function.

In [20]: from scipy.stats import norm 

In [21]: norm.ppf(0.95) 
Out[21]: 1.6448536269514722 

Kiểm tra xem nó là nghịch đảo của CDF:

In [34]: norm.cdf(norm.ppf(0.95)) 
Out[34]: 0.94999999999999996 

Theo mặc định, norm.ppf sử dụng trung bình = 0 và stddev = 1, đó là "tiêu chuẩn" phân phối chuẩn. Bạn có thể sử dụng độ lệch chuẩn và trung bình khác bằng cách chỉ định đối số locscale tương ứng.

In [35]: norm.ppf(0.95, loc=10, scale=2) 
Out[35]: 13.289707253902945 

Nếu bạn nhìn vào các mã nguồn cho scipy.stats.norm, bạn sẽ thấy rằng phương pháp ppf rốt cuộc gọi scipy.special.ndtri. Vì vậy, để tính toán nghịch đảo của CDF của phân phối chuẩn chuẩn, bạn có thể sử dụng chức năng trực tiếp:

In [43]: from scipy.special import ndtri 

In [44]: ndtri(0.95) 
Out[44]: 1.6448536269514722 
+10

Tôi luôn nghĩ rằng "chức năng điểm phần trăm" (ppf) là một tên khủng khiếp. Hầu hết mọi người trong số liệu thống kê chỉ sử dụng "hàm số lượng tử". –

5
# given random variable X (house price) with population muy = 60, sigma = 40 
import scipy as sc 
import scipy.stats as sct 
sc.version.full_version # 0.15.1 

#a. Find P(X<50) 
sct.norm.cdf(x=50,loc=60,scale=40) # 0.4012936743170763 

#b. Find P(X>=50) 
sct.norm.sf(x=50,loc=60,scale=40) # 0.5987063256829237 

#c. Find P(60<=X<=80) 
sct.norm.cdf(x=80,loc=60,scale=40) - sct.norm.cdf(x=60,loc=60,scale=40) 

#d. how much top most 5% expensive house cost at least? or find x where P(X>=x) = 0.05 
sct.norm.isf(q=0.05,loc=60,scale=40) 

#e. how much top most 5% cheapest house cost at least? or find x where P(X<=x) = 0.05 
sct.norm.ppf(q=0.05,loc=60,scale=40) 
+1

PS: Bạn có thể giả định 'loc' là 'mean' và 'scale' là 'độ lệch chuẩn' – Suresh2692

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