2017-01-30 1 views
3

Betrachten Sie das folgende Beispiel verwenden:die Glätte einer Spline-Finding scipy

import numpy as np 
import math 
import matplotlib.pyplot as plt 
from scipy import interpolate 
xs = np.linspace(1,10,500) 
ys = [0.92 * x ** 2.3 + 0.0132 * x ** 4 + 0.0743 * (x - 9) ** 3 - 4 * (x -3) ** 2 + 80 * math.sin(math.sin(x)) + 10 * math.sin(x*5) + 1.2* np.random.normal(-4,4,1) for x in xs] 
ys[200] = ys[200] + 130 
ys[201] = ys[201] + 135 
ys[202] = ys[202] + 129 
ys[203] = ys[203] + 128 
ys[204] = ys[204] + 131 
ys[205] = ys[205] + 130 
ys[206] = ys[206] + 129 
ys[207] = ys[207] + 129 
ys[208] = ys[208] + 128 
ys[209] = ys[209] + 130 

Wenn ich xs und ys an diesem Punkt plotten, erzeugt es ein schönes Diagramm: a oisy dataset for testing

Jetzt verwende ich scipy.interpolate.splrep um eine Spline-Kurve an diese Daten anzupassen. Ich habe zwei verschiedene Splines verwendet zwei verschiedene Segmente der Daten zu passen:

tck = interpolate.splrep(xs[0:199], ys[0:199], s = 1000) 
ynew2 = interpolate.splev(xs[0:199], tck, der = 0) 

und:

tck = interpolate.splrep(xs[210:500], ys[210:500], s = 9000) 
ynew3 = interpolate.splev(xs[210:500], tck, der = 0) 

Dann haben wir: Sample spline fit of the same data as above

Jetzt möchte ich die Qualität der programmatisch erkennen die Passform. Die Anpassung sollte weder zu geradlinig sein - d. H. Merkmale beibehalten, noch sollte sie die lautstarken Variationen als Merkmale "überdecken".

Ich plane, einen Spitzenzähler zu verwenden, der einem ANN zugeführt wird.

jedoch an dieser Stelle, meine Frage ist:

  • Hat scipy/numpy eine integrierte Funktion, wo ich in der Ausgabe von splrep ernähren kann, und es wird die Minima oder Maxima berechnen und die Dichte von Maxima/Minima in einem bestimmten Intervall?

Hinweis:
Ich bin mir der R**2 Wert, ich suche eine weitere Maßnahme zu erkennen Erhaltung der Funktionen zu finden.

Antwort

0

SciPy hat keine Methode, um die kritischen Punkte eines kubischen Splines zu finden. Am nächsten haben wir sproot, die die Wurzeln eines kubischen Splines finden. Damit dies hier nützlich ist, müssen wir Splines der Ordnung 4 anpassen, so dass die Ableitung ein kubischer Spline ist. Dies ist, was ich tun unten

from scipy.interpolate import splrep, splev, splder, sproot 

tck1 = splrep(xs[0:199], ys[0:199], k=4, s=1000) 
tck2 = splrep(xs[210:500], ys[210:500], k=4, s=9000) 
roots1 = sproot(splder(tck1), 1000)  # 1000 is an upper bound for the number of roots 
roots2 = sproot(splder(tck2), 1000) 

x1 = np.linspace(xs[0], xs[198], 1000)  # plot both splines 
plt.plot(x1, splev(x1, tck1)) 
x2 = np.linspace(xs[210], xs[499], 1000) 
plt.plot(x2, splev(x2, tck2))    

plt.plot(roots1, splev(roots1, tck1), 'ro')  # plot their max/min points 
plt.plot(roots2, splev(roots2, tck2), 'ro') 
plt.show() 

critical points

Der Unterschied liegt auf der Hand.

Sie auch die Anzahl der Wurzeln in einem bestimmten Intervall, wie finden Sie [3, 4]:

np.where((3 <= roots1) & (roots1 <= 4))[0].size # 29 

oder äquivalent np.sum((3 <= roots1) & (roots1 <= 4))

Verwandte Themen