Ich versuche, ein Exponentialgesetz in meine Daten einzufügen. Meine (x,y)
Probe ist ziemlich kompliziert zu erklären, so dass ich für das allgemeine Verständnis und die Reproduzierbarkeit sagen werde: Beide Variablen sind float
und continuous
, 0<=x<=100
und 0<=y<=1
.Falscher Graph mit scipy.optimize.curve_fit (ähnlich dem gleitenden Durchschnitt)
from scipy.optimize import curve_fit
import numpy
import matplotlib.pyplot as plt
#ydata=[...] is my list with y values, which contains 0 values
#xdata=[...] is my list with x values
transf_y=[]
for i in range(len(ydata)):
transf_y.append(ydata[i]+0.00001) #Adding something to avoid zero values
x=numpy.array(xdata,dtype=float)
y=numpy.array(transf_y,dtype=float)
def func(x, a, c, d):
return a * numpy.exp(-c*x)+d
popt, pcov = curve_fit(func, x, y,p0 = (1, 1e-6, 1))
print ("a = %s , c = %s, d = %s" % (popt[0], popt[1], popt[2]))
xx = numpy.linspace(300, 6000, 1000)
yy = func(xx, *popt)
plt.plot(x,y,label='Original Data')
plt.plot(xx, yy, label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
Jetzt sieht meine angepasste Kurve nicht wie eine angepasste Exponentialkurve aus. Es sieht vielmehr wie eine Kurve mit gleitendem Durchschnitt aus, als ob diese Kurve als Trendlinie in Excel hinzugefügt wurde. Was könnte das Problem sein? Wenn nötig werde ich einen Weg finden, die Datensätze verfügbar zu machen, um das Beispiel reproduzierbar zu machen.
Dies ist, was ich aus meinem Code zu bekommen (ich weiß nicht einmal, warum ich in der Legende drei Elemente bin immer während nur zwei aufgetragen sind, zumindest scheinbar):
Das einzige große Problem war, dass meine Daten nicht sortiert wurden. Ich dachte wirklich, dass das automatisch gemacht wurde. Ich habe mich wirklich geirrt. – FaCoffee
Ja. Und das vermasselt nur die Parzellen, die Anpassung ist in Ordnung. –