首页 > 解决方案 > Python:从数学模型中查找常数以重建测量数据

问题描述

我尝试为我测量的(和已经过滤的)数据计算已知数学模型的常数。

一点点伪代码:

#my data is saved in y_data and x_data
#my model is a function of constants (a,b,c) and the x_data
model = f(x_data, a, b, c)

#set model equal to data
y_data != model
calculate(a, b, c)

有没有办法找到常数?我知道不会有确切的结果...但是 y_data 是否有可能出现偏差(例如 5%)?

另一种方法是计算每个索引的常数。然后有 len(x_data) 方程并以某种方式找到最佳拟合模型及其常数。

我试图简化我的问题,而且这是我的第一个问题,所以让我知道什么时候可以做得更好。

提前致谢!

标签: pythonscipysympy

解决方案


如果您的模型是线性的,最简单的方法是最小二乘法(线性回归)。这里有一个很好的示例教程

由于您的模型似乎是非线性的(假设您不能或不想找到解析解),您可能想尝试数值优化

Scipy 有一个名为的函数minimize,您可以使用它来尝试找到最佳解决方案。但不能保证找到全局最小值。所以你可能不得不尝试不同的初始条件。

您的代码可能如下所示:

from scipy.optimize import minimize

# Initial guess
x0 = [1.3, 0.7, 0.8]
res = minimize(cost_function, x0, tol=1e-5)
print(res.x)

诀窍是,您首先需要定义cost_function提供给求解器的函数。

通常使用二次误差(平方误差之和或均方误差)。像这样的东西:

def cost_function(x):
    a, b, c = x
    model_predictions = f(x_data, a, b, c)
    return sum((model_predictions - y_data)**2)

您可能还必须尝试内置于scipy.optimize.minimize. 请参阅有关每种方法的优缺点的文档。

也许先熟悉 Scipy 文档中的示例,然后尝试根据您的实际问题进行设置。


推荐阅读