[PYTHON] Versuchen wir es noch einmal. Schätzung der meisten Wahrscheinlichkeiten und Anpassung des Modells (Wahrscheinlichkeitsverteilung) ② Kontinuierliche Wahrscheinlichkeitsverteilung

Einführung

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.

Kontinuierliche Wahrscheinlichkeitsverteilung: Normalverteilung

Die Wahrscheinlichkeitsfunktion, die die Normalverteilung darstellt, ist wie folgt. $ P (y) = \ frac {1} {\ sqrt {2πσ ^ 2}} e ^ {(- \ frac {(y_i- \ mu) ^ 2} {2 \ sigma ^ 2})} (\ mu , \ sigma = parameter) $

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

image.png 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.

Wenn das statistische Modell kompliziert wird

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

Ich möchte die Parameter schnell kennen ...

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 Sie auf die Daten an und versuchen Sie zu veranschaulichen

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)

image.png

Es fühlt sich gut an.

Recommended Posts

Versuchen wir es noch einmal. Schätzung der meisten Wahrscheinlichkeiten und Anpassung des Modells (Wahrscheinlichkeitsverteilung) ② Kontinuierliche Wahrscheinlichkeitsverteilung
Vor- und Nachteile der wahrscheinlichsten Schätzmethode
Minimum-Square-Methode und wahrscheinlichste Schätzmethode (Vergleich durch Modellanpassung)
Beispiel für Python-Code für die Exponentialverteilung und die wahrscheinlichste Schätzung (MLE)
Konzept des Bayes'schen Denkens (2) ... Bayes'sche Schätzung und Wahrscheinlichkeitsverteilung
Höchstwahrscheinlich Schätzungsimplementierung des Themenmodells in Python
Höchstwahrscheinlich Schätzung des Mittelwerts und der Varianz mit TensorFlow
Supereinführung des maschinellen Lernens Probabilistisches Modell und wahrscheinlichste Schätzung
Versuchen wir es noch einmal. Schätzung der meisten Wahrscheinlichkeiten und Anpassung des Modells (Wahrscheinlichkeitsverteilung) ② Kontinuierliche Wahrscheinlichkeitsverteilung
Vor- und Nachteile der wahrscheinlichsten Schätzmethode
Minimum-Square-Methode und wahrscheinlichste Schätzmethode (Vergleich durch Modellanpassung)
Beispiel für Python-Code für die Exponentialverteilung und die wahrscheinlichste Schätzung (MLE)
Konzept des Bayes'schen Denkens (2) ... Bayes'sche Schätzung und Wahrscheinlichkeitsverteilung
Höchstwahrscheinlich Schätzungsimplementierung des Themenmodells in Python
Höchstwahrscheinlich Schätzung des Mittelwerts und der Varianz mit TensorFlow
Supereinführung des maschinellen Lernens Probabilistisches Modell und wahrscheinlichste Schätzung
Höchstwahrscheinlich Schätzung verschiedener Verteilungen mit Pyro
Höchstwahrscheinlich Schätzung verschiedener Verteilungen mit Pyro