Ich bin auf die "Wahrscheinlichkeit" der Elementarstatistik gestoßen. Beobachten wir, wie sich die (gleichzeitige) Wahrscheinlichkeit der Normalverteilung beim Verschieben des Befehls ändert.
Wie Sie jedes Mal kennen, wird die Normalverteilung wie folgt ausgedrückt. Der Klarheit halber wird die linke Seite als $ P (x) $ ausgedrückt.
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)
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()
Extrahieren wir zufällig 10 Daten aus der Normalverteilung.
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()
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}
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.
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
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.
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ß).
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.
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()
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