Python中基于符号数组与数值数组求解线性回归最优E值
求解最优E的实现方案
你的所有方程均为 常数/E 的形式,可直接推导最小二乘损失下的解析解,无需复杂数值迭代,具体实现如下:
import numpy as np import sympy as sp # 原有变量定义 E = sp.Symbol('E') values = np.array([0.0, 0.0001, 0.0001, 0.0002, 0.0003, 0.0004, 0.0006, 0.0007, 0.0009, 0.0011, 0.0013, 0.0015, 0.0017, 0.0019, 0.0021, 0.0024, 0.0026, 0.0028, 0.0031, 0.0033, 0.0036, 0.0038, 0.0041, 0.0043, 0.0046]) equations = np.array([27405854.8989427/E, 106962058.905272/E, 234787976.631598/E, 407151513.555005/E, 620469116.017057/E, 871305771.223787/E, 1156375007.24571/E, 1472538893.01782/E, 1816808038.33958/E, 2186341593.87493/E, 2578447251.15228/E, 2990581242.5645/E, 3420348341.36898/E, 3865501861.68755/E, 4323943658.50655/E, 4793724127.67675/E, 5273042205.91346/E, 5760245370.79641/E, 6253829640.76983/E, 6752439575.14242/E, 7254868274.08736/E, 7760057378.64231/E, 8267097070.70941/E, 8775226073.05526/E, 9283831649.31095/E]) # 提取每个方程的分子常数项 k_list = np.array([float(eq.subs(E, 1)) for eq in equations]) # 最小二乘解析解计算最优E:最小化sum((k_i/E - value_i)^2) E_opt = np.sum(k_list ** 2) / np.sum(k_list * values) print(f"最优E取值为:{E_opt}") # 验证代入后的误差效果 pred_values = k_list / E_opt mae = np.mean(np.abs(pred_values - values)) print(f"代入最优E后的平均绝对误差为:{mae}")
补充说明
如果后续你的方程形式更复杂,无法推导解析解,可以使用scipy.optimize.minimize做数值优化求解,逻辑如下:
- 定义损失函数:输入E,返回所有方程代入E后和对应数值的误差平方和
- 给E设置合理的初始猜测值,调用优化函数求解最小值点即可
内容的提问来源于stack exchange,提问作者user15014634
相关产品推荐
相关产品推荐

