Değerleri ve 1. / 2. türevleri içeren verilere bir eğri çizgiyi nasıl sığdırabilirim?


14

Diyelim ki, konum, hız ve ivme için bazı ölçümler içeren bir veri kümem var. Hepsi aynı "koşu" dan geliyor. Doğrusal bir sistem kurabilirim ve tüm bu ölçümlere bir polinom sığdırabilirim.

Ama aynısını spline ile yapabilir miyim? Bunu yapmanın 'R' yolu nedir?

İşte sığdırmak istediğim bazı simüle veriler:

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?

resim açıklamasını buraya girin


Sorunuzun cevabını bilmiyorum, ancak splinefuntürevleri hesaplayabilir ve muhtemelen bazı ters yöntemleri kullanarak verileri sığdırmak için bir başlangıç ​​noktası olarak kullanabilirsiniz? Bunun çözümünü öğrenmek istiyorum.
David LeBauer

1
Bu problem Maurice Cox tarafından 1972 tarihli makalesinde çözüldü. R'nin bunu destekleyip desteklemediğini bilmiyorum, ancak arama terimi "Hermite spline".
user14717

@DavidLeBauer şu anda yaptığım şey bu. Spline ve türevleri verilere yakın olacak şekilde bir dizi noktaya uyan bir optimizasyon problemini resmileştirdim. Ancak daha doğrudan bir yöntem harika olurdu.
dani

3
Oldukça standart bir yaklaşım Kalman filtrelemesidir. (Ölçülemez) durumu kesin türevleri içerir ve gözlemler bunların gürültülü versiyonlarıdır. Örneğin, bir kübik spline modeli kabaca ikinci dereceden türevin (sürekli zaman) beyaz bir gürültü olduğunu söyler, ancak daha yüksek dereceli bir model de kullanılabilir. Geçerli gözlem için türetme sırasına bağlı olarak ölçüm gürültüsünü açıklamanız gerekecektir. İlk yaklaşımda üç gürültü varyasyonu (tahmin edilecek) yeterli olabilir.
Yves

2
türevler üzerinde ölçüm hatası nedir? pozisyondan çok daha yüksek mi? aynı zamanda planınızda neden öyle değil? x ekseni nedir?
Aksakal

Yanıtlar:


9

Bir spline'ın bir Durum-Uzay Modeli (SSM) ile ilişkili olarak Kalman Filtreleme (KF) teknikleri ile nasıl kullanılabileceğini açıklayacağız. Bazı spline modellerinin SSM ile temsil edilebileceği ve KF ile hesaplanabileceği gerçeği, 1980-1990 yıllarında CF Ansley ve R. Kohn tarafından ortaya çıkarıldı. Tahmini işlev ve türevleri devletin gözlemlere bağlı beklentileridir. Bu tahminler, bir SSM kullanırken sabit bir aralık düzeltme , rutin bir görev kullanılarak hesaplanır .

Basitlik uğruna, gözlem zamanlarda hazır olduğunu varsayalım t1<t2<<tn ve gözlem sayısı, bu k de tk bünyesinde barındıran bir sipariş ile türevi dk olarak {0,1,2} . Modelin gözlem kısmı, yazılır

