[PYTHON] Schritte zur Berechnung der Wahrscheinlichkeit einer Normalverteilung

Ich bin auf die "Wahrscheinlichkeit" der Elementarstatistik gestoßen. Beobachten wir, wie sich die (gleichzeitige) Wahrscheinlichkeit der Normalverteilung beim Verschieben des Befehls ändert.

Normalverteilung

Wie Sie jedes Mal kennen, wird die Normalverteilung wie folgt ausgedrückt. Der Klarheit halber wird die linke Seite als $ P (x) $ ausgedrückt.

P(x)={1 \over \sqrt{2\pi\sigma^{2}}} \exp \left(-{1 \over 2}{(x-\mu)^2 \over \sigma^2} \right)
Library
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy.random as rd
import matplotlib.gridspec as gridspec
%matplotlib inline
plt.rcParams['font.size']=15

def plt_legend_out():
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
code
m = 10
s = 3

min_x = m-4*s
max_x = m+4*s

x = np.linspace(min_x, max_x, 201)
y = (1/np.sqrt(2*np.pi*s**2))*np.exp(-0.5*(x-m)**2/s**2)

plt.xlim(min_x, max_x)
plt.ylim(0,max(y)*1.1)
plt.plot(x,y)
plt.show()

image.png

Extrahieren wir zufällig 10 Daten aus der Normalverteilung.

image.png

code
plt.figure(figsize=(8,1))
rd.seed(7)
data = rd.normal(10, 3, 10, )
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.tick_params(left=False,labelleft=False)
plt.axhline(y=0,color='gray',lw=0.5)
plt.show()

Gleichzeitige Wahrscheinlichkeit

Die Wahrscheinlichkeit, dass die obigen Daten gleichzeitig auftreten, ist wie folgt.

\begin{eqnarray}
\prod_{i=1}^NP(x) &=& P(x_1, x_2,\cdots,x_{10})\\
&=& P(x_1)P(x_2)\cdots P(x_{10})
\end{eqnarray}

Mit dem obigen Ausdruck gibt es jedoch Probleme bei der Berechnung. Das Produkt der Wahrscheinlichkeiten wird ein ziemlich kleiner Wert sein. Bei der Berechnung nach dem Dezimalpunkt steigt Null wie 0,01 x 0,01 = 0,001. Wenn dies 10 oder 100 Mal fortgesetzt wird, gibt es viele Nullen, was verwirrend ist. Nehmen wir also $ log $.

\begin{eqnarray}
\prod_{i=1}^{10}\log{P(x_i)} &=& \log{P(x_1,x_2,\cdots,x_{10})}\\
&=& \log{(P(x_1)×P(x_2)\cdots×P(x_{10}))}\\
&=& \log{P(x_1)}+\log{P(x_2)}+\cdots+\log{P(x_{10})}\\
&=& \color{red}{\sum_{i=1}^{10}\log{P(x_i)}}
\end{eqnarray}

Indem ich $ log $ nahm, konnte ich es durch das Problem der Hinzufügung ersetzen. $ P (x) $ ist in diesem Fall eine Normalverteilung. Daher ist die gleichzeitige Wahrscheinlichkeit der obigen Daten wie folgt.

\begin{eqnarray}
\color{red}{\sum_{i=1}^{10}\log{P(x_i)}} &=& \sum_{i=1}^N{1 \over \sqrt{2\pi\sigma^{2}}} \exp \left(-{1 \over 2}{(x_i-\mu)^2 \over \sigma^2} \right)
\end{eqnarray}

Implementierung

Lassen Sie uns nun $ \ sigma = 3 $ korrigieren und eine Normalverteilung von $ \ mu = 5, 10, 15 $ betrachten. Zeichnen wir auch die zuvor extrahierten Daten. Optisch scheinen die Bedingungen von $ \ mu = 10 $ und $ \ sigma = 3 $ gut zu passen.

image.png

-Funktion
def norm_dens(x,m,s):
    return (1/np.sqrt(2*np.pi*s**2))*np.exp(-0.5*(x-m)**2/s**2)

def log_likelihood(x,m,s):
    L = np.prod([norm_dens(x_i,m,s) for x_i in x])
    l = np.log(L)
    return l
code
logp_ymin = -10 ;logp_ymax = 0
d_ymin = -0.01 ; d_ymax = 0.2

plt.figure(figsize=(10,2))
plt.subplots_adjust(hspace=0.1, wspace=0.1)

