Ich untersuche, wie man einen Datensatz unter Verwendung von Normalverteilungen modelliert, wobei sowohl Mittelwert als auch Varianz als lineare Funktionen unabhängiger Variablen definiert sind.
So etwas wie N ~ (f (x), g (x)).
Ich generiere eine Zufallsstichprobe wie diese:
def draw(x):
return norm(5 * x + 2, 3 *x + 4).rvs(1)[0]
Ich möchte also 5, 2 und 4 als Parameter für meine Verteilung abrufen.
Ich generiere meine Probe:
smp = np.zeros ((100,2))
for i in range(0, len(smp)):
smp[i][0] = i
smp[i][1] = draw(i)
Die Wahrscheinlichkeitsfunktion ist:
def lh(p):
p_loc_b0 = p[0]
p_loc_b1 = p[1]
p_scl_b0 = p[2]
p_scl_b1 = p[3]
l = 1
for i in range(0, len(smp)):
x = smp[i][0]
y = smp[i][1]
l = l * norm(p_loc_b0 + p_loc_b1 * x, p_scl_b0 + p_scl_b1 * x).pdf(y)
return -l
Die Parameter für die im Modell verwendeten linearen Funktionen sind also im p 4 -variablen Vektor angegeben.
Mit scipy.optimize kann ich die MLE-Parameter mit einem extrem niedrigen xtol lösen und die Lösung bereits als Ausgangspunkt angeben:
fmin(lh, x0=[2,5,3,4], xtol=1e-35)
Was nicht gut funktioniert:
Warning: Maximum number of function evaluations has been exceeded.
array([ 3.27491346, 4.69237042, 5.70317719, 3.30395462])
Das Erhöhen des xtol auf höhere Werte bringt nichts.
Also versuche ich, eine Startlösung zu verwenden, die weit von der tatsächlichen Lösung entfernt ist:
>>> fmin(lh, x0=[1,1,1,1], xtol=1e-8)
Optimization terminated successfully.
Current function value: -0.000000
Iterations: 24
Function evaluations: 143
array([ 1., 1., 1., 1.])
Was mich zum Nachdenken bringt:
PDF-Dateien sind größtenteils um den Mittelwert gruppiert und weisen nur wenige Standardabweichungen vom Mittelwert auf, die für numerische Methoden nicht zu gut sein dürfen.
Wie führt man diese Art der numerischen Schätzung in Funktionen durch, bei denen der Gradient sehr nahe bei Null von der Lösung entfernt ist?