python - 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) 方程并以某种方式找到最佳拟合模型及其常数。
我试图简化我的问题,而且这是我的第一个问题,所以让我知道什么时候可以做得更好。
提前致谢!
解决方案
如果您的模型是线性的,最简单的方法是最小二乘法(线性回归)。这里有一个很好的示例教程。
由于您的模型似乎是非线性的(假设您不能或不想找到解析解),您可能想尝试数值优化。
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 文档中的示例,然后尝试根据您的实际问题进行设置。
推荐阅读
- java - Including nested objects in the JSON of a Spring Boot application
- html - 以两种方式更新选中的单选按钮
- python - ValueError:无法分配“'x'”:“y”必须是“z”实例
- css - 如何在反应中使用两个api url
- javascript - require('fs') 不起作用,不知道为什么控制台说有错误
- c++ - C++[错误] 不能传递非平凡可复制类型的对象'std::string {aka class std::basic_string
}' 通过 '...' - tensorflow - 如何在多个没有 GPU 的设备上训练 TensorFlow?
- javascript - React Material UI - Snackbar 在对话框关闭时关闭,但它不应该关闭
- flutter - 颤振/飞镖:如何在飞镖 FFI 中使用异步回调?
- html - 我想使用 findElement(By.className()) 打印“Apple”和“tomato”