首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >过滤函数的简单示例,特别是递归选项

过滤函数的简单示例,特别是递归选项
EN

Stack Overflow用户
提问于 2013-01-17 13:45:40
回答 3查看 23.4K关注 0票数 27

我正在为R中的filter函数寻找一些简单的(即,没有数学符号,冗长的可重现代码)示例。我想我对卷积方法很熟悉,但却卡在了递归选项的泛化上。我已经阅读了各种文档,但这些帮助对我来说有点不透明。

以下是我到目前为止想出的例子:

代码语言:javascript
复制
# Set some values for filter components
f1 <- 1; f2 <- 1; f3 <- 1;

接下来我们继续:

代码语言:javascript
复制
# basic convolution filter
filter(1:5,f1,method="convolution")
[1] 1 2 3 4 5

#equivalent to:
x[1] * f1 
x[2] * f1 
x[3] * f1 
x[4] * f1 
x[5] * f1 

# convolution with 2 coefficients in filter
filter(1:5,c(f1,f2),method="convolution")
[1]  3  5  7  9 NA

#equivalent to:
x[1] * f2 + x[2] * f1
x[2] * f2 + x[3] * f1
x[3] * f2 + x[4] * f1 
x[4] * f2 + x[5] * f1 
x[5] * f2 + x[6] * f1

# convolution with 3 coefficients in filter
filter(1:5,c(f1,f2,f3),method="convolution")
[1] NA  6  9 12 NA

#equivalent to:
 NA  * f3 + x[1] * f2 + x[2] * f1  #x[0] = doesn't exist/NA
x[1] * f3 + x[2] * f2 + x[3] * f1
x[2] * f3 + x[3] * f2 + x[4] * f1 
x[3] * f3 + x[4] * f2 + x[5] * f1 
x[4] * f3 + x[5] * f2 + x[6] * f1

现在是我伤害我可怜的小脑干的时候了。在这篇文章中,我设法使用info找出了最基本的例子:https://stackoverflow.com/a/11552765/496803

代码语言:javascript
复制
filter(1:5, f1, method="recursive")
[1]  1  3  6 10 15

#equivalent to:

x[1]
x[2] + f1*x[1]
x[3] + f1*x[2] + f1^2*x[1]
x[4] + f1*x[3] + f1^2*x[2] + f1^3*x[1]
x[5] + f1*x[4] + f1^2*x[3] + f1^3*x[2] + f1^4*x[1]

有没有人可以提供类似于我上面关于filter = c(f1,f2)filter = c(f1,f2,f3)的递归版本的卷积示例的代码

答案应该与函数的结果相匹配:

代码语言:javascript
复制
filter(1:5, c(f1,f2), method="recursive")
[1]  1  3  7 14 26

filter(1:5, c(f1,f2,f3), method="recursive")
[1]  1  3  7 15 30

编辑

要最终使用@agstudy的简洁答案:

代码语言:javascript
复制
> filter(1:5, f1, method="recursive")
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1  3  6 10 15
> y1 <- x[1]                                            
> y2 <- x[2] + f1*y1      
> y3 <- x[3] + f1*y2 
> y4 <- x[4] + f1*y3 
> y5 <- x[5] + f1*y4 
> c(y1,y2,y3,y4,y5)
[1]  1  3  6 10 15

还有..。

代码语言:javascript
复制
> filter(1:5, c(f1,f2), method="recursive")
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1  3  7 14 26
> y1 <- x[1]                                            
> y2 <- x[2] + f1*y1      
> y3 <- x[3] + f1*y2 + f2*y1
> y4 <- x[4] + f1*y3 + f2*y2
> y5 <- x[5] + f1*y4 + f2*y3
> c(y1,y2,y3,y4,y5)
[1]  1  3  7 14 26

还有..。

代码语言:javascript
复制
> filter(1:5, c(f1,f2,f3), method="recursive")
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1  3  7 15 30
> y1 <- x[1]                                            
> y2 <- x[2] + f1*y1      
> y3 <- x[3] + f1*y2 + f2*y1
> y4 <- x[4] + f1*y3 + f2*y2 + f3*y1
> y5 <- x[5] + f1*y4 + f2*y3 + f3*y2
> c(y1,y2,y3,y4,y5)
[1]  1  3  7 15 30
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-17 14:44:06

在递归的情况下,我认为没有必要根据xi展开表达式。“递归”的关键是用前面的y来表达右边的表达式。

我更喜欢从过滤器大小的角度来思考。

过滤器大小=1

代码语言:javascript
复制
y1 <- x1                                            
y2 <- x2 + f1*y1      
y3 <- x3 + f1*y2 
y4 <- x4 + f1*y3 
y5 <- x5 + f1*y4 

过滤器大小=2

代码语言:javascript
复制
y1 <- x1                                            
y2 <- x2 + f1*y1      
y3 <- x3 + f1*y2 + f2*y1    # apply the filter for the past value and add current input
y4 <- x4 + f1*y3 + f2*y2
y5 <- x5 + f1*y4 + f2*y3
票数 23
EN

Stack Overflow用户

发布于 2013-01-17 13:58:45

下面是我发现的最有助于可视化递归过滤真正作用的示例:

代码语言:javascript
复制
(x <- rep(1, 10))
# [1] 1 1 1 1 1 1 1 1 1 1

as.vector(filter(x, c(1), method="recursive"))  ## Equivalent to cumsum()
#  [1]  1  2  3  4  5  6  7  8  9 10
as.vector(filter(x, c(0,1), method="recursive"))
#  [1] 1 1 2 2 3 3 4 4 5 5
as.vector(filter(x, c(0,0,1), method="recursive"))
#  [1] 1 1 1 2 2 2 3 3 3 4
as.vector(filter(x, c(0,0,0,1), method="recursive"))
#  [1] 1 1 1 1 2 2 2 2 3 3
as.vector(filter(x, c(0,0,0,0,1), method="recursive"))
#  [1] 1 1 1 1 1 2 2 2 2 2
票数 3
EN

Stack Overflow用户

发布于 2013-01-17 14:28:50

对于递归,您的“过滤器”序列是该序列的先前总和或输出值的相加系数。对于filter=c(1,1),您说的是“取序列x中的第i个分量,将前一步结果的1倍和前一步结果的1倍相加”。这里有几个例子来说明

我认为滞后效果符号如下所示:

代码语言:javascript
复制
## only one filter, so autoregressive cumsum only looks "one sequence behind"
> filter(1:5, c(2), method='recursive')
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1  4 11 26 57

1 = 1
2*1 + 2 = 4
2*(2*1 + 2) + 3 = 11
...

## filter with lag in it, looks two sequences back
> filter(1:5, c(0, 2), method='recursive')
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1]  1  2  5  8 15

1= 1
0*1 + 2 = 2
2*1 + 0*(0*1 + 2) + 3 = 5
2*(0*1 + 2) + 0 * (2*1 + 0*(0*1 + 2) + 3) + 4 = 8
2*(2*1 + 0*(0*1 + 2) + 3) + 0*(2*(0*1 + 2) + 0 * (2*1 + 0*(0*1 + 2) + 3) + 4) + 5 = 15

你看到那里的累积模式了吗?换句话说。

代码语言:javascript
复制
1 = 1
0*1 + 2 = 2
2*1 + 0*2 + 3 = 5
2*2 + 0*5 + 4 = 8
2*5 + 0*8 + 5 = 15
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14372880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档