R Pracma晶须平滑的反函数?

时间:2018-09-12 11:08:46

标签: r math smoothing

我正在使用Pracma的whittaker函数here

whittaker <- function(y, lambda = 1600, d = 2){
    #   Smoothing with a finite difference penalty
    #   y:      signal to be smoothed
    #   lambda: smoothing parameter (rough 50..1e4 smooth)
    #   d:      order of differences in penalty (generally 2)

    m <- length(y)
    E <- eye(m)
    D <- diff(E, lag = 1, differences = d)
    B <- E + (lambda * t(D) %*% D)
    z <- solve(B, y)

    return(z)
}

我需要找到惠特克平滑的反函数,  是否存在逆惠特克平滑算法?甚至近似也可能有用。

初步尝试

y = B*z            //solve(B,z)
z = B^{-1} y       // *B
y = B*z

所以我必须找出B

E <- eye(length(y))
D <- diff(E, lag = 1 , differences 2)
B <- E + (lambda * t(D) %*% D)

如此

y<- B * z

我了解到,平滑处理是无损的(变换中不会丢失任何信息),因此逆运算应包含与初始数据相同的信息。


如所示,似乎不可能创建Whittaker平滑的逆函数,但我希望R中已经存在这样的函数。

R中是否存在惠特克平滑的逆函数?

1 个答案:

答案 0 :(得分:1)

看来您绝对正确,而Whittaker平滑则相反(可能在端点处除外)。假设参数lambdad相同,并且您处在正确的轨道上,那么恢复平滑过程确实非常容易。

library(pracma)
inv_whittaker <- function(z, lambda = 1600, d = 2) {
    m = length(z); E = eye(m)
    D = diff(E, lag = 1, differences = d)
    B = E + (lambda * t(D) %*% D)
    y = B %*% z
    return(y)
}

让我们将其应用到帮助页面上的示例中,首先是一个“正弦”正弦函数。

xx = linspace(0, 10*pi, 1000)
t1 = sin(xx) + rnorm(1000)/10
t3 = whittaker(t1, lambda = 1600)

现在,我们尝试从t1收回t3

t2 = inv_whittaker(t3, lambda = 1600)
max(abs(t1-t2))
## [1] 3.527845e-12

我发现这很令人惊讶,我不确定它是否适用于所有拐角情况和端点,例如当您为t1取正弦曲线时。