2013-02-14 60 views
10

Làm cách nào để tạo các ô của hàm phân phối Gauss 1 chiều bằng giá trị tham số trung bình và độ lệch chuẩn (μ, σ) = (−1, 1), (0, 2) và (2, 3)?Vẽ chức năng phân phối Gaussian 1 chiều

Tôi là người mới lập trình, sử dụng Python.

Cảm ơn bạn trước!

Trả lời

21

Với sự xuất sắc matplotlibnumpy gói

from matplotlib import pyplot as mp 
import numpy as np 

def gaussian(x, mu, sig): 
    return np.exp(-np.power(x - mu, 2.)/(2 * np.power(sig, 2.))) 

for mu, sig in [(-1, 1), (0, 2), (2, 3)]: 
    mp.plot(gaussian(np.linspace(-3, 3, 120), mu, sig)) 

mp.show() 

sẽ tạo ra một cái gì đó giống như plot showing gaussians of varying widths in varying colours

Ngoài ra - www.whathaveyoutried.com đôi khi tôi cảm thấy giống như một cốc bài tập về nhà như vậy.

+13

PDF gaussian của bạn sai - bạn cần chia tỷ lệ theo (\ sqrt (2 \ pi) \ sigma)^(- 1). Ngoài ra, x * x nhanh hơn nhiều so với pow (x, 2). –

8

Bạn đang thiếu một dấu ngoặc trong mẫu số của hàm gaussian() của bạn. Vì nó là ngay bây giờ bạn chia cho 2 và nhân với phương sai (sig^2). Nhưng điều đó không đúng và khi bạn có thể thấy các ô của bạn thì phương sai lớn hơn thì gaussian càng hẹp - điều đó là sai, nó phải là đối lập.

Vì vậy, chỉ cần thay đổi chức năng gaussian() để:

def gaussian(x, mu, sig): 
    return np.exp(-np.power(x - mu, 2.)/(2 * np.power(sig, 2.))) 
+0

Công thức này là sai bởi vì nếu bạn tích hợp nó từ âm vô cực đến vô cực, bạn sẽ nhận được sqrt (2) * sqrt (pi) không đúng. Công thức đúng là 1/sqrt (2 * pi) * exp (-x^2/2). Mặc dù, trong biểu mẫu này, giá trị trung bình của nó là 0 và phương sai là 1, bạn có thể thay đổi và chia tỷ lệ gaussian này theo ý muốn – Evgeny

9

bạn có thể đọc hướng dẫn này để làm thế nào để sử dụng chức năng của các bản phân phối thống kê trong python. http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html

from scipy.stats import norm 
import matplotlib.pyplot as plt 
import numpy as np 

#initialize a normal distribution with frozen in mean=-1, std. dev.= 1 
rv = norm(loc = -1., scale = 1.0) 
rv1 = norm(loc = 0., scale = 2.0) 
rv2 = norm(loc = 2., scale = 3.0) 

x = np.arange(-10, 10, .1) 

#plot the pdfs of these normal distributions 
plt.plot(x, rv.pdf(x), x, rv1.pdf(x), x, rv2.pdf(x)) 
4

Ngoài câu trả lời trước, tôi khuyên bạn nên đến đầu tiên tính toán tỷ lệ trong mũ, sau đó lấy vuông:

def gaussian(x,x0,sigma): 
    return np.exp(-np.power((x - x0)/sigma, 2.)/2.) 

Bằng cách đó, bạn cũng có thể tính toán gaussian của rất nhỏ hoặc số rất lớn:

In: gaussian(1e-12,5e-12,3e-12) 
Out: 0.64118038842995462 
5

hình thức đúng, dựa trên cú pháp ban đầu, và chính xác bình thường là:

def gaussian(x, mu, sig): 
    return 1./(sqrt(2.*pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2) 
Các vấn đề liên quan