ระบุค่าเฉลี่ยและความแปรปรวนมีการเรียกใช้ฟังก์ชันอย่างง่ายซึ่งจะพล็อตการแจกแจงแบบปกติหรือไม่?
ระบุค่าเฉลี่ยและความแปรปรวนมีการเรียกใช้ฟังก์ชันอย่างง่ายซึ่งจะพล็อตการแจกแจงแบบปกติหรือไม่?
คำตอบ:
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)
แทนmlab.normpdf(x, mu, sigma)
math
เมื่อคุณนำเข้าแล้วnumpy
และสามารถใช้ได้np.sqrt
?
math
สำหรับการดำเนินการสเกลาร์เนื่องจากตัวอย่างเช่นmath.sqrt
มีขนาดใหญ่กว่าเร็วกว่าnp.sqrt
เมื่อทำงานบนสเกลาร์
ฉันไม่คิดว่าจะมีฟังก์ชันที่ทำได้ทั้งหมดในการโทรครั้งเดียว scipy.stats
แต่คุณสามารถหาเกาส์ฟังก์ชั่นความหนาแน่นของความน่าจะเป็นใน
ดังนั้นวิธีที่ง่ายที่สุดที่ฉันสามารถทำได้คือ:
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()
แหล่งที่มา:
norm.pdf
เป็นnorm(0, 1).pdf
. ทำให้ง่ายต่อการปรับเปลี่ยนกรณีอื่น ๆ / เพื่อให้เข้าใจว่าสิ่งนี้สร้างวัตถุที่เป็นตัวแทนของตัวแปรสุ่ม
ใช้ seaborn แทนฉันใช้ distplot ของทะเลโดยมีค่าเฉลี่ย = 5 std = 3 จาก 1,000 ค่า
value = np.random.normal(loc=5,scale=3,size=1000)
sns.distplot(value)
คุณจะได้เส้นโค้งการแจกแจงปกติ
คำตอบ Unutbu ถูกต้อง แต่เนื่องจากค่าเฉลี่ยของเราอาจมากกว่าหรือน้อยกว่าศูนย์ฉันยังคงต้องการเปลี่ยนแปลงสิ่งนี้:
x = np.linspace(-3 * sigma, 3 * sigma, 100)
สำหรับสิ่งนี้ :
x = np.linspace(-3 * sigma + mean, 3 * sigma + mean, 100)
หากคุณต้องการใช้แนวทางทีละขั้นตอนคุณสามารถพิจารณาวิธีแก้ปัญหาดังต่อไปนี้
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()
ฉันเพิ่งกลับมาที่สิ่งนี้และฉันต้องติดตั้ง scipy เนื่องจาก matplotlib.mlab ให้ข้อความแสดงข้อผิดพลาดMatplotlibDeprecationWarning: scipy.stats.norm.pdf
เมื่อลองตัวอย่างด้านบน ดังนั้นตัวอย่างตอนนี้:
%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()
ฉันเชื่อว่าเป็นสิ่งสำคัญในการกำหนดความสูงดังนั้นจึงสร้างฟังก์ชันนี้:
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))
sigma
ค่าเบี่ยงเบนมาตรฐานอยู่ที่ไหนh
ความสูงmid
คือค่าเฉลี่ย
นี่คือผลลัพธ์ที่ใช้ความสูงและความเบี่ยงเบนที่แตกต่างกัน:
คุณสามารถรับ cdf ได้อย่างง่ายดาย pdf ดังนั้นผ่าน 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
เพื่อให้พล็อตปรากฏขึ้น