【问题标题】:approximation methods近似方法
【发布时间】:2010-01-07 14:39:23
【问题描述】:

我附上图片:
(来源:piccy.info

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

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

有什么方法可以做到吗?

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

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

【问题讨论】:

  • 我不知道哪个更好用,正弦、余弦还是多项式。是的,我知道样条曲线,但我只将它们用于抛物线函数。我还没试过用三角函数逼近。
  • 其实我想二值化图像行。不使用任何像 Otsu、Bernsen 等的二值化方法——它们使用灰度图像数据和一些阈值进行二值化。
  • 还有一点要说 - 我想要一种快速的方法。时间很重要。
  • 恕我直言,这看起来像一个(很糟糕:(绘制了带有一些谐波的方波函数。所以,我会去谷歌看看如何确定 f. 系列的傅立叶系数。
  • 不,我不是说输出曲线必须有0和1的值。我想要一条平滑的曲线作为输出。在获得该平滑曲线后,我可以例如识别它的局部最小值和最大值,并为包含该曲线的图像线的每个像素计算局部阈值,该阈值必须是像素周围的一些局部最小值和最大值的平均值。

标签: math approximation


【解决方案1】:

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

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

【讨论】:

  • 出色、准确的回复!
  • 我会一步一步尝试每件事!现在我想尝试在图像线的每个像素处计算阈值。这将通过左极值和右极值的平均值计算。如果图像线不是平滑曲线,这是不好的。但是我对图像线条进行了平滑处理,使用了平滑过滤器,现在线条看起来是一条平滑的曲线,但是如果我们使用平滑过滤器后没有得到平滑的曲线怎么办?在这种情况下,只要我们提供一个好的图像线平滑算法,这个算法就会很好,我的意思是得到一个好的平滑线。
  • 如果我们得到源图像每个像素的亮度值,我们得到 Y(x)=aR(x)+bG(x)+c*B (x) 其中 a、b 和 c 可以不同地设置。然后,在我们对图像线使用平滑滤波器并计算图像线的所有极值之后 - 我们可以只取那些有差异的极值|L(x') - L(x'')| > epsilon,其中 epsilon 设置为某个较小的值。所以我们将忽略不重要的(嘈杂的)波浪变化。我是从一些算法中得到的,该算法也用于收缩阈值线,但我还没有检查它,我不知道这个算法是否总是能给出好的结果。
  • +1 在我的辩护中,问题是:“我可能需要用三角函数来近似它。那么有什么方法可以做到这一点吗?”但我认为你的回答是对的:曲线拟合并不是 maximus 真正需要的,即使这是他最初要求的......
【解决方案2】:

R 中使用loess(免费)。

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


(来源:stowers-institute.org

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

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

分步过程

让我们做一个正弦曲线,添加一些 给它“噪音”,然后看看 黄土“跨度”参数影响 平滑曲线的外观。

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

    周期

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

    plot(x,y, main="正弦曲线 + '均匀'噪声") mtext("显示 黄土平滑(局部回归 平滑)")

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

    y.loess

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

    y.predict

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

    线(x,y.predict)

【讨论】:

  • 必须满足什么条件才能说获得了想要的结果?我的意思是想要的曲线。如果图片在某些地方的颜色差异很小,那么与该图像位置对应的线条将被视为噪声。我想知道这些方法如何在手机上起作用。到目前为止,我找不到解决方案,尽管算法是已知的。如果我们有理想的条形码,那没关系,但如果它包含噪音,那么整个事情就浪费了。
【解决方案3】:

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

【讨论】:

  • 我会考虑的!谢谢!我认为它可能很复杂,但结果一定很好。
【解决方案4】:

这称为曲线拟合。最好的方法是找到一个可以为你做这件事的数字库。这是显示how to do this using scipy 的页面。该页面上的图片显示了代码的作用:

graph showing two noisy data sets and two best-fit sine curves http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png

现在只有4行代码,但作者根本没有解释。我将在此处尝试简要说明。

首先,您必须确定您希望答案的形式。在这个例子中,作者想要一个形式的曲线

f(x) = p0 cos (2π/p1 x em> + p2) + p3 x

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

因此,该示例的目标是找到常量 p0p3 到完成公式。 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 足够疯狂,求解器可能会失败。)

【讨论】:

  • 太棒了!谢谢!我也试试!
【解决方案5】:

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

【讨论】:

  • 我尝试了 6 阶的多项式逼近,结果不太好,可能我应该尝试增加阶数...
猜你喜欢
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多