x = np.linspace(0, 20, 100)

###########

plt.subplot(131)
m=5 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.ylabel('density')
plt.axhline(y=0,color='gray',lw=0.5)
plt.ylim(d_ymin,d_ymax)
plt.xlim(0,20)
plt.tick_params(bottom=False,labelbottom=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

###########

plt.subplot(132)
m=10 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

###########

plt.subplot(133)
m=15 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

plt.show()

Zeichnen wir nun auch $ \ log {P (x)} $. Unter den Bedingungen von $ \ mu = 10 $ und $ \ sigma = 3 $ war $ \ sum {\ log {P (x)}} $ am größten.

image.png

code
logp_ymin = -10 ;logp_ymax = 0
d_ymin = -0.01 ; d_ymax = 0.2

plt.figure(figsize=(10,2))
plt.subplots_adjust(hspace=0.1, wspace=0.1)

x = np.linspace(0, 20, 100)

###########

plt.subplot(131)
m=5 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.ylabel('density')
plt.axhline(y=0,color='gray',lw=0.5)
plt.ylim(d_ymin,d_ymax)
plt.xlim(0,20)
plt.tick_params(bottom=False,labelbottom=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

###########

plt.subplot(132)
m=10 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

###########

plt.subplot(133)
m=15 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

plt.show()

Als nächstes korrigieren wir $ \ mu = 10 $ und sehen die Normalverteilung von $ \ sigma = 2,3,5 $. Obwohl der große Unterschied nicht erkennbar ist, ist $ \ sum {\ log {P (x)}} $ unter den Bedingungen von $ \ mu = 10 $ und $ \ sigma = 3 $ am größten. Die Verteilung von $ \ sigma = 5 $ scheint angesichts der Daten zu breit zu sein. Mit anderen Worten ist ersichtlich, dass die Daten und die Verteilung gut unter der Bedingung passen, dass $ \ sum {\ log {P (x)}} $ groß ist (gleichzeitige Wahrscheinlichkeit ist groß).

image.png

code
logp_ymin = -6 ;logp_ymax = 0
d_ymin = -0.01 ; d_ymax = 0.25

plt.figure(figsize=(10,4))
plt.subplots_adjust(hspace=0.1, wspace=0.1)

x = np.linspace(0, 20, 100)

###########

plt.subplot(231)
m=10 ; s=2
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.ylabel('density')
plt.axhline(y=0,color='gray',lw=0.5)
plt.ylim(d_ymin,d_ymax)
plt.xlim(0,20)
plt.tick_params(bottom=False,labelbottom=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

plt.subplot(234)
xl = [np.log(norm_dens(x,m,s)) for x in data]
plt.scatter(data,xl,color='red')
plt.xlim(0,20)
plt.ylabel('log p(x)')
plt.ylim(logp_ymin,logp_ymax)
plt.xlabel('x')
for i in range(len(data)):plt.plot([data[i],data[i]],[0,xl[i]],color='gray',lw=0.5,ls='dashed')
plt.text(3,-10,'$\sum{\log{p(x)}}$='+str(np.round(np.sum(xl),1)))

###########

plt.subplot(232)
m=10 ; s=3
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

plt.subplot(235)
xl = [np.log(norm_dens(x,m,s)) for x in data]
plt.scatter(data,xl,color='red')
plt.xlim(0,20)
plt.ylim(logp_ymin,logp_ymax)
plt.tick_params(left=False,labelleft=False)
plt.xlabel('x')
for i in range(len(data)):plt.plot([data[i],data[i]],[0,xl[i]],color='gray',lw=0.5,ls='dashed')
plt.text(3,-10,'$\sum{\log{p(x)}}$='+str(np.round(np.sum(xl),1)))

###########

plt.subplot(233)
m=10 ; s=5
y = norm_dens(x,m,s)
plt.plot(x,y,label='$\mu=$'+str(m)+'$, \sigma=$'+str(s))
plt.scatter(data, np.zeros_like(data), c="r", s=50)
plt.axhline(y=0,color='gray',lw=0.5)
plt.xlim(0,20)
plt.ylim(d_ymin,d_ymax)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.title('$\mu=$'+str(m)+', $\sigma=$'+str(s))

plt.subplot(236)
xl = [np.log(norm_dens(x,m,s)) for x in data]
plt.scatter(data,xl,color='red')
plt.xlim(0,20)
plt.ylim(logp_ymin,logp_ymax)
for i in range(len(data)):plt.plot([data[i],data[i]],[0,xl[i]],color='gray',lw=0.5,ls='dashed')
plt.tick_params(left=False,labelleft=False)
plt.xlabel('x')
plt.text(3,-10,'$\sum{\log{p(x)}}$='+str(np.round(np.sum(xl),1)))
plt.show()

Lassen Sie uns abschließend $ \ mu $ und $ \ sigma $ im Detail untersuchen. Suchen ist nur eine umfassende Suche. Infolgedessen konnten wir einen Wert schätzen, der nahe am wahren Wert liegt.

image.png

code
mus = np.linspace(8, 12, 50)
ss  = np.linspace(2, 4, 50)
lmu = [] ; ls = [] ; lll = []

for mu in mus:
    for s in ss:
        lmu.append(mu)
        ls.append(s)
        lll.append(log_likelihood(data,mu,s))

plt.scatter(lmu,ls,c=lll,alpha=0.8)
plt.xlabel('$\mu$')
plt.ylabel('$\sigma$')
plt.colorbar()
plt.scatter(10,3,color='r')
plt.text(10.1,3.1,'true',color='r')

pmu,ps,pll = pd.DataFrame([lmu,ls,lll]).T.sort_values(2,ascending=False).reset_index(drop=True).loc[0,:].to_numpy()
plt.scatter(pmu,ps,color='b')
plt.text(pmu+0.1,ps+0.1,'predicted',color='b')

plt.title('Gleichzeitige Wahrscheinlichkeit')
plt.show()

Von der gleichzeitigen Wahrscheinlichkeit zur Wahrscheinlichkeit

Dieses Mal wusste ich, dass "Daten aus einer Normalverteilung stammen". In der Praxis würden Sie jedoch die Wahrscheinlichkeitsverteilung hinter den Daten annehmen. In diesem Fall werden die Parameter der Verteilung geschätzt, indem der Ausdruck "Wahrscheinlichkeit" durch "gleichzeitige Wahrscheinlichkeit" ersetzt wird. Was Sie tun, ist das gleiche.

Referenz-URL

Recommended Posts

Schritte zur Berechnung der Wahrscheinlichkeit einer Normalverteilung
So berechnen Sie die Volatilität einer Marke
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Besiege die Wahrscheinlichkeitsdichtefunktion der Normalverteilung
Berechnen Sie die Wahrscheinlichkeit von Ausreißern auf den Box-Whiskern
Überprüfung der Normalverteilung
[Numpy, scipy] Wie berechnet man die Quadratwurzel einer Elmeet-Matrix mit halbregelmäßigem Wert?
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Berechnen Sie die Anzahl der Änderungen
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
Berechnen des aus ABC134-D gelernten Rechenaufwands
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren
Gibt es ein Geheimnis in der Häufigkeit der Umfangszahlen?
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
So ermitteln Sie die durchschnittliche Informationsmenge (Entropie) der ursprünglichen Wahrscheinlichkeitsverteilung aus der Stichprobe
Darstellung der Verteilung der Bakterienzusammensetzung aus Qiime2-Analysedaten in einem Box-Whisker-Diagramm
Generieren Sie mit SciPy eine Normalverteilung
Schritte zum Erstellen eines Django-Projekts
Bedingte Verzweigung aufgrund des Vorhandenseins einer Shell-Skriptdatei
So überprüfen Sie die Speichergröße einer Variablen in Python
Testen Sie die Eignung der Verteilung
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Ich möchte ein Histogramm erstellen und die Normalverteilungskurve darauf überlagern. matplotlib edition
Schreiben Sie ein Skript, um die Entfernung mit dem Elasticsearch 5-System schmerzfrei zu berechnen
Ein Befehl zum einfachen Überprüfen der Netzwerkgeschwindigkeit auf der Konsole
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Leiten Sie den Quadrantenbereich der Standardnormalverteilung von Anfang an sorgfältig ab
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Ergänzung zur Erklärung von vscode
Die Geschichte des Exportierens eines Programms
[NNabla] So entfernen Sie die mittlere Ebene eines vorgefertigten Netzwerks
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Versuchen Sie, die Parameter der Gammaverteilung zu schätzen, während Sie einfach MCMC implementieren
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Erzeugt halbautomatisch eine Beschreibung des Pakets, das in PyPI registriert werden soll
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
Berechnen Sie die Wahrscheinlichkeit, eine Tintenfischmünze zu sein, mit dem Bayes-Theorem [Python]
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen