сглаженный линейный сплайн-фитинг с заданным количеством узлов - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь приспособить узел линейных сплайнов к набору точек. Теперь у Сципи есть метод, который подгоняет многочлен степени d (я установил его на 1 для лайнера) для набора точек, но я не могу определить желаемое количество узлов (я могу влиять на количество узлов через некоторый постоянный параметр, но я не знаю это заранее, и искать его со следом и ошибкой слишком обширные). Я нашел метод, который подгоняет кривую к набору точек, поначалу он выглядел очень многообещающе.

Я пытался установить линейный сплайн с 3 узлами, в основном идея состоит в том, чтобы определить функцию, которая получает в качестве параметра расположение узлов и параметры каждой линии из трех. к сожалению, я думаю, что это не сходится.

Я ищу новые идеи о том, как легко реализовать то, что я пытаюсь достичь.

import matplotlib.pyplot as plt

def knot3_spline_wrapper(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
    vfunc = np.vectorize(knot3_spline)
    return vfunc(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4)

def knot3_spline(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
    if x <c1:
        return x*a1+b1
    if c1<=x <c2:
        return x*a2+b2
    if c2<=x<c3:
        return x*a3+b3
    if c3<=x:
        return x*a4+b4
xdata = np.linspace(-2, 2, 50)
y = np.power(xdata, 2)
plt.plot(xdata, y, 'b-', label='data')
popt, pcov = curve_fit(knot3_spline_wrapper, xdata, y)
knot3_spline_wrapper(xdata, *popt)
plt.plot(xdata, knot3_spline_wrapper(xdata, *popt), 'r-')

РЕДАКТИРОВАТЬ: я хочу упомянуть, я не не знаю и не хочу указывать позиции узлов ... Я хочу найти способ найти "лучшие" позиции и лучшие линии, которые решают мою проблему

результат: enter image description here

1 Ответ

0 голосов
/ 13 февраля 2020

С помощью функции scipy LSQUnivariateSpline можно указать положение искомых узлов:

from scipy.interpolate import LSQUnivariateSpline
import numpy as np
import matplotlib.pylab as plt

# Generate some data
x = np.linspace(-1, 1, 123)
y = 3 + 10*x**2 + np.random.randn(len(x))

# Define wanted knot positions
knot_positions = np.linspace(-0.7, 0.7, 4)

# Performe the spline fitting (degree=k)
spline = LSQUnivariateSpline(x, y, knot_positions, k=1)

# Graph
y_fit = spline(x)

x_knots = spline.get_knots()
y_knots = spline(x_knots)

plt.plot(x, y, '.', color='black', label='data points');
plt.plot(x, y_fit, '-', color='red', label='fit');
plt.plot(x_knots, y_knots, 'o', color='red', label='knots')
plt.legend(); plt.xlabel('x'); plt.ylabel('y');

график:

linear spline fitting

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...