การปรับขนาดการแจกแจงแบบปกติใน Python

Sep 17 2020

ฉันต้องการพล็อตฮิสโตแกรมสำหรับการแจกแจงแบบปกติและพล็อตการแจกแจงปกติที่เกี่ยวข้องทับด้วย มีหลายตัวอย่างมีออนไลน์เกี่ยวกับการแจกแจงปกติที่มีแกน Y density=Trueปกติด้วย ในตัวอย่างของฉันฉันกำลังพยายามสร้างเส้นโค้งการแจกแจงแบบปกติโดยไม่ใช้การทำให้เป็นมาตรฐานของประเภทความหนาแน่น บางทีนี่อาจเป็นคำถามทางคณิตศาสตร์โดยปริยาย แต่ฉันไม่สามารถหาวิธี "ยกเลิกการทำให้เป็นมาตรฐาน" เส้นโค้งการแจกแจงได้ ต่อไปนี้คือรหัสของฉัน:

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

mu = 1e-3
std = 1.0e-4
nsize = 10000
ymax = 5000

# Generate some data for this demonstration.
data = norm.rvs(mu, std, size=nsize)

# Plot the histogram.
plt.hist(data, bins=20, color='b', edgecolor='black')

# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)                      # something to do with this line
plt.plot(x, p, 'k', linewidth=2)
plt.axvline(mu, linestyle='dashed', color='black')
plt.ylim([0, ymax])

สิ่งนี้ก่อให้เกิดพล็อตต่อไปนี้

ดังจะเห็นได้ว่าพื้นที่ภายใต้ฮิสโตแกรมจะมีค่าเท่ากับ 10,000 ( nsize) ซึ่งเป็นจำนวนจุดข้อมูล อย่างไรก็ตามมันไม่เป็นเช่นนั้นกับ "เส้นโค้งการกระจาย" จะทำให้เส้นโค้งตรงกับฮิสโตแกรมได้อย่างไร?

คำตอบ

4 QuangHoang Sep 17 2020 at 10:15

ดูเหมือนว่าpltผลตอบแทนที่รวมการhist nsizeดังนั้นเราสามารถปรับขนาดp:

# Plot the histogram.
hist, bins, _ = plt.hist(data, bins=20, color='b', edgecolor='black')

# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()

# changes here
p = norm.pdf(bins, mu, std)           
plt.plot(bins, p/p.sum() * nsize , 'r', linewidth=2)

เอาท์พุต: