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 , 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.
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()
quelle
Antworten:
Zur Verdeutlichung ist die Variable
pcov
vonscipy.optimize.curve_fit
die 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
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
func
und die geschätzten Parameterpopt
beim Berechnen den niedrigsten WertWenn 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.
quelle