Как я могу подогнать сплайн к данным, которые содержат значения и 1/2 производные?


14

У меня есть набор данных, который содержит, скажем, некоторые измерения для положения, скорости и ускорения. Все приходят от одного и того же «бега». Я мог бы построить линейную систему и подогнать полином для всех этих измерений.

Но могу ли я сделать то же самое со сплайнами? Что такое способ «R»?

Вот некоторые смоделированные данные, которые я хотел бы разместить:

f <- function(x) 2+x-0.5*x^2+rnorm(length(x), mean=0, sd=0.1)
df <- function(x) 1-x+rnorm(length(x), mean=0, sd=0.3)
ddf <- function(x) -1+rnorm(length(x), mean=0, sd=0.6)

x_f <- runif(5, 0, 5)
x_df <- runif(8, 3, 8)
x_ddf <- runif(10, 4, 9)

data <- data.frame(type=rep('f'), x=x_f, y=f(x_f))
data <- rbind(data, data.frame(type=rep('df'), x=x_df, y=df(x_df)))
data <- rbind(data, data.frame(type=rep('ddf'), x=x_ddf, y=ddf(x_ddf)))

library(ggplot2)
ggplot(data, aes(x, y, color=type)) + geom_point()


library(splines)
m <- lm(data$y ~ bs(data$x, degree=6)) # but I want to fit on f, df, ddf. possible?

введите описание изображения здесь


Я не знаю ответа на ваш вопрос, но splinefunмогу ли вычислить производные, и, вероятно, вы могли бы использовать это в качестве отправной точки для подгонки данных, используя некоторые обратные методы? Мне интересно узнать решение этой проблемы.
Дэвид Лебауэр

1
Эта проблема была решена Морисом Коксом в его статье 1972 года. Я не знаю, поддерживает ли это R, но поисковым термином является «сплайны Эрмита».
user14717

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

3
Довольно стандартный подход - через фильтрацию Калмана. (Ненаблюдаемое) состояние содержит точные производные, и их наблюдения являются зашумленными версиями. Например, модель для кубического сплайна примерно говорит о том, что производная второго порядка является белым шумом (с непрерывным временем), но можно использовать и модель более высокого порядка. Вам нужно будет описать шум измерения в зависимости от порядка вывода для текущего наблюдения. При первом подходе может быть достаточно трех дисперсий шума (необходимо оценить).
Ив

2
что такое ошибка измерения на производных? это намного выше, чем положение? также на вашем графике, почему точки не выровнены? что такое ось х?
Аксакал

Ответы:


9

Мы опишем, как можно использовать сплайн с помощью методов фильтрации Калмана (KF) в связи с моделью пространства состояний (SSM). Тот факт, что некоторые сплайн-модели могут быть представлены SSM и вычислены с помощью KF, был обнаружен CF Ansley и R. Kohn в 1980-1990 годах. Оценочная функция и ее производные являются ожиданиями государства, обусловленными наблюдениями. Эти оценки рассчитываются с использованием фиксированного интервала сглаживания , обычной задачи при использовании SSM.

Для простоты предположим, что наблюдения проводятся в моменты времени t1<t2<<tn и что число наблюдений k в момент времени tk включает только одну производную с порядком dk в {0,1,2} . Наблюдательная часть модели записывается в виде

