Vorheriger Inhalt: Höchstwahrscheinlich Schätzung der diskreten Wahrscheinlichkeitsverteilung und Modellanpassung Dieses Mal werden wir die wahrscheinlichste Schätzung der kontinuierlichen Wahrscheinlichkeitsverteilung und des Modells (Wahrscheinlichkeitsverteilung) anwenden.
Die Wahrscheinlichkeitsfunktion, die die Normalverteilung darstellt, ist wie folgt.
Die Testdaten zum Schätzen und Anpassen des Modells werden im Voraus aus der Zielwahrscheinlichkeitsverteilung erstellt, damit die Antworten abgeglichen werden können.
Python
"""Zufallszahlen aus der Normalverteilung"""
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(seed=10)
norm_values = np.random.normal(0, 1, size=1000) #Durchschnitt 0,Extrahieren Sie 1000 Stück aus einer Normalverteilung mit einer Standardabweichung von 1
#Zeichnung
plt.hist(norm_values, bins=50, range=[-5, 5], normed=True)
bin_edges
Da es sich um eine stetige Variable handelt, kann sie nicht als diskreter Typ gezählt werden. Daher wird es gezählt, indem es in 0,2 geteilt wird.
Wenden wir nun eine Normalverteilung auf solche Daten an und schätzen ihre Parameter höchstwahrscheinlich.
Python
"""Parameterschätzung durch partielle Differenzierung der logarithmischen Wahrscheinlichkeitsfunktion"""
import sympy
#Variablen definieren (v=σ**2)
sympy.var('μ v y')
#Haftung p(Parameter|x)Definieren
fe=(1/sympy.sqrt(2*sympy.pi*v))*sympy.exp(-(y-μ)**2/(2*v))
#Logistik
logf=sympy.log(fe)
#Differenziere f teilweise und erweitere die Gleichung
pdff1 = sympy.expand(sympy.diff(logf, μ)) #Partielle Differenzierung für μ
pdff2 = sympy.expand(sympy.diff(logf, v)) #Partielle Differenzierung für v
Die Formel pdff1, die die logarithmische Wahrscheinlichkeit in Bezug auf μ teilweise differenziert, ist $ \ frac {y} {v} - \ frac {\ mu} {v} $, und die Formel pdff2, die in Bezug auf v teilweise differenziert ist, ist $ \ frac {-1} {2v. } + \ frac {y ^ 2} {2v ^ 2} - \ frac {y \ mu} {v ^ 2} + \ frac {\ mu ^ 2} {2v ^ 2} $ Das stimmt. $ \ sum pdff1 = \ sum pdff2 = 0 $ μ, v kann gefunden werden.
Python
def L_sympy(fmu,fs,var,values):
likelihood_mu = 0 #Anfangswert der Wahrscheinlichkeit
likelihood_s = 0 #Anfangswert der Wahrscheinlichkeit
for i in np.arange(len(values)):
# likelihood
likelihood_mu += fmu.subs(var,values[i]) #Weisen Sie x einen Wert zu
likelihood_s += fs.subs(var,values[i]) #Weisen Sie x einen Wert zu
param = sympy.solve([likelihood_mu,likelihood_s]) #Löse die Gleichung
return param
parameters = L_sympy(pdff1,pdff2,"y",norm_values)
parameters[0]["σ"]=sympy.sqrt(parameters[0][v])
parameters
[{v: 0.879764754284410, μ: -0.0145566356154705, 'σ': 0.937957757196138}]
Dies entspricht fast der Einstellung von Durchschnitt μ = 0 und σ = 1.
Einzelheiten finden Sie im vorherigen Abschnitt (. Verwenden Sie die Methode zum Lösen einer nichtlinearen Gleichung.
Python
"""Wahrscheinlichkeitsdichtefunktion"""
def probability_function(x,param):
from scipy.special import factorial
# param[0]s,param[1]mu:Parameter
# y:Daten y
# return:Wahrscheinlichkeitsdichte P der Daten y(y|Parameter)
return (1/np.sqrt(2*np.pi*param[1]**2))*np.exp(-0.5*(y-param[0])**2/param[1]**2)
"""Log Likelihood Funktion (kontinuierlich)"""
def L_func_c(param,y):
likelihood = 0 #Anfangswert der Wahrscheinlichkeit
for i in np.arange(len(y)):
# model output
p = probability_function(y[i], param)
#Wahrscheinlichkeit Wahrscheinlichkeit
likelihood += -np.log(p) #Haftung
return likelihood
"""Parameter Schätzung"""
"""
Semi-Newton-Methode (BFGS, L)-BFGS-Methode: In komplizierten Fällen kann Speicherplatz gespart werden.
"""
from scipy import optimize
x0 = [0,0.1] #Anfangswerte der Parameter
bound = [(-100, 100),(0, None)]#,(0,None)] #Umfang der optimalen Parametersuche(min,max)
params_MLE = optimize.minimize(L_func_c,x0,args=(norm_values),method='l-bfgs-b',
jac=None, bounds=bound, tol=None, callback=None,
options={'disp': None, 'maxls': 20, 'iprint': -1,
'gtol': 1e-05, 'eps': 1e-08, 'maxiter': 15000,
'ftol': 2.220446049250313e-09, 'maxcor': 10,
'maxfun': 15000})
#Höchstwahrscheinlich Schätzparameter
print('Parameter μ,σ:',params_MLE.x)
#Anzahl der Parameter
k=3
#AIC (das Modell mit dem kleinsten Wert passt gut)
print('AIC:',params_MLE.fun*(2)+2*k)
Parameter μ,σ: [-0.01455655 0.93795781]
AIC: 2715.7763344850605
Einzelheiten finden Sie im vorherigen ① . Verwenden Sie die Methode zum Lösen einer nichtlinearen Gleichung.
Python
"""scipy.stats.Es gibt auch eine Parameterschätzung mit Anpassung"""
from scipy.stats import norm
fit_parameter = norm.fit(norm_values)
fit_parameter
#Parameter μ,σ
(-0.014556635615470447, 0.9379577571961389)
Wenden wir das Modell (Normalverteilung) auf die Daten mit den geschätzten Parametern μ = -0,01455655, σ = 0,93795781 an.
Python
acc_mle = probability_function(np.sort(norm_values), params_MLE.x)
plt.hist(norm_values, bins=50, range=[-5, 5], normed=True)
plt.plot(np.sort(norm_values), acc_mle)
Es fühlt sich gut an.
Recommended Posts