Экстраполяция из изогнутых точек данных

Я не могу понять, как экстраполировать набор данных, в котором точки не упорядочены, то есть уменьшаются для «x». вот так:

http://www.pic-host.org/images/2014/07/21/0b5ad6a11266f549.png

Я понял, что мне нужно создать график для значений x и y отдельно. Итак, код, который дает мне это: (Точки упорядочены)

x = bananax
y = bananay

t = np.arange(x.shape[0], dtype=float) 
t /= t[-1]
nt = np.linspace(0, 1, 100) 

x1 = scipy.interpolate.spline(t, x, nt) 
y1 = scipy.interpolate.spline(t, y, nt)

plt.plot(nt, x1, label='data x')
plt.plot(nt, y1, label='data y')

Теперь у меня есть интерполированные сплайны. Думаю, мне нужно сделать экстраполяцию для f(nt)=x1 и f(nt)=y1 соответственно. Я понимаю, как интерполировать данные с помощью простой линейной регрессии, но мне не хватает того, как получить из нее более сложный сплайн (?). Цель состоит в том, чтобы позволить экстраполированной функции следовать кривизне точек данных. (по крайней мере с одного конца)

Здоровья и спасибо!


person Horst    schedule 21.07.2014    source источник


Ответы (2)


Я считаю, что вы на правильном пути в том, что вы создаете параметрическую кривую (создавая x (t) и y (t)), потому что точки упорядочены. Часть проблемы, по-видимому, заключается в том, что функция spline возвращает вам дискретные значения, а не форму и параметры сплайна. scipy.optimize имеет несколько хороших инструментов, которые помогут вам найти функции, а не вычислять баллы.

Если у вас есть какое-то представление об основном процессе, генерирующем данные, я предлагаю вам использовать его, чтобы помочь выбрать функциональную форму для подгонки. Эти более свободные методы дадут вам определенную гибкость.

Сопоставьте x(t) и y(t) и сохраните полученные функции подбора. Они будут сгенерированы с данными от t=0 до t=1, но ничто* не помешает вам оценить их за пределами этого диапазона.

Я могу порекомендовать следующие ссылки для руководства по процедуре подбора кривой:

коротко: http://glowingpython.blogspot.com/2011/05/curve-fitting-using-fmin.html

длинный: http://nbviewer.ipython.org/gist/keflavich/4042018

*почти ничего

person Dan    schedule 21.07.2014

Спасибо, это привело меня на правильный путь. Что сработало для меня:

x = bananax
y = bananay

#------ fit a spline to the coordinates, x and y axis are interpolated towards t
t = np.arange(x.shape[0], dtype=float) #t is # of values
t /= t[-1] #t is now devided from 0 to 1
nt = np.linspace(0, 1, 100) #nt is array with values from 0 to 1 with 100 intermediate values

x1 = scipy.interpolate.spline(t, x, nt) #The x values where spline should estimate the y values
y1 = scipy.interpolate.spline(t, y, nt)

#------ create a new linear space for nnt in which an extrapolation from the interpolated spline will be made 
nnt = np.linspace(-1, 1, 100) #values <0 are extrapolated (interpolation started at the tip(=0)

x1fit = np.polyfit(nt,x1,3) #fits a polynomial function of the nth order with the spline as input, output are the function parameters
y1fit = np.polyfit(nt,y1,3)

xpoly = np.poly1d(x1fit) #genereates the function based on the parameters obtained by polyfit
ypoly = np.poly1d(y1fit)
person Horst    schedule 18.08.2014