(O1)y(tk)=f[dk](tk)+ε(tk)
гдеf(t) обозначает ненаблюдаемуюистиннуюфункцию, аε(tk) представляет собой гауссовскую ошибку с дисперсияH(tk) зависимости от порядка выводаdk, Уравнение перехода (с непрерывным временем) принимает общий вид где - ненаблюдаемый вектор состояния, а - гауссовский белый шум с ковариацией , предположительно не зависящий от шума наблюдения r.vs . Чтобы описать сплайн, рассмотрим состояние, полученное путем суммирования первых производных, то есть . Переход
(T1)ddtα(t)=Aα(t)+η(t)
α(t)η(t)Qε(tk)mα(t):=[f(t),f[1](t),,f[m1](t)]
[f[1](t)f[2](t)f[m1](t)f[m](t)]=[010001100][f(t)f[1](t)f[m2](t)f[m1](t)]+[000η(t)]
2м2м-1m=2 а затем мы получаем полиномиальный сплайн порядка (и степени ). В то время как соответствует обычному кубическому сплайну,2m2m1m=2>1у ( т к ), Чтобы придерживаться классического SSM-формализма, мы можем переписать (O1) как где наблюдение матрица выбирает подходящую производную и дисперсия из выбирается в зависимости от . Итак, где , и . Точно так же
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
Z1 :=[1,Z(tk)α(tk)H(tk)ε(tk)dkZ(tk)=Zdk+1Z1:=[1,0,,0]Z2:=[0,1,0]Z3:=[0,0,1,0,]H(tk)=Hdk+1 H 1 H 2 H для трех дисперсий , и . H1H2H3

Хотя переход происходит в непрерывном времени, KF фактически является стандартным дискретным временем . Действительно, на практике мы сосредоточимся на моментах времени когда у нас есть наблюдение или где мы хотим оценить производные. Мы можем взять набор как объединение этих двух наборов времен и предположить, что наблюдение в момент времени может отсутствовать: это позволяет оценить производных в любой момент времени независимо от существования наблюдения. Осталось вывести дискретный SSM.t{tk}tkmtk

Мы будем использовать индексы для дискретного времени, писать для и так далее. SSM с дискретным временем принимает форму где матрицы и получены из (T1) и (O2), тогда как дисперсия определяется как при условии, чтоαkα(tk)

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=Var(ηk)εkHk=Hdk+1ykТк=ехр{δк}=[ 1 δне пропал. Используя некоторую алгебру, мы можем найти матрицу перехода для SSM с дискретным временем где для . Аналогично ковариационная матрица для SSM с дискретным временем может быть задана как
Tk=exp{δkA}=[1δk11!δk22!δkm1(m1)!01δk11!δk11!01],

δk:=tk+1tkk<nQk=Var(ηk)
Qk=ση2[δk2mij+1(mi)!(mj)!(2mij+1)]i,j
ij1м где индексы и находятся между и .ij1m

Теперь, чтобы перенести вычисления в R, нам нужен пакет, посвященный KF и принимающий изменяющиеся во времени модели; CRAN пакет KFAS кажется хорошим вариантом. Мы можем написать R-функции для вычисления матриц и из вектора времен для кодирования SSM (DT). В обозначениях, используемых пакетом, матрица умножает шум в уравнении перехода (DT): здесь мы принимаем его за тождество . Также обратите внимание, что здесь должна использоваться диффузная начальная ковариация.TkQktkRkηkIm

EDIT , как первоначально написано было неправильно. Исправлено (также в R код и изображение).Q

CF Ansley и R. Kohn (1986) "Об эквивалентности двух стохастических подходов к сглаживанию сплайнов" J. Appl. Вероятно. , 23, с. 391–405

R. Kohn и CF Ansley (1987) «Новый алгоритм сглаживания сплайнов, основанный на сглаживании случайного процесса» SIAM J. Sci. и стат. Вычи. , 8 (1), с. 33–48

Я. Хельске (2017). «KFAS: экспоненциальные семейные модели состояний пространства в R» J. Stat. Мягкий. 78 (10), стр. 1-39

сглаживание с производными

smoothWithDer <- function(t, y, d, m = 3,
                          Hstar = c(3, 0.2, 0.1)^2, sigma2eta = 1.0^2) {

    ## define the SSM matrices, depending on 'delta_k' or on 'd_k'
    Tfun <- function(delta) {
        mat <-  matrix(0, nrow = m, ncol = m)
        for (i in 0:(m-1)) {
            mat[col(mat) == row(mat) + i] <- delta^i / gamma(i + 1)
        }
        mat
    }
    Qfun <- function(delta) {
        im <- (m - 1):0
        x <- delta^im / gamma(im + 1)
        mat <- outer(X = x, Y = x, FUN = "*")
        im2 <- outer(im, im, FUN = "+")
        sigma2eta * mat * delta / (im2 + 1) 
    }
    Zfun <-  function(d) {
        Z <- matrix(0.0, nrow = 1, ncol = m)
        Z[1, d + 1] <- 1.0
        Z
    }
    Hfun <- function(d) ifelse(d >= 0, Hstar[d + 1], 0.0)
    Rfun <- function() diag(x = 1.0, nrow = m)

    ## define arrays by stacking the SSM matrices. We need one more
    ## 'delta' at the end of the series
    n <- length(t)
    delta <-  diff(t)
    delta <- c(delta, mean(delta))

    Ta <- Qa <- array(0.0, dim = c(m, m, n))
    Za <- array(0.0, dim = c(1, m, n))
    Ha <- array(0.0, dim = c(1, 1, n))
    Ra <-  array(0.0, dim = c(m, m, n))

    for (k in 1:n) {
        Ta[ , , k] <- Tfun(delta[k])
        Qa[ , , k] <- Qfun(delta[k])
        Za[ , , k] <- Zfun(d[k])
        Ha[ , , k] <- Hfun(d[k])
        Ra[ , , k] <- Rfun()
    }

    require(KFAS)
    ## define the SSM and perform Kalman Filtering and smoothing
    mod <- SSModel(y ~ SSMcustom(Z = Za, T = Ta, R = Ra, Q = Qa, n = n,
                                 P1 = matrix(0, nrow = m, ncol = m),
                                 P1inf = diag(1.0, nrow = m), 
                                 state_names = paste0("d", 0:(m-1))) - 1)
    out <- KFS(mod, smoothing = "state")
    list(t = t, filtered = out$att, smoothed = out$alphahat)

}

## An example function as in OP
f <- function(t, d = rep(0, length = length(t))) {
    f <- rep(NA, length(t))
    if (any(ind <- (d == 0))) f[ind] <- 2.0 + t[ind] - 0.5 * t[ind]^2
    if (any(ind <- (d == 1))) f[ind] <- 1.0 - t[ind]
    if (any(ind <- (d == 2))) f[ind] <- -1.0
    f
}

set.seed(123)
n <-  100
t <- seq(from = 0, to = 10, length = n)
Hstar <- c(3, 0.4, 0.2)^2
sigma2eta <- 1.0

fTrue <- cbind(d0 = f(t), d1 = f(t, d = 1), d2 = f(t, d = 2))

## ============================================================================
## use a derivative index of -1 to indicate non-observed values, where
## 'y' will be NA
##
## [RUN #0]  no derivative  m = 2 (cubic spline)
## ============================================================================
d0 <- sample(c(-1, 0), size = n, replace = TRUE, prob = c(0.7, 0.3))
ft0 <-  f(t, d0)
## add noise picking the right sd
y0 <- ft0 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d0 + 2])
res0 <- smoothWithDer(t, y0, d0, m = 2, Hstar = Hstar)

