Метод прогнозирования гридданных - PullRequest
0 голосов
/ 14 мая 2018

Используя данные сетки в scipy, используемые для интерполяции (кубические сплайны и т. Д.), Мы должны поместить в качестве параметров данные, из которых мы интерполируем, и в то же время новые точки, по которым мы хотим сделать «прогноз». ».

Можно ли построить «объект griddata», у которого был бы метод, позволяющий прогнозировать новую точку, не восстанавливая каждый раз новый сплайн интерполяции ...? (например, как и в случае с деревом регрессии, мы сначала строим дерево, а затем применяем метод .predict (new_points)).

Вот пример:

import pandas as pd
import numpy as np
import sklearn
import scipy.interpolate as itp

n = 100
x1 = np.linspace(-2, 4, n)

X1 = []
X2 = []

for x in x1:
    X1.append( [x for i in range(0, n)] )
    X2.append( np.linspace(9, 15, n) )

X1 = np.array(X1).flatten()
X2 = np.array(X2).flatten()

Y1 = exp( 2*X1 )
    Y2 = 3 * sqrt(X2)

#Data frames :
X = np.transpose( [X1, X2] )
X = pd.DataFrame(X, columns=["X1", "X2"])

Y = np.transpose( [Y1, Y2] )
Y = pd.DataFrame(Y, columns=["Y1", "Y2"])

X_new = np.transpose( [[-2], [9]] )

inter_cubic = itp.griddata(X, Y, X_new, method='cubic', fill_value=nan, rescale=False)

print(inter_cubic)

print(exp(2*(-2)), 3*sqrt(9))

Теперь inter_cubic - это просто массив элементов ..

Есть ли способ выполнить это, или мы можем использовать другой конструктор "сплайн"?

1 Ответ

0 голосов
/ 14 мая 2018

Если вы посмотрите на исходный код для griddata (прокрутите вниз строку документации, чтобы увидеть реальный код), вы увидите, что это оболочка для нескольких других функций интерполяции, большинствокоторые работают так, как вы хотите.В вашем случае, с двумерными данными и кубической интерполяцией, griddata делает это:

        ip = CloughTocher2DInterpolator(points, values, fill_value=fill_value,
                                        rescale=rescale)
        return ip(xi)

Таким образом, вместо использования griddata, вы можете использовать CloughTocher2DInterpolator.В частности, используя имена из вашего скрипта, вы создадите интерполятор с

ip = itp.CloughTocher2DInterpolator(X, Y, fill_value=np.nan, rescale=False)

У объекта ip нет метода predict;Вы просто называете это с точками, в которых вы хотите оценить интерполятор.В вашем случае вы бы написали

Y_new = ip(X_new)
...