我有一个一般类别的非线性问题,其中我有 2 个或更多 y 数据向量,它们以依赖但已知的方式耦合到 2 个或更多 x 数据向量,并且我想找到参数。我正在寻找一种方法来适应 python 中的基本非线性拟合模型,以将两组数据考虑在内。
一般情况下,我可能有这对:
[y1(x1, x2; A, B), y2(x1, x2; A, B)]
作为一个具体的例子,我可能有:
y1 = A sin(B x1) + e^(-A x1)
y2 = A x1^2 + B x2 + log[A x2]
(假设这些问题无法通过分析解决,或者如果解决可能会导致效率低下)。我知道所有值 y1, y2
和 x1, x2
,并且我想找到 A
和 B
的估计值code> 考虑了来自 ys
的数据。我可以只拟合一个或另一个方程并获得 A
和 B
的估计值。
例如,想象一下如果y2
不依赖于B
(或者依赖得非常弱)。它仍然提供了有关我希望 y1
考虑的 A
值的重要信息。
作为第二个问题,我将如何使用此方法对两组 y 数据赋予不同的权重?
编辑:
我能想到的一种可能的方法是将所有 y 数据堆叠到单个列中,然后使用该函数处理预期的 y1,y2 ,然后以像 return vstack((y1,y2))
这样我就可以比较这两个集合?那么我可以有一个与这个连接函数的长度相匹配的加权函数吗?
最佳答案
我想你可以关注这个symfit示例here ,并根据您的问题进行调整。所以这会是这样的:
from symfit import variables, parameters, Fit, sin, exp, log
x_1, x_2, y_1, y_2 = variables('x_1, x_2, y_1, y_2')
A, B = parameters('A, B')
model_dict = {
y_1: A * sin(B * x_1) + exp(-A * x_1),
y_2: A * x_1**2 + B * x_2 + log(A * x_2)
}
fit = Fit(model_dict, x_1=x1data, y_1=y1data, x_2=x2data,
y_2=y2data, sigma_y_1=y1stdev, sigma_y_2=y2stdev)
fit_result = fit.execute()
此示例通过提供标准差作为额外信息,已包含不同 y_1
和 y_2
的不同权重。
免责声明:我是 symfit 的作者。
关于python - 在 python 中拟合 2D Y 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466538/