Аппроксимация функции нескольких переменных

Для нахождения приближающей функции y = f(x) по методу наименьших квадратов и построения графиков я использовал следующие функции из пакета NumPy:

t = np.polyfit(x, y, 3)
f = np.poly1d(t)
ax.plot(x, f(x))

Теперь появилась необходимость найти коэффициенты и построить график для функции у которой несколько переменных y = f(x,z). Как можно решить данную задачу?


Ответы (1 шт):

Автор решения: Pak Uula

Вам нужна интерполяция или аппроксимация?

Интерполяция - это поиск значений между точками с известными значениями. На практике используют линейные приближения (в двумерном случае триангуляционные), либо кубические сплайны.

Аппроксимация - приближение неизвестной функции функцией из известного семейства. Семейство выбирают из каких-либо теоретических соображений.

Судя по вашему комментарию, вам нужна именно аппроксимация - подбор параметра по известной модели. Для аппроксимации в scipy.optimize есть функция curve_fit(f,x,y)

Она принимает на вход функцию вида f(x, p1, p2, ..., pn), где x - переменная (возможно, многомерная), p1, p2, ..., pn - параметры. curve_fit пытается подобрать параметры p_i так, чтобы минимизировать отклонения в заданных точках x от известных значений y.

Пример.

Подбор параметров для двумерной функции вида r*cos(2*pi*r) - три параметра: амплитуда A, сдвиг по оси x dx и сдвиг по оси y dy.

def r_cos(var_2d, A, dx, dy):
    x = var_2d[0] - dx
    y = var_2d[1] - dy
    r = np.sqrt(x*x + y*y)
    return A*r*np.cos(2*np.pi*r)

Для двумерности в переменную var_2d передается двумерный массив, где первая строка x а вторая строка y.

Тестовые данные - набор случайных 20 точек с небольшим шумом. Пареметры A=1.5, dx=0.2, dy=0.3.

vx = np.random.rand(20)
vy = np.random.rand(20)
v_2d = np.vstack((vx,vy))
Z = r_cos(v_2d, 1.5, 0.2, 0.3) + 0.05*np.random.rand(len(vx))

Подбор параметров:

p, p_cov = curve_fit(r_cos, v_2d, Z, p0=[1.0,0.0,0.0])

Возвращаемое значение p - оптимальный набор параметров, p_cov ковариционная матрица. Ошибка приближения i-го параметра оценивается как квадратный корень из соответствующего элемента на диагонали p_cov, вектор ошибок можно вычислить как np.sqrt(np.diag(p_cov)). Результат таков: [1.46694227, 0.19898437, 0.29632489] ± [0.01517198, 0.0016201 , 0.00238286]

→ Ссылка