在gnuplot中平滑峰值

6
我有一些数据点f(x_i),在点x_i处(只知道数值,不知道函数f)。其中f(0)=0。这些数据显示,小x的位置有一个类似峰的结构,然后在大x的位置有一个缓慢的肩膀下降,在最高点的一半开始。我想通过这些数据点绘制平滑的曲线。 如果我使用贝塞尔曲线,则确实f(0)=0是可以的,但峰值显著降低了(约25%)。如果我使用acsplines,则峰值看起来更好,但无法保持f(0)=0。 如何平滑处理该数据集而不会丢失重要信息(f(0)=0)或分布的峰度?

http://stats.stackexchange.com/ - Andrew
1
尝试使用三次样条函数,smooth csplinessmooth mcsplines - Christoph
谢谢,确实cplines或mcsplines比其他方法更好地保持了峰值。然而,这是有代价的:如果我选择使峰值高度正确的权重,那么曲线的其余部分(在高x处的肩膀)看起来会很波动。 在gnuplot中有一种分段平滑的方法吗? - Umo
这就是smooth mcsplines的作用,所以应该可以正常工作。顺便说一句:csplinesmcsplines都不使用权重。 - Christoph
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Umo
1个回答

13

使用 acsplines 进行平滑处理会绘制一个近似的三次样条曲线,该曲线不会经过原始数据点。

更好的方法可能是使用立方样条曲线 smooth csplines,它会穿过所有的数据点,但可能会在尖峰处显示过冲现象。

在您的情况下,最好的解决方案是使用单调立方样条曲线 smooth mcsplines,它保持了原始数据点的单调性和凸性(参见 F.N. Fritsch 和 R.E. Carlson,“ Monotone Piecewise Cubic Interpolation”,SIAM Journal on Numerical Analysis 17,pp. 238-246 (1980))。

这里有一个简短的例子展示了这些差异:

test.dat 文件包含以下数据点:

0 0
0.2 1
0.4 10
0.6 80
1 30
2 20
3 13
4 7
5 2
6 1 
7 0

绘制它们的脚本为

set xzeroaxis
set style data lines
set samples 500
plot 'test.dat' u 1:2 smooth acsplines title 'acsplines', \
     '' u 1:2 smooth csplines title 'csplines', \
     '' u 1:2 smooth mcsplines lw 2 title 'mcsplines',\
     '' u 1:2 w p pt 7 title 'data points'

在此输入图片描述


感谢这些详细的解释。现在我明白为什么mcsplines不适合我了。我处理的数据点存在一些数值噪声,因此平滑曲线不应该穿过这些点。如果权重选择正确,acsplines在峰值右侧的区域做得很好,但它也会平滑掉峰值(显著降低最大值)。这就是为什么我想对曲线的不同部分应用不同的平滑算法。在您的小例子中,给最右边的6个点添加一些散点,然后找到一条平滑曲线。 - Umo
你需要平滑曲线做什么?你可以用mcsplines绘制峰值周围的数据,用acsplines绘制尾部。使用“every”限制区域,然后就可以读取峰宽,但两条曲线相交的位置会有不连续性。 - Christoph
我需要一条平滑曲线用于出版。我所需要的是一条平滑曲线,它可以去除数据点中的统计噪声并保留峰值(该峰值具有明确的物理解释),同时大致(比如说在5%以内)保持正确的最大值。因此,不连续性并不是一个理想的特征。 - Umo
1
这些要求是相互矛盾的,我认为你无法找到一个适合的平滑方法而不涉及可疑的黑客技巧。我的问题更多地针对于该线是否应该成为眼睛的向导,或者你想估计峰值宽度、衰减时间等等。如果你有一些数据模型,你也可以进行拟合。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接