我一直在寻找一种在Javascript中执行线性曲线拟合的方法。我发现了几个库,但它们没有传播错误。我的意思是,我有数据和相关的测量错误,如:
x = [ 1.0 +/- 0.1, 2.0 +/- 0.1, 3.1 +/- 0.2, 4.0 +/- 0.2 ]
y = [ 2.1 +/- 0.2, 4.0 +/- 0.1, 5.8 +/- 0.4, 8.0 +/- 0.1 ]
我的符号a +/- b
表示{ value : a, error : b }
。
我希望将其与y = mx + b
相符,并找出m
和b
及其传播错误。我知道我可以实现的最小二乘法算法,但它只对y变量产生错误,并且我在两者中都有明显的错误。
我也找不到Javascript中的库来做到这一点;但如果有一个其他语言的开源库,我可以检查它以了解如何在JS中实现它。
像Origin或plotly这样的程序能够实现这一点,但我不知道如何实现。此示例数据集的结果是:
m = 1.93 +/- 0.11
b = 0.11 +/- 0.30
答案 0 :(得分:3)
非常有用的书Numerical Recipes提供了一种方法,可以将数据拟合到一条直线上,X和Y坐标都有不确定性。在这两个版本中可以找到online:
该方法基于最小化χ 2 (卡方),其类似于最小二乘,但考虑了每个数据点的个体不确定性。当不确定性σ i 仅在Y轴上时,与1 /σ i 2 成比例的权重被分配给计算中的点。当数据在X和Y坐标中存在不确定性时,分别由σ xi 和σ yi 给出,拟合为直线
y(x)= a + b·x
使用χ 2 ,其中每个点的权重与
成比例1 /(σ 2 yi + b 2 · σ 2 <子> XI 子>)
详细方法和代码(在C或Fortran中)可以在书中找到。由于copyright,我无法在此处重现它们。
答案 1 :(得分:2)
似乎least squares(LS)方法确实是一个好方向。 给出一个x&amp;列表y,m&amp;的最小二乘回报值b最小化 $$ \ sum_ {i}(m * x_ {i} + b -y_ {i})^ {2} $$。
LS方法的好处是你会找到参数的最佳值,计算速度很快,你可能能够在java脚本中找到植入,比如one。
现在你应该处理你所拥有的错误边缘。请注意,处理错误边际的方式更多的是“业务问题”而不是数学问题。意味着很少有人可以根据自己的需要选择一些治疗方法,而且从数学的角度来看,他们都会无动于衷。
如果不了解您的需求,我建议您根据边距将每个点(x,y)转换为4个点。 (x + e,y + e),(x-e,y + e),(x + e,y-e),(x-e,y-e)。
这种表示的好处在于它很简单,它让位于通常更敏感且最好的边界边界的末端 - 它是一种减少。因此,一旦生成新值,就可以使用常规LS实现,而无需自己实现此类算法。