## ============================================================================
## [RUN #1] Only first order derivative: we can take m = 2 (cubic spline)
## ============================================================================
d1 <- sample(c(-1, 0:1), size = n, replace = TRUE, prob = c(0.7, 0.15, 0.15))
ft1 <-  f(t, d1)
y1 <- ft1 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d1 + 2])
res1 <- smoothWithDer(t, y1, d1, m = 2, Hstar = Hstar)

## ============================================================================
## [RUN #2] First and second order derivative: we can take m = 3
## (quintic spline)
## ============================================================================
d2 <- sample(c(-1, 0:2), size = n, replace = TRUE, prob = c(0.7, 0.1, 0.1, 0.1))
ft2 <-  f(t, d2)
y2 <- ft2 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d2 + 2])
res2 <- smoothWithDer(t, y2, d2, m = 3, Hstar = Hstar)

## plots : a ggplot with facets would be better here.
for (run in 0:2) {
    resrun <- get(paste0("res", run))
    drun <- get(paste0("d", run))
    yrun <- get(paste0("y", run))
    matplot(t, resrun$smoothed, pch = 16, cex = 0.7, ylab = "", xlab = "")
    matlines(t, fTrue, lwd = 2, lty = 1)
    for (dv in 0:2) {
        points(t[drun == dv], yrun[drun == dv], cex = 1.2, pch = 22, lwd = 2,
               bg = "white", col = dv + 1)
    }
    title(main = sprintf("run %d. Dots = smooothed, lines = true, square = obs", run))
    legend("bottomleft", col = 1:3, legend = c("d0", "d1", "d2"), lty = 1)
}

Спасибо за ваш ответ. Я очень заинтересован в этом. В настоящее время вы не позволяете определенным образом использовать значение fи его производную t. Можно ли использовать всю информацию? Опять мерси за твой ответ.
дани

Мое чтение состоит в том, что все ниже T1 об использовании нескольких производных в одной и той же процедуре вывода. Ив может подтвердить, хотя.
eric_kernfeld

