我正在尝试使用 gnuplot 通过一组数据点绘制一条直线。问题是,有些点远离平均拟合线,我想忽略它们,因为它们对线的斜率产生了不好的影响。你怎么能做到这一点?
谢谢。
最佳答案
一种方法是进行一次拟合,然后使用第二个函数重新进行拟合,并根据相对于第一次拟合的值来区分一些数据点。为了区分异常值,我为它们分配了非常高的方差(在第三 using
列中)。将未定义的数据值与1/0
一起使用第二列中的方法不起作用。
考虑文件 test.dat
1 1
2 2
3 5
4 4
用于配件用途:
f(x) = a*x + b
g(x) = c*x + d
fname = 'test.dat'
limit = 1
fit f(x) fname via a,b
fit g(x) fname using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000) via c,d
set key left
set offset 0.5,0.5,0.5,0.5
plot f(x), g(x), fname
4.6.3的结果是:
using 语句说明
与 using
关键字您可以选择使用数据文件的哪些列。最简单的情况是using 1:2
,它将第一列用作 x
第二个为 y
(这是在第一个 fit
调用中隐含假设的)。例如using 1:2:3
可以使用第三列作为相应数据点的权重(在 fit
命令的情况下)。在这里,高值意味着大方差,因此保真度低(请参阅 fit
命令的文档)。
除了选择列之外,还可以进行像using 1:($2*2)
这样的计算,将第二列乘以 2
并将结果视为 y
-值(value)。 $2
是 column(2)
的简写,整个语句需要用括号括起来。
所以,using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000)
执行以下操作:f($1)
是某个 x
的先前拟合值值,$2
对应的是y
-数据文件中的值。所以,如果距离abs(f($1) - $2)
数据 y
-先前拟合结果的值低于 limit
,然后1
被用作权重。否则权重非常大 1000
使用,这导致几乎忽略这个数据点。
关于gnuplot - 忽略远离平均 gnuplot 的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295837/