Với một giá trị trung bình và một phương sai, có một lệnh gọi hàm đơn giản sẽ vẽ biểu đồ phân phối chuẩn không?
Với một giá trị trung bình và một phương sai, có một lệnh gọi hàm đơn giản sẽ vẽ biểu đồ phân phối chuẩn không?
Câu trả lời:
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import math
mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, stats.norm.pdf(x, mu, sigma))
plt.show()
scipy.stats.norm.pdf(x, mu, sigma)
thay vìmlab.normpdf(x, mu, sigma)
math
khi bạn đã nhập numpy
và có thể sử dụng np.sqrt
?
math
cho các hoạt động vô hướng vì ví dụ, math.sqrt
nhanh hơn một độ lớn so với np.sqrt
khi hoạt động trên vô hướng.
Tôi không nghĩ rằng có một chức năng thực hiện tất cả những điều đó trong một lần gọi. Tuy nhiên, bạn có thể tìm thấy hàm mật độ xác suất Gaussian trongscipy.stats
.
Vì vậy, cách đơn giản nhất mà tôi có thể nghĩ ra là:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Plot between -10 and 10 with .001 steps.
x_axis = np.arange(-10, 10, 0.001)
# Mean = 0, SD = 2.
plt.plot(x_axis, norm.pdf(x_axis,0,2))
plt.show()
Nguồn:
norm.pdf
thành norm(0, 1).pdf
. Điều này giúp dễ dàng điều chỉnh các trường hợp khác / hiểu rằng điều này tạo ra một đối tượng đại diện cho một biến ngẫu nhiên.
Sử dụng seaborn thay vì tôi đang sử dụng distplot của seaborn với giá trị trung bình = 5 std = 3/1000
value = np.random.normal(loc=5,scale=3,size=1000)
sns.distplot(value)
Bạn sẽ nhận được một đường cong phân phối chuẩn
Nếu bạn thích sử dụng phương pháp tiếp cận từng bước, bạn có thể xem xét một giải pháp như sau
import numpy as np
import matplotlib.pyplot as plt
mean = 0; std = 1; variance = np.square(std)
x = np.arange(-5,5,.01)
f = np.exp(-np.square(x-mean)/2*variance)/(np.sqrt(2*np.pi*variance))
plt.plot(x,f)
plt.ylabel('gaussian distribution')
plt.show()
Tôi vừa quay lại điều này và tôi đã phải cài đặt scipy vì matplotlib.mlab đã đưa cho tôi thông báo lỗi MatplotlibDeprecationWarning: scipy.stats.norm.pdf
khi thử ví dụ ở trên. Vì vậy, mẫu bây giờ là:
%matplotlib inline
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats
mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, scipy.stats.norm.pdf(x, mu, sigma))
plt.show()
Tôi tin rằng điều quan trọng là đặt chiều cao, vì vậy đã tạo hàm này:
def my_gauss(x, sigma=1, h=1, mid=0):
from math import exp, pow
variance = pow(sdev, 2)
return h * exp(-pow(x-mid, 2)/(2*variance))
Đâu sigma
là độ lệch chuẩn, h
là chiều cao và mid
là giá trị trung bình.
Đây là kết quả sử dụng các độ cao và độ lệch khác nhau:
bạn có thể lấy cdf dễ dàng. so pdf qua cdf
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
import scipy.stats
def setGridLine(ax):
#http://jonathansoma.com/lede/data-studio/matplotlib/adding-grid-lines-to-a-matplotlib-chart/
ax.set_axisbelow(True)
ax.minorticks_on()
ax.grid(which='major', linestyle='-', linewidth=0.5, color='grey')
ax.grid(which='minor', linestyle=':', linewidth=0.5, color='#a6a6a6')
ax.tick_params(which='both', # Options for both major and minor ticks
top=False, # turn off top ticks
left=False, # turn off left ticks
right=False, # turn off right ticks
bottom=False) # turn off bottom ticks
data1 = np.random.normal(0,1,1000000)
x=np.sort(data1)
y=np.arange(x.shape[0])/(x.shape[0]+1)
f2 = scipy.interpolate.interp1d(x, y,kind='linear')
x2 = np.linspace(x[0],x[-1],1001)
y2 = f2(x2)
y2b = np.diff(y2)/np.diff(x2)
x2b=(x2[1:]+x2[:-1])/2.
f3 = scipy.interpolate.interp1d(x, y,kind='cubic')
x3 = np.linspace(x[0],x[-1],1001)
y3 = f3(x3)
y3b = np.diff(y3)/np.diff(x3)
x3b=(x3[1:]+x3[:-1])/2.
bins=np.arange(-4,4,0.1)
bins_centers=0.5*(bins[1:]+bins[:-1])
cdf = scipy.stats.norm.cdf(bins_centers)
pdf = scipy.stats.norm.pdf(bins_centers)
plt.rcParams["font.size"] = 18
fig, ax = plt.subplots(3,1,figsize=(10,16))
ax[0].set_title("cdf")
ax[0].plot(x,y,label="data")
ax[0].plot(x2,y2,label="linear")
ax[0].plot(x3,y3,label="cubic")
ax[0].plot(bins_centers,cdf,label="ans")
ax[1].set_title("pdf:linear")
ax[1].plot(x2b,y2b,label="linear")
ax[1].plot(bins_centers,pdf,label="ans")
ax[2].set_title("pdf:cubic")
ax[2].plot(x3b,y3b,label="cubic")
ax[2].plot(bins_centers,pdf,label="ans")
for idx in range(3):
ax[idx].legend()
setGridLine(ax[idx])
plt.show()
plt.clf()
plt.close()
%matplotlib inline
để làm cho cốt truyện hiển thị