(O1)y(tk)=f[dk](tk)+ε(tk)
; buradaf(t) , gözlemlenmeyengerçekişlevibelirtirveε(tk) , bir Gauss hatasıdır.türetme sırasına bağlı olarakvaryansH(tk)dk. (Sürekli zaman) geçiş denklemi burada gözlemlenmemiş durum vektörü ve kovaryanslı bir Gauss beyaz gürültüsü , r.vs gözlem gürültüsünden bağımsız olduğu varsayılmıştır . Bir spline'ı tanımlamak için, ilk türevlerini istifleyerek elde edilen bir durumu , yani . Geçiş
(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)]
2m2m-1m=2>1 y ( t k ) ve daha sonra sipariş (ve derece ) olan bir polinom spline elde ederiz . her zamanki kübik spline'a karşılık gelirken ,2m2m1m=2>1. Klasik bir SSM formalizmine bağlı kalmak için (O1) gözlem matris burada uygun türevini alır ve varyans arasında bağlı olarak seçilir . Yani burada , ve . Benzer şekilde
(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üç varyasyon için , ve . H1H2H3

Geçiş sürekli bir zamanda olmasına rağmen, KF aslında standart bir ayrık zamandadır . Nitekim, edeceğiz kez üzerinde uygulama odakta biz bir gözlem var ya nerede türevleri tahmin etmek istiyorum. Biz set alabilir kez bu iki takım birlikteliğini olmalı ve en gözlem varsaymak eksik olabilir: Bu tahmin sağlayan her zaman en türevleri bakılmaksızın bir gözlem varlığından. Ayrık SSM'yi türetmek için kalıntılar vardır.t{tk}tkmtk

Endeksleri ayrık zamanlarda kullanacağız, için . Ayrık zamanlı SSM burada matrisler ve (T1) elde edilir ve (O2) varyans ise ile verilir , olmasıαkα(tk)

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=Var(ηk)εkHk=Hdk+1ykeksik değil. Bazı cebirleri kullanarak ayrık zamanlı SSM için . Benzer şekilde, ayrık zamanlı SSM için kovaryans matrisi şu şekilde verilebilir:
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
burada ve indeksleri ile arasındadır .ij1m

Şimdi R'deki hesaplamayı taşımak için KF'ye adanmış ve zamanla değişen modelleri kabul eden bir pakete ihtiyacımız var; CRAN paketi KFAS iyi bir seçenek gibi görünüyor. Bu matrisler hesaplamak için R fonksiyonlar yazabilir ve kere vektörden SSM (DT) kodlamak için. Paket tarafından kullanılan notasyonlarda, bir matrix , (DT) 'nin geçiş denklemindeki gürültüsünü çoğaltmak için gelir : bunu . Ayrıca burada yaygın bir başlangıç ​​kovaryansının kullanılması gerektiğini unutmayın.TkQktkRkηkIm

DÜZENLEME The'in başlangıçta yazılı olarak yanlıştı. Sabit (R kodu ve görüntüsünde de).Q

CF Ansley ve R. Kohn (1986) "Spline Düzgünleştirmede İki Stokastik Yaklaşımın Denkliği Üzerine" J. Appl. Probab. , 23, s.391-405

R. Kohn ve CF Ansley (1987) "Stokastik Bir Süreci Yumuşatmaya Dayalı Spline Yumuşatma için Yeni Bir Algoritma" SIAM J. Sci. ve Stat. Comput. , 8 (1), s.33-48

Helske (2017). "KFAS: R'de Üstel Aile Hali Uzay Modelleri" J. Stat. Yumuşak. , 78 (10), s. 1-39

türevlerle düzeltme

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)
}

Cevabınız için teşekkür ederim. Bununla çok ilgileniyorum. Şu anda, değerinin fve türevinin belli bir düzeyde kullanılmasına izin vermiyorsunuz t. Tüm bilgileri kullanmak nasıl mümkün olabilir? Yine, cevabınız için merci.
dani

Benim okumam, T1'in altındaki her şeyin aynı çıkarım prosedüründe birden fazla türev kullanmakla ilgili olduğudur. Yves yine de onaylayabilir.
eric_kernfeld

Gerçekten de, bir için say türevlerini : gözlemi bir vektördür ve istenen türevleri satırlarına sahiptir . Ortak bir KFAS ile çalıştığından eminim , ancak NA'ları kullanarak da değişen bir zamana sahip olmak mümkün olabilir . ok>1tkykZkoko>1o
Yves

@Yves seni doğru anladıysam yapın: Ben t_k içinde noktasında birinci ve ikinci türevi varsa, o Z_k şöyle görünür: matrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T). Yani, genel olarak 'en yüksek türev' * boyutunun bir küpü olacaktır '* spline derecesi' * 'zaman adımlarının sayısı'
dani