Действительно, вы можете использовать, скажем, производных для одного : наблюдение является вектором, а содержит строк, выбирающих производные. Я уверен, что общий работает с KFAS , но, используя NA, можно также иметь переменную по времени . t k y k Z k o k o > 1 ook>1tkykZkoko>1o
Ив

@Yves ли я вас правильно понимаю: Если у меня есть первая и вторая производная в точке t_k, то z_k выглядит следующим образом : matrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T). Так, в целом было бы куб размерности «старшей производной» * «сплайн степени» * «# шагов времени»
дани

Да, @dani, почти: количество строк для всех матриц равно то есть в примере. Это высший производный заказ плюс один. Кроме того, степень сплайна составляет , а не . В вашем примере, поскольку вы не наблюдаете производную порядка (саму функцию), ее следует установить в наблюдениях, и вы также можете удалить первую строку. Тем не менее, я подозреваю, что в этом конкретном случае проблема является некорректной, SSM может не наблюдаться . Zkmaxk{dk+1}32m1m0NA
Ив

5

Вы можете добиться потрясающих результатов с помощью стандартной процедуры наименьших квадратов, если у вас есть разумное представление об относительных размерах случайных ошибок, допущенных для каждой производной. Нет ограничений на количество измерений, которые вы делаете для каждого значения - вы можете даже одновременно измерять различные производные для каждого из них. Единственное ограничение в использовании обычных наименьших квадратов (OLS) является обычным: вы предполагаете, что измерения независимы.x

Основная идея может быть наиболее четко выражена путем абстрагирования проблемы. Ваша модель использует набор функций (например, любой сплайн-базис) в качестве основы для прогнозирования значений неизвестной функции в точках Это означает, что вы оценить коэффициенты для которых каждая из линейных комбинаций приемлемо приближается к Назовем это (векторное) пространство линейных комбинацийpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F.

Особенностью этой проблемы является то, что вы не обязательно соблюдаетеyi. Вместо этого существует определенный набор линейных функционалов связанных с данными. Напомним, что функционал является «функцией функции»: каждый присваивает число любой функции Модель утверждает, чтоLiLiLi[f]fF.

(1)yi=Li[f]+σiεi

где - заданные функционалы, - известные масштабные коэффициенты, а - независимые и одинаково распределенные случайные величины.Liσi>0εi

Два дополнительных предположения делают OLS применимым и статистически значимым:

  1. Общее распределение имеет конечную дисперсию.εi

  2. Каждый является линейным функционалом. Функционал является линейным, когда для любых элементов и соответствующих чиселLiLfjFαj,

    L[jαjfj]=jαjL[fj].

(2) позволяет модели быть выражены более явно как(1)

yi=β1Li[f1]++βpLi[fp]+σiεi.

Весь смысл этого сокращения является то , что , потому что вы предусмотрели все функционалы все базисные функции и стандартные отклонения значения Все номера - - это просто обычные «переменные» или «особенности» задачи регрессии, а - это просто (относительные) веса. Таким образом, в оптимальном смысле теоремы Гаусса-Маркова OLS является отличной процедурой для использования.Li,fj,σi,Li[fj]σi

Функционалы, вовлеченные в вопрос, следующие:

  • Оцените в указанной точке Это то, что мы обычно делаем. Это линейно, потому что по определению линейные комбинации функций оцениваются поточечно.fx: L[f]=f(x).

  • Оценить производную в указанной точке Это линейно, потому что дифференцирование линейно.fx: L[f]=f(x).

  • Оцените вторую производную в указанной точкеfx: L[f]=f(x).


Хорошо, насколько хорошо этот подход работает? Как обычно, мы изучим невязки сравнивая подогнанные значения с наблюдаемыми значениями. Поскольку позиции, скорости и ускорения находятся в разных единицах, их следует наносить на отдельные оси.y^iyiy^i

фигура

Верхний ряд использует кривые для графа и его первых двух производных. Соответствующие точки данных нанесены на кривые: наблюдаемые значения слева, наблюдаемые производные в середине и наблюдаемые вторые производные справа.y^

Нижний ряд отображает соответствующие остатки. Как обычно, мы ищем отсутствие каких-либо заметных отношений: мы надеемся, что остаточные значения (их y-координаты) изменяются случайным образом слева направо, показывая независимость и никаких тенденций.

