値と1次/ 2次導関数を含むデータにスプラインを適合させるにはどうすればよいですか?


13

たとえば、位置、速度、加速度の測定値を含むデータセットがあります。すべて同じ「実行」から来ます。線形システムを構築し、それらの測定すべてに多項式を当てはめることができました。

しかし、スプラインでも同じことができますか?これを行う「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
非常に標準的なアプローチは、カルマンフィルター処理です。(観測不能)状態には正確な導関数が含まれ、観測はこれらのノイズの多いバージョンです。たとえば、3次スプラインのモデルは、2次導関数が(連続時間)ホワイトノイズであることを大まかに示していますが、高次モデルも使用できます。現在の観測の導出の順序に応じて、測定ノイズを記述する必要があります。最初のアプローチでは、3つのノイズ分散(推定される)で十分です。
イヴ

2
デリバティブの測定誤差とは何ですか?位置よりもはるかに高いですか?あなたのプロットでも、なぜアレントポイントが揃っているのですか?X軸とは何ですか?
Aksakalはほぼ確実に

回答:


8

状態空間モデル(SSM)に関連して、カルマンフィルター(KF)手法を通じてスプラインを使用する方法を説明します。一部のスプラインモデルがSSMで表され、KFで計算できるという事実は、1980年から1990年にかけてCFアンスリーとR.コーンによって明らかにされました。推定関数とその導関数は、観測を条件とする状態の期待値です。これらの推定値は、SSMを使用する場合の定型タスクである固定間隔平滑化を使用して計算されます。

簡略化のため、観察は時間で行われることを前提としt1<t2<<tnと観測番号ことktk唯一伴う1オーダー有する誘導体dk{0,1,2}。モデルの観測部分は、