Evet @dani, neredeyse: tüm matrisleri için satır sayısı yani örnekteki . Bu en yüksek türev sırası artı bir. Ayrıca, spline derecesi değil . Örneğinizde, sırasının (işlevin kendisi) türevini gözlemlemediğiniz için , gözlemlerde ayarlanması gerekir ve ilk satırı da bırakabilirsiniz. Ancak, bu özel durumda sorunun kötü durumda olduğundan şüpheleniyorum SSM gözlemlenebilir olmayabilir . Zkmaxk{dk+1}32m1m0NA
Yves

5

Her bir türev için yapılan rastgele hataların göreli boyutları hakkında makul bir fikriniz olması koşuluyla , standart en küçük kareler rutini ile muhteşem bir şekilde yapabilirsiniz . Her değeri için yaptığınız ölçüm sayısında bir kısıtlama yoktur - her birinde farklı türevleri aynı anda ölçebilirsiniz. En Küçük Kareler (OLS) kullanımındaki tek sınırlama olağandır: ölçümlerin bağımsız olduğunu varsayarsınız.x

Temel fikir, problemin soyutlanmasıyla en açık şekilde ifade edilebilir. İşletme modeli bir dizi kullanan fonksiyonları değerleri tahmin etmek için bir temel olarak (örneğin, bir eğri esas) bilinmeyen bir işlevin noktasında Eğer aramak Bu demektir katsayıların tahmin edilmesi için olan doğrusal kombinasyonlar her biri için kabul edilebilir yaklaşır Buna lineer kombinasyonların (vektör) boşluğu diyelimpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F.

Bu sorunla ilgili özel olan, mutlaka gözlemlememenizdiryi. Bunun yerine, verilerle ilişkilendirilmiş tanımlanmış bir doğrusal fonksiyonel kümesi . Bir işlevin " bir işlevin işlevi " olduğunu hatırlayın : her işlevlerine herhangi bir sayı atar .LiLiLi[f]fF.

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

burada işlevselleri verilir, olan bilinen ölçek faktörleri ve bağımsız ve aynı rastgele değişkenler dağıtılır.Liσi>0εi

İki ek varsayım OLS'u uygulanabilir ve istatistiksel olarak anlamlı kılar:

  1. ortak dağılımı sonlu bir varyansa sahiptir.εi

  2. Her a, doğrusal olarak işler. Bir fonksiyonel olduğu zaman herhangi bir öğe için doğrusal ve sayıları karşılık gelenLiLfjFαj,

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

(2) modelin daha açık bir şekilde ifade edilmesine izin verir.(1)

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

Bu azalmanın bütün mesele mi diyeceksiniz fonksiyonelleri öngörülen çünkü tüm baz fonksiyonları ve standart sapmalar değerler hepsi numaralar - -Bu sadece bir regresyon probleminin olağan "değişkenleri" veya "özellikleri" dir ve sadece (göreceli) ağırlıklardır. Bu nedenle, Gauss-Markov Teoreminin optimal anlamda, OLS kullanmak için harika bir prosedürdür.Li,fj,σi,Li[fj]σi

Soruda yer alan işlevler şunlardır:

  • Değerlendirmede belirli bir noktasında Genellikle bunu yaparız. Bu doğrusaldır, çünkü tanım gereği fonksiyonların doğrusal kombinasyonları noktasal olarak değerlendirilir.fx: L[f]=f(x).

  • türevini belirtilen bir noktada Bu doğrusaldır, çünkü farklılaşma doğrusaldır.fx: L[f]=f(x).

  • İkinci türev 'i belirtilen bir noktada değerlendirinfx: L[f]=f(x).


Tamam, bu yaklaşım ne kadar iyi çalışıyor? Her zaman olduğu gibi, değerlerini, takılan değerleri ile gözlemlenen değerlerle karşılaştırarak inceleyeceğiz. Pozisyonlar, hızlar ve ivme değerleri farklı birimlerde bulunduğundan, ayrı eksenlerde çizilmeleri gerekir.y^iyiy^i