В значения данных были получено так же , как в вопросе (после установки случайного числа семян до 17 , используя для воспроизводимости). Я исследовал подгонки, используя пространства B-сплайнов сгенерированные функцией , также как и в вопросе, для степеней с 1 по 6. На этом рисунке показаны результаты для степени 2, которая является самой низкой степенью (то есть простейшей моделью) демонстрирует низкий AIC и хорошее остаточное поведение, а также модель, указанную ANOVA всех шести (вложенных) моделей.n=23set.seed(17)FRbs

Подгонка

y^=27.48993+2.54078f1+2.97679f2

где и - базисные функции B-сплайна, созданные .f1f2bs

Остатки ведут себя хорошо. Подходит хорошо. Более того, этот подход нашел правильную модель: данные действительно были получены из квадратичной функции (степень 2). Кроме того, стандартные отклонения остатков примерно равны правильным размерам: 0,11, 0,20 и 0,61 по сравнению с 0,1, 0,3 и 0,6, используемыми для генерации исходных ошибок. Это довольно удивительно, учитывая, что эти кривые явно экстраполируют наблюдения (которые не выходят за пределы ) и используют такой небольшой набор данных ( ).x=5n=23

Наконец, остатки пригонки для сплайнов более высокой степени качественно одинаковы; они делают только незначительные улучшения за счет использования менее правдоподобных моделей. При достаточно высоких градусах они начинают сильно колебаться, например, при малых значениях между наблюдаемыми значениями. Чтобы проиллюстрировать это (плохое) поведение, вот пример степени 9:x

фигура 2

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

mult <- 2
x_f <- rep(runif(5, 0, 5), mult)       # Two observations per point
x_df <- rep(runif(8, 3, 8), mult)      # Two derivatives per point
x_ddf <- c(x_df, rep(runif(10, 4, 9))  # Derivative and acceleration per point

Рисунок 3


RКод для проведения этих расчетов является достаточно общим. В частности, он использует численное дифференцирование для нахождения производных, чтобы он не зависел от типа используемого сплайна. Он обрабатывает различные значения , взвешивая наблюдения пропорционально Он автоматически создает и помещает набор моделей в цикл. Линейные функционалы и стандартные отклонения жестко запрограммированы. Их три, выбранных в соответствии со значением переменной в наборе данных.σi1/σi2.Liσitype

В качестве примеров того, как вы можете использовать подгонки, краткие распечатки кодов, список их AIC и ANOVA их всех.

#
# Estimate spline derivatives at points of `x`.
#
d <- function(x, s, order=1) {
  h <- diff(range(x, na.rm=TRUE))
  dh <- h * 1e-4
  lags <- seq(-order, order, length.out=order+1) * dh/2
  b <- choose(order, 0:order) * (-1)^(order:0)
  y <- b %*% matrix(predict(s, c(outer(lags, x, `+`))), nrow=length(lags))
  y <- matrix(y / (dh^order), nrow=length(x))
}
#
# Fit and plot models by degree.
#
data$order <- c(f=0, df=1, ddf=2)[data$type]
k <- max(data$order)
x <- data$x
w <- (c(0.1, 0.3, 0.6)^(-2))[data$order+1] # As specified in the question

fits <- lapply(1:6, function(deg) {
  #
  # Construct a model matrix.
  #
  s <- bs(x, degree=deg, intercept=TRUE)
  X.l <- lapply(seq.int(k+1)-1, function(i) {
    X <- subset(data, order==i)
    Y <- as.data.frame(d(X$x, s, order=i))
    cbind(X, Y)
  })
  X <- do.call("rbind", X.l)
  #
  # Fit WLS models.
  #
  f <- as.formula(paste("y ~ -1 +", paste0("V", 0:deg+1, collapse="+")))
  fit <- lm(f, X, weights=w)
  msr <- tapply(residuals(fit), data$order, function(r) {
    k <- length(r) - 1 - deg
    ifelse(k >= 1, sum(r^2) / k, 1)
  })
  #
  # Compute predicted values along the graphs.
  #
  X.new <- data.frame(x = seq(min(X$x), max(X$x), length.out=101))
  X.new$y.hat <- predict(s, X.new$x) %*% coefficients(fit)
  X.new$Dy.hat <- d(X.new$x, s, 1) %*% coefficients(fit)
  X.new$DDy.hat <- d(X.new$x, s, 2) %*% coefficients(fit)
  X$Residual <- residuals(fit)
  #
  # Return the model.
  #
  fit$msr <- msr
  fit
})
lapply(fits, function(f) sqrt(f$msr))
lapply(fits, summary)
lapply(fits, AIC)
do.call("anova", fits)

1

Прежде всего, я хочу поблагодарить вас за постановку этого вопроса. Это действительно интересный вопрос. Я люблю сплайны и классные вещи, которые вы можете делать с ними. И это дало мне повод для некоторых исследований. :-)

