스플라인을 값과 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미분을 계산할 수 있으며 아마도 역 방법을 사용하여 데이터를 맞추기위한 출발점으로 이것을 사용할 수 있습니까? 이에 대한 해결책을 배우고 싶습니다.
David LeBauer

1
이 문제는 1972 년 논문에서 Maurice Cox에 의해 해결되었습니다. R이 그것을 지원하는지 모르겠지만 검색어는 "Hermite splines"입니다.
user14717

@DavidLeBauer 이것이 내가 현재하고있는 일입니다. 스플라인과 그 파생물이 데이터에 근접하도록 여러 지점에 맞는 최적화 문제를 공식화했습니다. 그러나 더 직접적인 방법이 좋습니다.
dani

3
매우 표준적인 접근 방식은 칼만 필터링입니다. (관측 할 수없는) 상태에는 정확한 도함수 가 포함 되며 관측치는 노이즈 버전입니다. 예를 들어, 3 차 스플라인 모델은 2 차 미분이 (연속 시간) 백색 잡음임을 대략적으로 나타내지 만, 더 높은 차수 모델도 사용될 수 있습니다. 현재 관측치의 도출 순서에 따라 측정 노이즈를 설명해야합니다. 첫 번째 접근법에서는 세 가지 잡음 분산 (추정)이 충분할 수 있습니다.
Yves

2
파생 상품의 측정 오류는 무엇입니까? 위치보다 훨씬 높습니까? 또한 플롯에서 왜 점이 정렬되지 않습니까? x 축은 무엇입니까?
Aksakal

답변:


9

SSM (State-Space Model)과 관련하여 KF (Kalman Filtering) 기술을 통해 스플라인을 사용하는 방법에 대해 설명합니다. 일부 스플라인 모델이 SSM으로 표현되고 KF로 계산 될 수 있다는 사실은 1980-1990 년에 CF Ansley와 R. Kohn에 의해 밝혀졌습니다. 추정 된 기능과 그 파생어는 관측치에 대한 상태의 기대치입니다. 이러한 추정값은 SSM을 사용할 때 일상적인 작업 인 고정 간격 스무딩 을 사용하여 계산됩니다 .

