Есть несколько вопросов.
Первый номер - это порядок значений x. Из документации scipy.interpolate.UnivariateSpline
мы находим
x : (N,) array_like
1-D array of independent input data. MUST BE INCREASING.
стресса добавляемого мной. Для данных, которые вы указали, x находится в обратном порядке. Чтобы отладить это, полезно использовать «нормальный» сплайн, чтобы убедиться, что все имеет смысл.
Вторая проблема, а также еще одна актуальная для вашей проблемы, относится к параметру s. Что оно делает? Опять же из документации мы находим
s : float or None, optional
Positive smoothing factor used to choose the number of knots. Number
of knots will be increased until the smoothing condition is satisfied:
sum((w[i]*(y[i]-s(x[i])))**2,axis=0) <= s
If None (default), s=len(w) which should be a good value if 1/w[i] is
an estimate of the standard deviation of y[i]. If 0, spline will
interpolate through all data points.
Так s определяет, насколько близко интерполированное кривая должна прийти к точкам данных, в смысле метода наименьших квадратов. Если мы установим значение очень большое, то сплайн не должен приближаться к точкам данных.
В качестве законченного примера рассмотрим следующую
import scipy.interpolate as inter
import numpy as np
import pylab as plt
x = np.array([13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
y = np.array([2.404070, 1.588134, 1.760112, 1.771360, 1.860087,
1.955789, 1.910408, 1.655911, 1.778952, 2.624719,
1.698099, 3.022607, 3.303135])
xx = np.arange(1,13.01,0.1)
s1 = inter.InterpolatedUnivariateSpline (x, y)
s1rev = inter.InterpolatedUnivariateSpline (x[::-1], y[::-1])
# Use a smallish value for s
s2 = inter.UnivariateSpline (x[::-1], y[::-1], s=0.1)
s2crazy = inter.UnivariateSpline (x[::-1], y[::-1], s=5e8)
plt.plot (x, y, 'bo', label='Data')
plt.plot (xx, s1(xx), 'k-', label='Spline, wrong order')
plt.plot (xx, s1rev(xx), 'k--', label='Spline, correct order')
plt.plot (xx, s2(xx), 'r-', label='Spline, fit')
# Uncomment to get the poor fit.
#plt.plot (xx, s2crazy(xx), 'r--', label='Spline, fit, s=5e8')
plt.minorticks_on()
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()
У вас есть априорное знание о данных, которые вы работаете? Может быть теоретическое представление? Или вы можете получить больше данных? 50 или 100 баллов? – twil
@twil: Нет. Данные взяты из эксперимента с участием человеческих решений. Это все, что я знаю. Я пытаюсь подогнать кривую с целью экстраполяции на дальнейшие значения х. Я пробовал кубический сплайн и полифит, но они тоже не хороши. Я что-то не так с выбором функции сглаживания выше в UnivariateSpline? –
У вас все в порядке, но у вас мало данных. Я бы сказал, что значения в 3 и 13 несколько не «нормальные». Если вы удалите их, вы получите ... лучшую кривую? Но без каких-либо знаний или предположений о процессе это несправедливо :) – twil