我附图:
(来源:piccy.info)
因此,在此图像中,有一个函数图,它是在给定点上定义的。 例如,在点x = 1..N。
上另一张图,绘制为半透明曲线, 这就是我想从原始图中得到的, 即我想近似原始功能,使其变得平滑。
有没有办法做到这一点?
我听说过最小二乘法,可用于通过直线或抛物线函数逼近函数。但我不需要用抛物线函数来近似。 我可能需要通过三角函数来近似它。 那么有没有办法做到这一点? 还有一个想法,如果我们可以推导出三角函数,可以使用最小二乘法来解决这个问题吗?
还有一个问题! 如果我使用离散傅立叶变换并将函数视为波的总和,那么噪声可能具有我们可以定义它的特殊特征,然后我们可以将相应的频率设置为零,然后执行逆傅里叶变换。 因此,如果您认为有可能,那么您可以建议什么来识别噪声的频率?
答案 0 :(得分:8)
不幸的是,这里提出的许多解决方案都没有解决问题和/或它们是完全错误的。 有许多方法,它们专门用于解决您必须注意的条件和要求!
a)近似理论:如果你有一个非常清晰的定义函数而没有错误(由定义或数据给出)并且你想要尽可能准确地追踪它,你正在使用 Chebyshev或Legendre多项式的多项式或有理逼近,意味着你 通过多项式或者如果是周期性的傅里叶级数来处理函数。
b)插值:如果你有一个函数,其中给出了一些点(但不是整个曲线!)并且你需要一个函数来完成这些点,你可以使用几种方法:
牛顿 - 格雷戈里,牛顿,分歧差异,拉格朗日,埃尔米特,样条c)曲线拟合:您有一个具有给定点的函数,并且您希望绘制具有给定(!)函数的曲线,该曲线尽可能接近曲线。有线性的 和非线性算法。
您的图纸暗示:
你想要什么,需要什么
d)平滑:给定带有噪声或快速变化元素的曲线或数据点,您只希望看到随时间变化的缓慢变化。
你可以像雅各布所说的那样用黄土做到这一点(但我发现这有点过分,特别是因为 选择合理的跨度需要一些经验)。对于你的问题,我只是建议 Jim C建议的平均运行平均值。
http://en.wikipedia.org/wiki/Running_average
对不起,cdonner和Orendorff,你的建议很有道理,但完全错了,因为你正在使用正确的工具来解决错误的问题。
这些人使用第六个多项式来拟合气候数据并完全淹没自己。
http://scienceblogs.com/deltoid/2009/01/the_australians_war_on_science_32.php
答案 1 :(得分:3)
E.g。这里loess
函数近似于嘈杂的正弦曲线。
如您所见,您可以使用span
以下是here的一些示例R代码:
分步程序
让我们采取正弦曲线,添加一些 “噪音”到它,然后看怎么样 loess“span”参数影响 看起来平滑的曲线。
创建正弦曲线并添加一些噪音:
周期&lt; - 120 x < - 1:120 y&lt; - 罪(2 * pi * x /句号)+ runif(长度(X), - 1,1)
在这条嘈杂的正弦曲线上绘制点:
plot(x,y,main =“Sine Curve + '统一'噪音“)mtext(”显示 黄土平滑(局部回归 平滑)“)
使用默认范围值0.75:
应用黄土平滑y.loess&lt; - 黄土(y~x,span = 0.75, data.frame(x = x,y = y))
计算曲线上所有点的黄土平滑值:
y.predict&lt; - predict(y.loess, data.frame(X = X))
- 醇>
绘制黄土平滑曲线以及已经存在的点 绘制:
线(X,y.predict)
答案 2 :(得分:2)
您可以使用像FIR滤镜这样的数字滤镜。最简单的FIR滤波器只是一个运行平均值。对于更复杂的治疗,看起来像FFT。
答案 3 :(得分:2)
这称为曲线拟合。执行此操作的最佳方法是找到可以为您执行此操作的数字库。这是一个显示how to do this using scipy的页面。该页面上的图片显示了代码的作用:
现在它只有4行代码,但作者根本没有解释它。我将在这里简要解释一下。
首先,你必须决定你想要答案的形式。在这个例子中,作者想要一个形式的曲线
f(x) = p 0 cos(2π/ p 1 x + p 2 )+ p 3 x
您可能需要多条曲线的总和。没关系;公式是求解器的输入。
然后,该示例的目标是通过 p 3 找到常量 p 0 完成公式。 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足够疯狂,求解器可能会失败。)
答案 4 :(得分:1)
这看起来像多项式近似。您可以在Excel中使用多项式(“添加趋势线”到图表,选择“多项式”,然后将顺序增加到您需要的近似值)。找到一个算法/代码应该不难。 Excel也可以显示它为近似提出的等式。