şekil

En üstteki satır ve ilk iki türevini çizmek için eğriler kullanır . İlgili veri noktaları eğriler üzerine çizilir: solda gözlenen değerler, ortada gözlenen türevler ve sağda gözlenen ikinci türevler.y^

Alt sıra ilgili kalıntıları çizer. Her zamanki gibi, kayda değer bir ilişki eksikliği arıyoruz: umuyoruz artık değerler (y koordinatları) soldan sağa rastgele bağımsızlık gösterir ve bağımsızlık göstermez.

veri değerleri (kullanarak 17'ye rasgele sayı tohum ayarlandıktan sonra tam olarak söz konusu olduğu gibi oluşturulan yeniden üretilebilirlik için). 1 ile 6 derece arasında, aynı sorudaki gibi , fonksiyon tarafından üretilen B-spline uzayları kullanarak da düşük bir AIC ve iyi rezidüel davranışın yanı sıra altı (iç içe) modelin hepsinde bir ANOVA ile gösterilen modeli sergilemektedir.n=23set.seed(17)FRbs

Uygun

y^=27.48993+2.54078f1+2.97679f2

burada ve , tarafından oluşturulan B-spline temel işlevleridir .f1f2bs

Kalanlar iyi davranırlar. Uyumlar iyi. Dahası, bu yaklaşım doğru modeli buldu : veriler gerçekten ikinci dereceden bir fonksiyondan elde edildi (derece 2). Ayrıca, artıkların standart sapmaları doğru boyutlardadır: orijinal hataları oluşturmak için kullanılan 0.1, 0.3 ve 0.6'ya kıyasla 0.11, 0.20 ve 0.61. Bu eğrilerin gözlemleri ( ötesine geçmeyen) açıkça tahmin etmesi ve böyle küçük bir veri seti ( ) kullanması göz önüne alındığında oldukça şaşırtıcıdır .x=5n=23

Son olarak, yüksek dereceli kamalar için uygun olan kalıntılar niteliksel olarak aynıdır; daha az mantıklı modeller kullanma maliyetiyle sadece küçük iyileştirmeler yaparlar. Yeterince yüksek derecelerde, örneğin gözlenen değerler arasında küçük değerleri için çılgınca salınmaya başlarlar . Bu (kötü) davranışı göstermek için, derece-9 uyumu:x

şekil 2

Son olarak, temelin çeşitli doğrusal fonksiyonellerinin çoklu gözlemlerinin yapıldığı bir örnek. Bu gözlemleri oluşturma kodu sorudakinden değiştirildi

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

Figür 3


RBu hesapları taşımak için kod oldukça geneldir. Özellikle, türevleri bulmak için sayısal farklılaşmayı kullanır, böylece kullanılan spline tipine bağlı değildir. Gözlemleri orantılı olarak ağırlıklandırarak farklı değerlerini işler Otomatik olarak bir döngü içinde bir dizi model oluşturur ve uyar. ve standart sapmalar doğrusal işlevleri sabit olarak kodlanmıştır. Veri kümesindeki değişkenin değerine göre seçilen her biri üç tane vardır .σi1/σi2.Liσitype

Uyumları nasıl kullanabileceğinize ilişkin örnekler olarak, koda özetleri, AIC'lerinin bir listesini ve hepsinin bir ANOVA'sını yazdırır.

#
# 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

Her şeyden önce, bu soruyu sorduğunuz için teşekkür etmek istiyorum. Gerçekten ilginç bir soru. Spline'ları ve onlarla yapabileceğiniz havalı şeyleri seviyorum. Ve bu bana biraz araştırma yapmak için bir bahane verdi. :-)

BLUF: Kısa cevap hayır. R'de bunu sizin için otomatik olarak yapacak herhangi bir işlev bilmiyorum. Uzun cevap ... çok daha karmaşık. Türevlerin ve fonksiyon değerlerinin aynı yerde örneklenmemiş olması bunu zorlaştırmaktadır. Ve aralığın sağ ucuna yakın bir fonksiyon değerinizin olmaması bunu imkansız hale getirebilir.

Kübik spline ile başlayalım. Noktalar ve karşılık gelen ikinci türevler , içinden geçen kübik spline:(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
burada doğrulama işlemi oldukça basit olduğunu , , ve . Bu spline ve ikinci türevinin sürekli olmasını garanti eder . Ancak bu noktada sürekli bir ilk türevimiz yok. İlk türevi sürekli olmaya zorlamak için aşağıdaki kısıtlamaya ihtiyacımız var:
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
Klasik kübik spline kurulumunda, noktalara sahip olduğunuzu için çözmek için denklemini (iki ek sınırlama kısıtlamasıyla birlikte) . Öğrendikten sonra , spline tamamen belirtilir ve herhangi bir keyfi noktada interpolate için kullanabilirsiniz. Ek bir bonus olarak, denklem doğrusal zamanda çözülebilen üçgen bir matrise dönüşür!(xj,yj)(1)zjzj(1)

Tamam, şimdi yerine bilmenin, varsayalım , bilirsin . için çözmek için denklemini kullanabilir ? Saf bir cebir açısından mümkün görünmektedir. Orada denklemleri ve bilinmeyenler yani ... neden olmasın? Ama ortaya çıkamayacağınız ortaya çıkıyor; matris tekil olacaktır. Ve bu hiç de şaşırtıcı değil. SADECE ikinci türevlere verilen fonksiyon değerlerini nasıl enterpolasyon edebilirsiniz? En azından, bir diferansiyel denklem gibi bir başlangıç ​​değerine ihtiyacınız olacaktır.yjzj(1)yjNN

Durumunuz ne olacak? Puanlarınızın bazılarının fonksiyon değerleri, bazı noktalarınızın türevleri vardır. Şimdilik, ilk türevleri görmezden gelelim (kübik spline temelinde uğraşmak biraz karışıktır). Resmi olarak, işlev değerlerine sahip noktalar kümesi ve ikinci türevlere sahip noktalar kümesi olsun. bilinmeyenli hala denklemimiz var . Sadece bilinmeyenlerin bazıları ve bazıları . Bu bir çözüm olacağına çıkarsa 0, 1 veya 2 VE veya(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I. Başka bir deyişle, ilk üç noktadan biri bir işlev değeri ve son üç noktadan biri bir işlev değeri olmalıdır. Bu kısıtlama dışında, istediğiniz kadar türev atabilirsiniz.

İlk türevlere ne dersiniz? Spline'a ilk türevleri dahil etmek kesinlikle mümkündür. Ama dediğim gibi, çok daha karışık oluyor. Spline'ın ilk türevi şu şekilde verilir: Tabii ki, sadece düğümlerdeki türevle gerçekten ilgileniyoruz, bu yüzden bunu : değerlendirerek biraz basitleştirebiliriz. Bunları ekleyebilirsiniz denkleminden aldığınız matrisle ilgili kısıtlamalar

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)ve sonuçtaki spline belirtilen birinci türevlere sahip olacaktır. Ek olarak, bu tekil matris problemine yardımcı olacaktır. İlk üç ve son üç noktada EITHER fonksiyon değerine veya ilk türeve sahipseniz bir çözüm elde edersiniz.

Bu yüzden hepsini bir kodda bir araya getirdim ve işte aldığım resim:

Spline korkunç yanlış gitti

Gördüğünüz gibi sonuçlar harika değil. Çünkü bu TÜM verilerin onurlandırılması gereken düzenli bir spline. Veriler stokastik olduğu için gerçekten bir regresyon spline kullanmamız gerekiyor. Bu başka bir gönderinin konusu. Ancak matematikte çalışırsanız, doğrusal eşitlik kısıtlamalarına tabi olan ikinci dereceden bir objektif işlevi optimize edeceksiniz - ve kapalı bir form çözümü var!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.