Skalieren einer Normalverteilung in Python

Sep 17 2020

Ich möchte ein Histogramm für eine Normalverteilung zeichnen und auch die entsprechende Normalverteilung darüber zeichnen. Es sind online mehrere Beispiele für Normalverteilungen mit mit normalisierter y-Achse verfügbar density=True. In meinem Beispiel versuche ich, die Normalverteilungskurve ohne die Normalisierung des Dichtetyps zu bilden. Vielleicht könnte dies implizit eine mathematische Frage sein, aber ich konnte nicht herausfinden, wie man die Verteilungskurve "nicht normalisiert". Folgendes ist mein Code:

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])

Dies erzeugt das folgende Diagramm.

Wie zu sehen ist, entspricht der Bereich unter dem Histogramm 10000 ( nsize), was der Anzahl der Datenpunkte entspricht. Bei der "Verteilungskurve" ist dies jedoch nicht der Fall. Wie erhalte ich die Kurvenübereinstimmung mit dem Histogramm?

Antworten

4 QuangHoang Sep 17 2020 at 10:15

Es sieht aus wie pltRenditen hist, die sich auf summieren nsize. Wir können also einfach skalieren 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)

Ausgabe: