我正在使用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中是否存在惠特克平滑的逆函数?
答案 0 :(得分:1)
看来您绝对正确,而Whittaker平滑则相反(可能在端点处除外)。假设参数lambda
和d
相同,并且您处在正确的轨道上,那么恢复平滑过程确实非常容易。
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
取正弦曲线时。