【问题标题】:Low-pass fltering of a matrix矩阵的低通滤波
【发布时间】:2020-01-19 13:50:56
【问题描述】:

我正在尝试在 R 中编写一个低通滤波器,以清理“脏”数据矩阵。

我做了一个谷歌搜索,想出了一系列令人眼花缭乱的软件包。有些适用于一维信号(主要是时间序列,例如How do I run a high pass or low pass filter on data points in R?);有些适用于图像。但是我正在尝试过滤一个普通的 R 数据矩阵。图像过滤器是最接近的等价物,但我有点不愿意这样做,因为它们通常涉及(i)安装或多或少复杂/繁重的解决方案(imageMagick ...),和/或(ii)从矩阵到图像。

这里是示例数据:

r<-seq(0:360)/360*(2*pi)
x<-cos(r)
y<-sin(r)

z<-outer(x,y,"*")
noise<-0.3*matrix(runif(length(x)*length(y)),nrow=length(x))

zz<-z+noise

image(zz)

我正在寻找的是一个过滤器,它将返回一个“清理过的”矩阵(在这种情况下,即接近 z 的东西)。

我知道这是一个相当开放的问题,我也很满意指针(“你看过某某软件包吗”),尽管我当然会重视用户的示例代码有信号处理经验!

谢谢。

【问题讨论】:

  • 这实际上是我发现的东西之一(--> 编辑)。据我了解,signal 包仅适用于 1D,还是我错过了什么?
  • @jmoyen 你总是可以apply 函数到 R 中的向量,请参阅下面的答案,将多项式回归拟合到每个向量
  • 技术上正确,但我不确定应用于每行/列的一系列 1D 过滤器是否与 2D 过滤器相同。例如,如果您按行过滤,则应用到所有行的一维过滤器不会过滤掉异常高值的行。另一方面,由于它是高频特征(在另一个方向上),它会被适当的低通过滤掉,对总“距离”进行操作。
  • 是的,你是对的,同样的问题适用于下面的解决方案,我没有注意到......

标签: r


【解决方案1】:

一种选择可能是使用非线性预测方法并从模型中获取拟合值。

例如,通过使用多项式回归,我们可以将原始数据预测为紫色,

通过遵循相同的逻辑,您可以对zz 矩阵的所有列执行相同的操作,

predictions <- matrix(, nrow = 361, ncol = 0)

for(i in 1:ncol(zz)) {

    pred <- as.matrix(fitted(lm(zz[,i]~poly(1:nrow(zz),2,raw=TRUE))))
    predictions <- cbind(predictions,pred)  

} 

然后你可以绘制预测,

par(mfrow=c(1,3))

image(z,main="Original")
image(zz,main="Noisy")
image(predictions,main="Predicted")

请注意,我使用了 2 次多项式回归,您可以更改次数以更好地拟合列。或者,您可以使用其他一些强大的非线性预测方法(可能是 SVM、ANN 等)来获得更准确的模型。

【讨论】:

  • 一点也不差!我最初正在寻找一个“合适的”低通滤波器,似乎更合适,但如果没有别的,这是一个很好的代理......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2014-07-29
  • 2011-05-29
  • 2019-06-04
  • 2019-04-29
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多