간단히하기 위해, 시점에서 관측이 이루어지고 에서 의 관측 번호 는 차수를 단 하나의 도함수를 포함 한다고 가정합니다. . 모델의 관측 부분은 로 여기서 는 관찰되지 않은 함수를 나타내고 는 유도 차수 에 따라 분산 가있는 가우스 오차입니다 . (연속 시간) 전이 방정식은 일반적인 형태를 취합니다. t1<t2<<tnktkd k { 0 ,dk{0,1,2}

(O1)y(tk)=f[dk](tk)+ε(tk)
f(t)ε ( t k ) H ( t k ) d kε(tk)H(tk)dk
(T1)ddtα(t)=Aα(t)+η(t)
여기서 관찰되지 상태 벡터이며 공분산을 갖는 가우시안 백색 잡음이다 상기 독립적 인 것으로 가정 관측 노이즈 r.vs . 스플라인을 설명하기 위해 1 차 도함수 를 쌓아서 얻은 상태 , 즉 . 전환은 α(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)]
그리고 우리 는 차수 (및 차수 ) 의 다항식 스플라인 을 얻습니다 . 는 일반적인 입방 스플라인에 해당 하지만2m2m-1m=2>(1 개) , Y ( t에서 K ) 2m2m1m=2>1. 고전적인 SSM 형식을 고수하기 위해 (O1)을 관측 행렬 여기서 상기 적합한 유도체를 집어 및 분산 의 에 따라 선택된다 . 따라서 여기서 , 및 . 마찬가지로
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
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 3세 대한 편차를 , 및 . 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+1ykTk=exp{δkA}=[ 1 δ 1 k누락되지 않았습니다. 일부 대수를 사용하여 불연속 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
여기서 인덱스 와 는 과 사이 입니다.ij1m

이제 R로 계산을 수행하려면 KF 전용 패키지와 시변 모델을 수용해야합니다. CRAN 패키지 KFAS 는 좋은 옵션으로 보입니다. SSM (DT)을 인코딩하기 위해 시간 의 벡터에서 행렬 및 를 계산하는 R 함수를 작성할 수 있습니다 . 패키지가 사용하는 표기법에서, 행렬 는 (DT)의 전이 방정식에서 잡음 를 곱 하게됩니다. 여기서는 그것을 . 또한 여기에서 확산 초기 공분산을 사용해야합니다.TkQktkRkηkIm

편집 처음 작성된 잘못이었다. 고정됨 (R 코드 및 이미지에도 동일).Q

CF Ansley and R. Kohn (1986) "스플라인 스무딩에 대한 두 가지 확률 론적 접근 방법의 동등성" J. Appl. 프로 밥. , 23, 391–405 쪽

R. Kohn and CF Ansley (1987) "확률 론적 프로세스 스무딩에 기반한 스플라인 스무딩을위한 새로운 알고리즘" SIAM J. Sci. 및 통계. 계산. , 8 (1), 33–48 쪽

J. Helske (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. 모든 정보를 어떻게 사용할 수 있습니까? 다시, 당신의 대답에 대한 감사합니다.
dani

내 독서는 T1 아래의 모든 것이 동일한 추론 절차에서 여러 파생물을 사용하는 것에 관한 것입니다. 그래도 이브는 확인할 수 있습니다.
eric_kernfeld

실제로, 하나의 대해 도함수를 사용할 수 있습니다 . 관측치 는 벡터이고 는 원하는 도함수를 선택하는 행 . 나는 확신이 공통 개 작품 KFAS 만의 NA를 사용하여 한 번이 변화해야하는 것이 가능할 수있다 뿐만 아니라. ok>1tkykZkoko>1o
Yves

@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

예 @dani, 거의 : 모든 행렬 의 행 수 는 예에서 입니다. 이것은 가장 높은 도함수에 1을 더한 값입니다. 또한, 스플라인의 정도가 이 아닌 . 귀하의 예에서는 차수 의 미분 (함수 자체)을 관찰하지 않기 때문에 관찰에서 설정되어야하며 첫 번째 행도 삭제할 수 있습니다. 그러나이 특정한 경우에 문제가 잘못되어 SSM을 관찰 할 수없는 것으로 의심 됩니다. Zkmaxk{dk+1}32m1m0NA
Yves

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.

이러한 감소의 요점은 당신이 모든 함수 (Functionals) 규정 때문에 모든 기초 기능 표준 편차 값 모두 숫자 - -회귀 문제의 일반적인 "변수"또는 "기능"이며 는 단순히 (상대) 가중치입니다. 따라서 가우스 마르코프 정리 의 최적의 의미에서 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

그림

맨 윗줄은 곡선을 사용하여 와 첫 번째 두 도함수 를 그래프로 표시 합니다. 관련 데이터 포인트는 곡선에 걸쳐 그려져 있습니다 : 왼쪽에서 관측 된 값, 중간에서 관측 된 미분 계수, 오른쪽에서 관찰 된 2 차 미분 계수.y^

하단 행은 해당 잔차를 나타냅니다. 평소와 같이, 우리는 눈에 띄는 관계의 부족을 찾고 있습니다 : 잔차 값 (그들의 y 좌표)은 왼쪽에서 오른쪽으로 무작위로 변하기 때문에 독립성과 트렌드가 보이지 않기를 바랍니다.

데이터 값 (사용 17 난수 시드를 설정 한 후에 정확하게 문제로서 생성 하였다 재현성). 1에서 6까지의 질문에서와 같이 함수에 의해 생성 된 B- 스플라인 공간 사용하여 피팅을 탐색했습니다 .이 그림은 2 도의 결과를 보여줍니다. 6 가지 (중첩) 모델의 분산 분석으로 표시된 모델뿐만 아니라 낮은 AIC 및 우수한 잔류 거동을 나타냅니다.n=23set.seed(17)FRbs

맞는

y^=27.48993+2.54078f1+2.97679f2

여기서 및 는에 의해 생성 된 B- 스플라인 기반 함수입니다 .f1f2bs

잔차가 잘 ​​동작합니다. 착용감이 좋습니다. 더욱이,이 접근법은 정확한 모델을 찾았습니다 . 실제로 데이터는 2 차 함수 (도 2)에서 생성되었습니다. 또한 잔차의 표준 편차는 원래 크기를 생성하는 데 사용되는 0.1, 0.3 및 0.6과 비교하여 0.11, 0.20 및 0.61과 같은 올바른 크기입니다. 이러한 곡선이 관측 값을 분명히 추정하고 ( 넘지 않는 ) 작은 데이터 세트 ( )를 사용 한다는 점을 감안하면 상당히 놀랍습니다 .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 목록 및 모두의 분산을 인쇄합니다.

#
# 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에서 자동으로 수행 할 기능을 모릅니다. 긴 대답은 ... 훨씬 더 복잡합니다. 미분과 함수 값이 같은 위치에서 샘플링되지 않는다는 사실은 이것을 더 어렵게 만듭니다. 간격의 오른쪽 끝에 함수 값이 없다는 사실은 불가능할 수 있습니다.

입방 스플라인부터 시작하겠습니다. 주어진 점 및 해당하는 2 차 도함수 통과하는 3 차 스플라인은 다음과 같습니다.(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
여기서 이것은 확인하는 매우 간단하다는 , , 및 입니다. 이는 스플라인과 이차 미분이 연속적 임을 보장합니다 . 그러나 현재로서는 연속 1 차 도함수 가 없습니다 . 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
클래식 큐빅 스플라인 설정에서는 점 있고 방정식 (두 개의 추가 경계 제약 조건과 함께)을 사용하여 를 해결 합니다. 를 알면 스플라인이 완전히 지정되어 임의의 지점에서 보간하는 데 사용할 수 있습니다. 추가 보너스로 방정식 은 선형 시간으로 풀 수있는 3 행렬로 변환됩니다!(xj,yj)(1)zjzj(1)

OK, 이제 대신 알, 그 가정 , 당신은 알고 . 방정식 을 사용하여 를 풀 수 있습니까? 순수한 대수의 관점에서 볼 때 실현 가능한 것 같습니다. 있습니다 방정식과 알려지지 그래서 ... 왜? 그러나 그것은 당신이 할 수없는 것으로 밝혀졌습니다. 행렬은 단수입니다. 그리고 그것은 놀라운 일이 아닙니다. 어떻게 2 차 미분에 주어진 함수 값을 보간 할 수 있습니까? 최소한 미분 방정식과 마찬가지로 초기 값이 필요합니다.yjzj(1)yjNN

상황은 어떻습니까? 일부 포인트에는 함수 값이 있고 일부 포인트에는 미분 값이 있습니다. 당분간, 첫 번째 파생 상품을 무시합시다 (입방 스플라인 기준으로 다루어야 할 엉망입니다). 공식적으로, 을 함수 값을 갖는 점 세트로하고 을 2 차 도함수를 가진 점 세트로 . 우리는 여전히이 와 방정식 미지수를. 그것은 미지의 일부는 단지의 하고 일부는 . 0, 1 또는 2 및 또는 경우 솔루션을 얻는 것으로 나타났습니다(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I. 다시 말해, 처음 3 점 중 하나는 기능 값이어야하고 마지막 3 점 중 하나는 기능 값이어야합니다. 그 제약 외에, 원하는만큼 많은 파생 상품을 자유롭게 던질 수 있습니다.

첫 파생 상품은 어떻습니까? 스플라인에 첫 번째 파생 상품을 포함시키는 것이 가능합니다. 그러나 내가 말했듯이, 그것은 더 지저분 해집니다. 스플라인의 첫 번째 미분 값은 다음과 같습니다. 물론, 우리는 매듭의 미분에만 관심이 있으므로 에서 평가하여 조금 단순화 할 수 있습니다 . 다음을 추가 할 수 있습니다 방정식 에서 얻는 행렬에 대한 제약

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)결과 스플라인에는 지정된 1 차 도함수가 있습니다. 또한 이것은 특이 행렬 문제에 도움이됩니다. 첫 3 점과 마지막 3 점에 함수 값이나 첫 번째 미분이 있으면 솔루션을 얻을 수 있습니다.

그래서 나는 그것을 모두 코드로 묶었 고 여기에 내가 얻은 그림이 있습니다.

스플라인이 끔찍하게 사라졌습니다.

보시다시피 결과는 좋지 않습니다. 이는 모든 데이터를 준수해야하는 일반 스플라인이기 때문입니다. 데이터는 확률론 적이므로 회귀 스플라인을 사용해야합니다. 그것은 다른 게시물에 대한 주제입니다. 그러나 수학을 통해 작업하면 선형 등식 제약 조건에 따라 2 차 목적 함수를 최적화하게되며 폐쇄 형 솔루션이 있습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.