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!
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!
Với sự xuất sắc matplotlib
và numpy
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ư
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.
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.)))
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
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))
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
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)
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). –