3

我附上图片:( 来源:piccy.info替代文字

所以在这张图片中有一个函数的图表,它是在给定的点上定义的。例如在点 x=1..N 上。

另一个图,它被画成半透明曲线,这就是我想从原始图中得到的,即我想逼近原始函数,使其变得平滑。

有什么方法可以做到这一点吗?

我听说过最小二乘法,它可以用直线或抛物线函数来逼近一个函数。但我不需要用抛物线函数来近似。我可能需要用三角函数来近似它。那么有什么方法可以做到这一点吗?还有一个想法,如果我们可以为三角函数推断出最小二乘法,是否可以使用最小二乘法来解决这个问题?

还有一个问题!如果我使用离散傅里叶变换并将函数视为波的总和,那么可能噪声具有特殊的特征,我们可以通过它来定义它,然后我们可以将相应的频率设置为零,然后执行傅里叶逆变换。因此,如果您认为这是可能的,那么您可以提出什么建议来识别噪声频率?

4

5 回答 5

9

不幸的是,这里提出的许多解决方案都不能解决问题和/或它们是完全错误的。有许多方法,它们专门用于解决您必须注意的条件和要求!

a) 逼近理论:如果您有一个非常清晰且没有错误的定义函数(由定义或数据给出)并且您希望尽可能准确地跟踪它,您正在使用 Chebyshev 或 Legendre 多项式的多项式或有理逼近,这意味着您接近通过多项式函数,或者,如果是周期性的,则通过傅里叶级数。

b)插值:如果您有一个函数,其中给出了一些点(但不是整个曲线!)并且您需要一个函数来通过这些点,您可以使用几种方法:

Newton-Gregory、带分差的牛顿、拉格朗日、Hermite、样条曲线

c)曲线拟合:你有一个给定点的函数,你想用给定的(!)函数绘制一条曲线,尽可能接近曲线。这种情况有线性和非线性算法。

您的绘图暗示:

  • 它不像一个数学函数。
  • 它不是由数据或功能明确定义的
  • 您需要拟合曲线,而不是某些点。

你想要和需要的是

d) 平滑:给定具有噪声或快速变化元素的曲线或数据点,您只想查看随时间缓慢变化的情况。

您可以按照 Jacob 的建议使用 LOESS 来做到这一点(但我发现这有点过头了,特别是因为选择合理的跨度需要一些经验)。对于您的问题,我只是推荐 Jim C 建议的运行平均值。

http://en.wikipedia.org/wiki/Running_average

抱歉,cdonner 和 Orendorff,您的建议是明智的,但完全错误,因为您使用正确的工具来解决错误的解决方案。

这些家伙使用第六多项式来拟合气候数据并完全让自己感到尴尬。

http://scienceblogs.com/deltoid/2009/01/the_australians_war_on_science_32.php

http://network.nationalpost.com/np/blogs/fullcomment/archive/2008/10/20/lorne-gunter-thirty-years-of-warmer-temperatures-go-poof.aspx

于 2010-01-08T19:04:19.103 回答
3

R中使用黄土(免费)。

例如,这里的loess函数近似于嘈杂的正弦曲线。

正弦
(来源:stowers-institute.org

如您所见,您可以调整曲线的平滑度span

这是来自这里的一些示例 R 代码:

分步程序

让我们取一条正弦曲线,为其添加一些“噪声”,然后看看黄土“跨度”参数如何影响平滑曲线的外观。

  1. 创建一条正弦曲线并添加一些噪声:

    周期 <- 120 x <- 1:120 y <- sin(2*pi*x/周期) + runif(length(x),-1,1)

  2. 在这条嘈杂的正弦曲线上绘制点:

    plot(x,y, main="Sine Curve + 'Uniform' Noise") mtext("显示黄土平滑(局部回归平滑)")

  3. 使用默认跨度值 0.75 应用黄土平滑:

    y.loess <- loess(y ~ x, span=0.75, data.frame(x=x, y=y))

  4. 计算曲线上所有点的黄土平滑值:

    y.predict <- predict(y.loess, data.frame(x=x))

  5. 绘制黄土平滑曲线以及已经绘制的点:

    线(x,y.预测)

于 2010-01-07T15:32:46.340 回答
2

您可以使用数字滤波器,如 FIR 滤波器。最简单的 FIR 滤波器只是一个运行平均值。对于更复杂的处理,看起来像 FFT。

于 2010-01-07T14:43:55.113 回答
2

这称为曲线拟合。最好的方法是找到一个可以为你做这件事的数字库。这是一个显示如何使用 scipy 执行此操作的页面。该页面上的图片显示了代码的作用:

显示两个嘈杂数据集和两个最佳拟合正弦曲线的图表 http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png

现在只有4行代码,但作者根本没有解释。我将尝试在这里简要解释一下。

首先,你必须决定你想要的答案是什么形式。在这个例子中,作者想要一个形式的曲线

f(x) = p 0 cos (2π/ p 1 x + p 2 ) + p 3 x

您可能需要几条曲线的总和。没关系; 该公式是求解器的输入。

因此,该示例的目标是找到常数p 0p 3以完成公式。scipy 可以找到这个由四个常量组成的数组。您所需要的只是一个错误函数,scipy 可以使用它来查看其猜测与实际采样数据点的接近程度。

fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x # Target function
errfunc = lambda p: fitfunc(p, Tx) - tX # Distance to the target function

errfunc只接受一个参数:长度为 4 的数组。它将这些常数代入公式并计算候选曲线上的值数组,然后减去采样数据点数组 tX。结果是一个错误值数组;大概 scipy 将取这些值的平方和。

然后只需输入一些初始猜测并scipy.optimize.leastsq计算数字,试图找到一组参数p使误差最小化。

p0 = [-15., 0.8, 0., -1.] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:])

结果p1是一个包含四个常量的数组。success是 1、2、3 或 4,如果求解器实际找到了解决方案。(如果 errfunc 足够疯狂,求解器可能会失败。)

于 2010-01-07T14:47:20.083 回答
1

这看起来像一个多项式逼近。您可以在 Excel 中使用多项式(“添加趋势线”到图表中,选择多项式,然后将阶数增加到您需要的近似级别)。找到一个算法/代码应该不会太难。Excel 也可以显示它为近似值提出的方程。

于 2010-01-07T14:47:48.507 回答