2017-10-01 1 views
0

Ich habe folgende Daten-Set:Erstellen eine glatte Linie basierend auf Punkte

x = [1, 6, 11, 21, 101] 
y = [5, 4, 3, 2, 1] 

und mein Ziel ist es, eine glatte Kurve zu erstellen, die wie folgt aussieht: enter image description here

Gibt es eine Möglichkeit, es zu tun in Python?

habe ich versucht, das Verfahren in here gezeigt verwendet wird, und hier ist der Code:

from scipy.interpolate import spline 

import matplotlib.pyplot as plt 
import numpy as np 

x = [1, 6, 11, 21, 101] 
y = [5, 4, 3, 2, 1] 

xnew = np.linspace(min(x), max(x), 100) 

y_smooth = spline(x, y, xnew) 

plt.plot(xnew, y_smooth) 
plt.show() 

aber die Ausgabe zeigt eine seltsame Linie. enter image description here

Antwort

1

Erstens, interpolate.spline()has been deprecated, so dass Sie wahrscheinlich nicht verwenden sollten. Verwenden Sie stattdessen interpolate.splrep() und interpolate.splev(). Es ist keine schwierige Umwandlung:

y_smooth = interpolate.spline(x, y, xnew) 

wird

tck = interpolate.splrep(x, y) 
y_smooth = interpolate.splev(xnew, tck) 

Aber das ist nicht wirklich das hier Thema. Standardmäßig versucht scipy, Ihren Daten ein Polynom von Grad 3 zuzuordnen, das nicht wirklich zu Ihren Daten passt. Aber da es so wenige Punkte gibt, kann es Ihre Daten ziemlich gut anpassen, obwohl es eine nicht-intuitive Annäherung ist. Sie kann setzen Sie den Grad des Polynoms, dass es versucht, mit einem k=... Argument zu splrep() zu passen. Das gleiche gilt aber auch für ein Polynom vom Grad 2; es wird versucht, eine Parabel anzubringen, und Ihre Daten könnten möglicherweise zu einer Parabel passen, in der sich ein Bogen in der Mitte befindet (was genau jetzt der Fall ist, da die Steigung am Anfang so steil ist und in der Mitte keine Datenpunkte vorhanden sind).

In Ihrem Fall werden Ihre Daten viel genauer als Exponential dargestellt, daher ist es am besten, eine Exponentialfunktion zu verwenden. Ich würde empfehlen, scipy.optimize.curve_fit() zu verwenden. Damit können Sie Ihre eigene Anpassungsfunktion angeben, welche Parameter enthält, und es werden die Parameter für Sie passen:

from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 
import numpy as np 

x = [1, 6, 11, 21, 101] 
y = [5, 4, 3, 2, 1] 

xnew = np.linspace(min(x), max(x), 100) 

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

popt, pcov = curve_fit(expfunc, x, y) 
plt.plot(xnew, expfunc(xnew, *popt)) 
plt.show() 

Fitted plot

Verwandte Themen