Bazı tek boyutlu verilerim var ve bir spline ile sığdırıyorum. Daha sonra, bükülme noktalarını (eyer noktalarını göz ardı ederek) bulmak istiyorum. Şimdi splev'in oluşturduğu değerlerin çoğunda scipy.signal.argrelmin (ve argrelmax) kullanarak ilk türevinin extremalarını araştırıyorum.Spline takılı 1d verisinde dönme noktaları bulma
import scipy.interpolate
import scipy.optimize
import scipy.signal
import numpy as np
import matplotlib.pyplot as plt
import operator
y = [-1, 5, 6, 4, 2, 5, 8, 5, 1]
x = np.arange(0, len(y))
tck = scipy.interpolate.splrep(x, y, s=0)
print 'roots', scipy.interpolate.sproot(tck)
# output:
# [0.11381478]
xnew = np.arange(0, len(y), 0.01)
ynew = scipy.interpolate.splev(xnew, tck, der=0)
ynew_deriv = scipy.interpolate.splev(xnew, tck, der=1)
min_idxs = scipy.signal.argrelmin(ynew_deriv)
max_idxs = scipy.signal.argrelmax(ynew_deriv)
mins = zip(xnew[min_idxs].tolist(), ynew_deriv[min_idxs].tolist())
maxs = zip(xnew[max_idxs].tolist(), ynew_deriv[max_idxs].tolist())
inflection_points = sorted(mins + maxs, key=operator.itemgetter(0))
print 'inflection_points', inflection_points
# output:
# [(3.13, -2.9822449358974357),
# (5.03, 4.3817785256410255)
# (7.13, -4.867132628205128)]
plt.legend(['data','Cubic Spline', '1st deriv'])
plt.plot(x, y, 'o',
xnew, ynew, '-',
xnew, ynew_deriv, '-')
plt.show()
Fakat bu çok yanlış bir şey hissettiriyor. Sanırım o kadar çok değer üretmeden aradığımı bulmak için bir olasılık var. Sproot gibi bir şey ama belki ikinci türeve uygulanabilir mi?
Olumlu İşte
bunu yapmak için koddur. ;-) –