BLUF: короткий ответ - нет. Я не знаю ни одной функциональности в R, которая сделает это для вас автоматически. Длинный ответ ... гораздо сложнее. Тот факт, что производные и значения функций не выбираются в одном месте, делает это более сложным. А тот факт, что у вас нет значения функции в правом конце интервала, может сделать это невозможным.

Начнем с кубического сплайна. Для заданных точек и соответствующих вторых производных кубический сплайн, проходящий через них:(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
где Довольно просто проверить, что , , и . Это гарантирует, что сплайн и его вторая производная непрерывны. Однако на данный момент у нас нет непрерывной первой производной. Чтобы заставить первую производную быть непрерывной, нам нужно следующее ограничение:
hj=xj+1xjA=xj+1xhjB=1AC=16(A3A)hj2D=16(B3B)hj2
Sj(xj)=yjSj(xj+1)=yj+1Sj(xj)=zjSj(xj+1)=zj+1
(1)6hj1yj1(6hj1+6hj)yj+6hjyj+1=hj1zj1+2(hj1+hj)zj+hjzj+1
В классической настройке кубического сплайна вы предполагаете, что у вас есть точки и используете уравнение (вместе с двумя дополнительными граничными ограничениями) для решения для . Как только вы знаете , сплайн полностью указан, и вы можете использовать его для интерполяции в любой произвольной точке. В качестве дополнительного бонуса уравнение превращается в трехугольную матрицу, которая может быть решена за линейное время!(xj,yj)(1)zjzj(1)

Хорошо, теперь предположим, что вместо того, чтобы знать , вы знаете . Можете ли вы использовать уравнение для решения для ? С точки зрения чистой алгебры это кажется возможным. Есть уравнений и неизвестных, так что ... почему бы и нет? Но оказывается, что вы не можете; матрица будет единственной. И это не должно вызывать удивления. Как вы могли бы интерполировать значения функций, заданные просто вторыми производными? По крайней мере, вам нужно начальное значение, как дифференциальное уравнение.yjzj(1)yjNN

А как насчет вашей ситуации? Некоторые из ваших точек имеют значения функций, а некоторые из ваших точек имеют производные. В настоящее время давайте проигнорируем первые производные (они вроде беспорядка, чтобы иметь дело с кубическим сплайном). Формально, пусть - множество точек со значениями функций, а - множество точек со вторыми производными. У нас все еще есть уравнений с неизвестными. Просто некоторые из неизвестных - это а некоторые - . Оказывается, вы получите решение, если 0, 1 или 2 AND или(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I, Другими словами, одна из первых трех точек должна быть значением функции И одна из последних трех точек должна быть значением функции. Помимо этого ограничения, вы можете добавить столько производных, сколько захотите.

Как насчет тех первых производных? Конечно, можно включить первые производные в ваш сплайн. Но, как я уже сказал, все становится намного грязнее. Первая производная сплайна имеет вид: Конечно, нас действительно интересует только производная по узлам, поэтому мы можем немного упростить ее, оценив ее в : Вы можете добавить эти ограничения на матрицу, которые вы получаете из уравнения

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)и результирующий сплайн будет иметь указанные первые производные. Кроме того, это поможет с проблемой сингулярной матрицы. Вы получите решение, если у вас есть ЛИБО значение функции или первая производная в первых трех и последних трех точках.

Итак, я собрал все это вместе в некотором коде, и вот картинка, которую я получил:

Сплайн ужасно ошибся

Как видите, результаты невелики. Это потому, что это обычный сплайн, который должен учитывать ВСЕ данные. Поскольку данные стохастические, нам действительно нужно использовать сплайн регрессии. Это тема для другого поста. Но если вы поработаете над математикой, вы в конечном итоге оптимизируете квадратную целевую функцию с учетом ограничений линейного равенства - и есть решение в замкнутой форме!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.