Wie interpretiere ich die Kovarianzmatrix aus einer Kurvenanpassung?


15

Ich bin nicht so gut in Statistik, also entschuldige mich, wenn dies eine vereinfachende Frage ist. Ich passe eine Kurve an einige Daten an, und manchmal passen meine Daten am besten zu einem negativen Exponential in der Form ae(bx)+c , und manchmal ist die Anpassung näher an . Manchmal scheitern jedoch beide und ich würde gerne auf eine lineare Anpassung zurückgreifen. Meine Frage ist, wie kann ich aus der resultierenden Varianz-Kovarianz-Matrix, die von der Funktion scipy.optimize.curve_fit () zurückgegeben wird, bestimmen, welches Modell am besten zu einem bestimmten Datensatz passt ? Ich glaube, die Varianz liegt auf einer der Diagonalen dieser Matrix, aber ich bin nicht sicher, wie ich das interpretieren soll.ae(bx2)+c

UPDATE: Ausgehend von einer ähnlichen Frage hoffe ich, dass die Varianz-Kovarianz-Matrix mir sagen kann, welches der drei Modelle, die ich versuche, am besten zu den Daten passt (ich versuche, viele Datensätze an eines dieser drei Modelle anzupassen).

Die resultierenden Matrizen sehen für das gegebene Beispiel so aus:

pcov_lin 
[[  2.02186921e-05  -2.02186920e-04]
 [ -2.02186920e-04   2.76322124e-03]]
pcov_exp
[[  9.05390292e+00  -7.76201283e-02  -9.20475334e+00]
 [ -7.76201283e-02   6.69727245e-04   7.90218415e-02]
 [ -9.20475334e+00   7.90218415e-02   9.36160310e+00]]
pcov_exp_2 
[[  1.38338049e-03  -7.39204594e-07  -7.81208814e-04]
 [ -7.39204594e-07   8.99295434e-09   1.92970700e-06]
 [ -7.81208814e-04   1.92970700e-06   9.14746758e-04]]

Hier ist ein Beispiel dafür, was ich mache:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize

def exp_func(x, a, b, c):
    return a * np.exp(-b * x) + c

def exp_squared_func(x, a, b, c):
    return a * np.exp(-b * x*x*x) + c

def linear_func(x, a, b):
    return a*x + b

def main():
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], np.float)
    y = np.array([1, 1, 1, 1, 0.805621, 0.798992, 0.84231, 0.728796, 0.819471, 0.570414, 0.355124, 0.276447, 0.159058, 0.0762189, 0.0167807, 0.0118647, 0.000319948, 0.00118267, 0, 0, 0], np.float)

    p0 = [0.7746042467213462, 0.10347274384077858, -0.016253458007293588]
    popt_lin, pcov_lin      = scipy.optimize.curve_fit(linear_func, x, y)
    popt_exp, pcov_exp      = scipy.optimize.curve_fit(exp_func, x, y)
    popt_exp_2, pcov_exp_2  = scipy.optimize.curve_fit(exp_squared_func, x, y)

    plt.figure()
    plt.plot(x, y, 'ko', label="Original data")
    plt.plot(x, linear_func(x, *popt_lin), 'r-', label='linear')
    plt.plot(x, exp_func(x, *popt_exp), 'b-', label='exponential')
    plt.plot(x, exp_squared_func(x, *popt_exp_2), 'g-', label='exponential squared')
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

Es ist großartig, dass Sie auf diese CV-Frage und folglich auf den wichtigen Kommentarthread (s / w rolando2, Frank Harrell, ...) verlinken und sich fragen, ob es angemessen ist, das Modell post facto anhand der Passform auszuwählen. Vielleicht ist es besser, Vorkenntnisse des Systems zu verwenden, um das Modell auszuwählen.
Aman

Diese andere Frage im Lebenslauf könnte hilfreich sein: stats.stackexchange.com/questions/50830/…
Aman

Könnte dies hilfreich sein, um zu verstehen, wie die Co-Varianz-Matrix interpretiert wird ? Stats.stackexchange.com/questions/10795/… - Ich würde sagen, dass der Wert der dritten Modelle kleiner ist, was auf eine geringere Abweichung hinweist.
user4581

Antworten:


4

Zur Verdeutlichung ist die Variable pcovvon scipy.optimize.curve_fitdie geschätzte Kovarianz der Parameterschätzung, d. H., In Anbetracht der Daten und eines Modells, wie viele Informationen in den Daten vorhanden sind, um den Wert eines Parameters in dem gegebenen Modell zu bestimmen. Es sagt Ihnen also nicht wirklich, ob das ausgewählte Modell gut ist oder nicht. Siehe auch das .

Das Problem, was ein gutes Modell ist, ist in der Tat ein schweres Problem. Wie von Statistikern argumentiert

Alle Modelle sind falsch, aber einige sind nützlich

Die Kriterien für den Vergleich verschiedener Modelle hängen also davon ab, was Sie erreichen möchten.

Wenn Sie beispielsweise eine Kurve wünschen, die den Daten möglichst nahe kommt, können Sie ein Modell auswählen, das das kleinste Residuum ergibt . In Ihrem Fall haben das Modell funcund die geschätzten Parameter poptbeim Berechnen den niedrigsten Wert

numpy.linalg.norm(y-func(x, *popt))

Wenn Sie jedoch ein Modell mit mehr Parametern auswählen, wird das Residuum auf Kosten einer höheren Modellkomplexität automatisch verringert . Dann kommt es wieder darauf an, was das Ziel des Modells ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.