Python最小二乘拟合求解超定线性方程组实现方法
超定线性方程组最小二乘求解实现
针对n>3、无精确解析解的线性方程组,求解残差平方和最小的(x,y,z)最优值不需要依赖显式自变量坐标轴,以下是几种常用Python工具的可落地实现方式:
方案1:Numpy直接求解(优先选择)
这是线性最小二乘问题的标准解析解法,不需要迭代、无初值依赖、计算速度最快,结果为全局最优解。
首先把方程组整理为矩阵形式 M = K @ β:
- K是n行3列的系数矩阵,每一行对应单条方程的系数
[Ai, Bi, Ci] - β是长度为3的待求向量,即
[x, y, z] - M是长度为n的测量值数组
实现代码:
import numpy as np # 替换为你的真实A1~An、B1~Bn、C1~Cn、M1~Mn数据 A = np.array([A1, A2, ..., An]) B = np.array([B1, B2, ..., Bn]) C = np.array([C1, C2, ..., Cn]) M = np.array([M1, M2, ..., Mn]) # 组装系数矩阵 K = np.column_stack((A, B, C)) # 求解最小二乘 beta_opt, sum_residuals, rank, singular_values = np.linalg.lstsq(K, M, rcond=None) x, y, z = beta_opt
方案2:Scipy优化接口实现(灵活扩展)
如果需要后续添加参数约束、做加权最小二乘、自定义残差规则,可以用scipy.optimize.least_squares,属于迭代求解,线性问题下对初值不敏感。
实现代码:
import numpy as np from scipy.optimize import least_squares # 替换为你的真实数据 A = np.array([A1, A2, ..., An]) B = np.array([B1, B2, ..., Bn]) C = np.array([C1, C2, ..., Cn]) M = np.array([M1, M2, ..., Mn]) # 定义残差函数:返回每条方程的预测值与测量值的差 def calc_residual(beta): x, y, z = beta M_pred = A * x + B * y + C * z return M_pred - M # 初值可任意设置,线性问题不会陷入局部最优 init_beta = [0, 0, 0] fit_result = least_squares(calc_residual, init_beta) x, y, z = fit_result.x
如果需要做加权最小二乘,只要把返回的残差乘上对应权重数组即可,比如return (M_pred - M) * weight_array。
方案3:lmfit实现(适配现有使用习惯)
你之前用的带自变量轴的拟合是lmfit封装的高层Model接口,这类无显式x轴的场景直接用lmfit底层的minimize方法即可,逻辑和scipy一致,还能沿用你熟悉的参数设置、约束、结果输出逻辑。
实现代码:
import numpy as np from lmfit import Parameters, minimize # 替换为你的真实数据 A = np.array([A1, A2, ..., An]) B = np.array([B1, B2, ..., Bn]) C = np.array([C1, C2, ..., Cn]) M = np.array([M1, M2, ..., Mn]) # 定义待拟合参数,可按需添加min/max范围约束、设置vary=False固定参数等 fit_params = Parameters() fit_params.add('x', value=0) fit_params.add('y', value=0) fit_params.add('z', value=0) # 定义残差函数 def lm_residual(params): x = params['x'].value y = params['y'].value z = params['z'].value M_pred = A * x + B * y + C * z return M_pred - M # 执行拟合 fit_out = minimize(lm_residual, fit_params) x = fit_out.params['x'].value y = fit_out.params['y'].value z = fit_out.params['z'].value
提示:该问题属于纯线性最小二乘问题,三种方案得到的结果理论上完全一致,日常使用优先选numpy方案效率最高,有自定义需求时再选scipy或lmfit即可,不需要按非线性拟合的思路做复杂配置。
内容的提问来源于stack exchange,提问作者Aleksandar Ciric
相关产品推荐
相关产品推荐