(O1)y(tk)=f[dk](tk)+ε(tk)
て書き込みます。 ここで、f(t)は観測されていない真の関数を示し、ε(tk) は派生次数 d kに応じた分散H(tk)dk。(連続時間)遷移方程式は、一般形式
(T1)ddtα(t)=Aα(t)+η(t)
α(t)未観測状態ベクトルとされる η(t)共分散を有するガウス白色雑音である、から独立であると仮定観測ノイズr.vs。スプラインを記述するために、 一次導関数を積み重ねることによって得られる状態、つまり Qε(tk)mα(t):=[f(t),f[1](t),,f[m1](t)][ f [ 1 ]t f [ 2 ]t f [ m 1 ]t f [ m ]t ] = [ 0 1 0。遷移は そして、次数(および次数)の多項式スプラインを取得し ます。一方、
[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)]
2M2、M-1m=2>1 y t k 2m2m1m=2通常の3次スプラインに対応し、次数導関数を使用するには高次が必要です。古典的なSSM形式に固執するために、(O1)を ここで、観測行列はの適切な導関数を選択し、の分散は 応じて選択され。だからここで、 >1
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
Z(tk)α(tk)H(tk)ε(tk)dkZ(tk)=Zdk+1Z1:=[1,0,,0]Z2:=[0,1,0]Z 3= [ 0 および。同様に、3つの分散、 、および、です。 Z3:=[0,0,1,0,]Htk=Hdk+1H1H2H3

遷移は連続時間ですが、KFは実際には標準の離散時間です。確かに、実際には、観測がある、またはデリバティブを推定したい時刻に焦点を当てます。集合をこれらの2つの時間の和集合として、での観測値が欠落していると想定できます。これにより、観測値の存在に関係なく、で微分 を推定できます。個別のSSMを導出する必要があります。t{tk}tkmtk

離散時間にインデックスを使用し、を 書き込みます。離散時間SSMは、の形式を取ります。 ここで、行列そして(T1)に由来し、(O2)を分散しながらによって与えられる は、αkαtk

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=ヴァールηkεkHk=Hdk+1ykTK=EXP{δKA}=[ 1 δ 1 K欠落していません。代数を使用して、離散時間SSMの遷移行列を見つけることができます where for。同様に、離散時間SSM の共分散行列は、
Tk=exp{δkA}=[1δk11!δk22!δkm1(m1)!01δk11!δk11!01],

δk:=tk+1tkk<nQk=ヴァールηk
Qk=ση2[δk2mj+1mmj2mj+1]j
ij1m インデックスはと間にある及び。j1m

Rで計算を引き継ぐには、KF専用のパッケージが必要であり、時変モデルを受け入れます。CRANパッケージKFASは適切なオプションのようです。我々は、行列計算するRの関数を書くことができる と回のベクトルからは SSM(DT)を符号化するために。パッケージで使用される表記法では、行列が(DT)の遷移方程式のノイズを乗算する ようになります。ここで、アイデンティティ。また、ここでは拡散初期共分散を使用する必要があることに注意してください。TkQktkRkηkm

EDIT当初書かれたように間違っていました。修正済み(Rコードおよび画像でも同様)。Q

CFアンスリーとR.コーン(1986)「スプライン平滑化への2つの確率的アプローチの等価性について」J. Appl。プロバブ。、23、pp。391–405

R. Kohn and CF Ansley(1987)「確率過程の平滑化に基づくスプライン平滑化の新しいアルゴリズム」SIAM J. Sci。と統計。計算します。、8(1)、33〜48ページ

J.ヘルスケ(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

実際、 1つのに対して導関数を使用できます。観測はベクトルであり、 は行で必要な導関数を選択します。一般的ながKFASで機能すると確信していますが、NAを使用することで、時変を使用することも可能です。t k y k Z k o k o > 1 ook>1tkykZkoko>1o
イヴ

@Yves私はあなたを正しく理解していますか:t_kのポイントに1次および2次導関数がある場合、Z_kは次のようになりますmatrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T)。したがって、全体としては、ディメンション「最高の微分」*「スプライン次数」*「タイムステップ数」のキューブになります
ダニ

@daniはい、ほぼすべての行数行列であるすなわち例です。これは、最高の微分次数に1を加えたものです。また、スプラインの次数はではなくです。この例では、次の導関数(関数自体)を監視していないため、監視で設定する必要があり、最初の行も削除できます。ただし、この特定のケースでは、問題が不適切であり、SSMを観察できない可能性があります。max k { d k +1}32m1m0Zkmaxk{dk+1}32m1m0NA
イヴ

4

各微分に対して行われたランダムエラーの相対的なサイズの合理的な考えがあれば、標準の最小二乗ルーチンで見事に実行できます。各値に対して行う測定の数に制限はありません。各値で異なる導関数を同時に測定することもできます。通常最小二乗(OLS)の使用における唯一の制限は通常です。測定値は独立していると仮定します。x

基本的な考え方は、問題を抽象化することで最も明確に表現できます。 モデルは、値を予測するためのベースとして、関数(スプライン基底など)のセットを使用します。未知の機能の点での これは、線形結合許容範囲で近似する係数を推定しようとすることを意味します これを線形結合の(ベクトル)空間と呼びましょうpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F

この問題の特別な点は、必ずしも観察しないことですyi.L I L I L I [F]F F 代わりに、データに関連付けられた一連の線形汎関数 定義されています。関数は「関数の関数」であることを思い出してください。各、任意の関数 数値を割り当てます 。モデルは、LiLiLi[f]fF.

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

ここで、は汎関数が与えられ、は既知のスケール係数であり、は独立した同一分布のランダム変数です。Liσi>0 ε Iεi

2つの追加の仮定により、OLSが適用可能になり、統計的に意味があります。

  1. の一般的な分布には有限の分散があります。εi

  2. すべてのは線形汎関数です。関数は、要素および対応する数値LiL F J F α J L [ Σ J α J F J ] = Σ jの α J L [ F J ]LfjFαj,

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

(2)モデルをより明示的に表現できるようにする(1)

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

この削減の全体的なポイントは、すべての汎関数すべての基底関数および標準偏差、値はすべて数値 - -これらは回帰問題の通常の「変数」または「機能」であり、は単なる(相対的な)重みです。したがって、ガウス・マルコフの定理の最適な意味で、OLSは使用するのに最適な手順です。Li,fj,σi,Li[fj] σ Iσi

質問に関係する機能は次のとおりです。

  • 指定された点でを評価します これは私たちが通常行うことです。定義上、関数の線形結合は点ごとに評価されるため、これは線形です。fx: L[f]=f(x).

  • 指定された点で微分を評価します 微分は線形なので、これは線形です。fx: L[f]=f(x).

  • 指定された点で2次導関数を評価しますfx: L[f]=f(x).


さて、このアプローチはどれくらいうまく機能しますか? いつものように、値と観測値を比較して残差を調べます。位置、速度、加速度はすべて異なる単位であるため、別々の軸にプロットする必要があります。y^iyiy^i

図

一番上の行は、曲線を使用してとその最初の2つの導関数をグラフ化します。関連するデータポイントが曲線上にプロットされます。左側の観測値、中央の観測導関数、右側の観測された2次導関数。y^

下の行は、対応する残差をプロットします。いつものように、かなりの関係の欠如を探しています:残差値(それらのy座標)が左から右にランダムに変化し、独立性を示し、傾向がないことを願っています。

のデータ値が正確に(使用して17に乱数シードを設定した後、問題のように生成された再現性のため)。関数によって生成されたBスプラインスペース使用して、次の1から6までの問題についても調査しました。この図は、2次の結果を示しています。 6つの(ネストされた)モデルすべてのANOVAで示されたモデルと同様に、低い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これらの計算を実行するためのコードはかなり一般的です。 特に、使用するスプラインのタイプに依存しないように、数値微分を使用して導関数を見つけます。これは、観測値を比例して重み付けすることにより、異なる値を処理します 一連のモデルを自動的に構築し、ループに収めます。線形汎関数および標準偏差はハードコードされています。それぞれ3つあり、データセット内の変数の値に応じて選択されます。σ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の機能については知りません。長い答えは...はるかに複雑です。導関数と関数値が同じ場所でサンプリングされないという事実により、これはより困難になります。また、区間の右端付近に関数値がないという事実により、それが不可能になる場合があります。

キュービックスプラインから始めましょう。点および対応する2次導関数すると、それらを通過する3次スプラインは次のようになります。バツjyjzj

Sjバツ=Ayj+Byj+1+Czj+Dzj+1
ここで、 これは確認する非常に簡単だということ、、および。これにより、スプラインとその2次導関数が連続的であることが保証されます。ただし、この時点では、連続的な1次導関数はありません。一次導関数を強制的に連続させるには、次の制約が必要です。
hj=バツj+1バツjA=バツj+1バツhjB=1AC=16A3Ahj2D=16B3Bhj2
Sjバツj=yjSjバツj+1=yj+1Sjバツj=zjSjバツj+1=zj+1
(1)6hj1yj16hj1+6hjyj+6hjyj+1=hj1zj1+2hj1+hjzj+hjzj+1
従来の3次スプライン設定では、ポイントと仮定し方程式(2つの追加の境界制約とともにを使用してます。あなたが知ったら、スプラインが完全に指定され、あなたが任意の時点で補間するために使用することができます。追加のボーナスとして、方程式は線形時間で解くことができる三重対角行列になります!バツjyj(1)zjzj(1)

OK、今、を知る代わりに、を知っているとます。方程式を使用してを解くことがますか?純粋な代数の観点から、それは実行可能と思われます。あり方程式と未知数ので、...なぜ?しかし、それはできません。行列は特異です。そして、それは驚くことではありません。二次導関数を与えられた関数値をどのように補間できますか?少なくとも、微分方程式のように、初期値が必要です。yjzj(1)yjNN

あなたの状況はどうですか?一部のポイントには関数値があり、一部のポイントには導関数があります。とりあえず、最初の導関数を無視しましょう(これらは3次スプラインベースで扱うのは一種の混乱です)。正式には、を関数値を持つ点の集合とし、を二次導関数を持つ点の集合とします。未知数を持つ方程式がまだあります。いくつかの未知数はあり、いくつかはです。0、1、または2 ANDまたは場合、解が得られることがわかりますバツy(xj,zj),jJNNyjzjIN3,N2N1I。つまり、最初の3つのポイントの1つは関数値であり、最後の3つのポイントの1つは関数値でなければなりません。その制約以外に、必要な数の派生物を自由に投入できます。

それらの一次導関数はどうですか?スプラインに一次導関数を含めることは確かに可能です。しかし、私が言ったように、それはかなり厄介になります。スプラインの1次導関数は、 もちろん、ノットの微分にのみ本当に興味があるので、評価することでこれを少し単純化できます: これらを追加できます方程式から得られる行列の制約

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)結果のスプラインには、指定された1次導関数が含まれます。さらに、これは特異行列の問題にも役立ちます。最初の3点と最後の3点に関数値または1次導関数がある場合、解決策が得られます。

だから私はそれをいくつかのコードにまとめて、ここに私が得た写真があります:

スプラインが恐ろしく間違ってしまった

ご覧のとおり、結果はあまり良くありません。これは、これがすべてのデータを尊重する必要がある通常のスプラインであるためです。データは確率的であるため、実際には回帰スプラインを使用する必要があります。それは別の投稿のトピックです。しかし、数学を学習すると、線形等式制約の影響を受ける二次目的関数を最適化することになります-そして、閉形式の解決策があります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.