复数矩阵下numpy.linalg.lstsq求解y=a*x与直接除法结果不符问题排查
复系数线性方程求解异常排查
我正在求解复系数线性方程y = a*x,现有三组复数测量值(x1,x2,x3)和(y1,y2,y3),目标是求解斜率a。已知正确答案,但发现直接计算yi/xi得到的coeff_1与coeff_2结果不一致(此为异常情况),且使用np.linalg.lstsq()求解得到的结果与直接除法结果也不相同。
给出的代码如下:
import numpy as np import matplotlib.pyplot as plt import pandas as pd import math y1= -19.64927911-6.1398258j x1=-1.1754612296645994+1.246124677990216*1j y2=-(20.362010267083804+5.457126922032681*1j) x2=-1.1754612296645994+1.246124677990216*1j y3=-(-21.582640711300716-4.866985215398231*1j) x3=1.0043723963072644-0.6003393298974578*1j coeff_1=y1/x1 coeff_2=y2/x2 coeff_3=y3/x3 ########linear least square method X=np.vstack((x1,x2,x3)) Y=np.vstack((y1,y2,y3)) [coeff, resid, _, singular_values] = np.linalg.lstsq(X, Y, rcond=None) print(coeff_1) print(coeff_2) print(coeff_3) print(coeff) print(np.abs(coeff_1)) print(np.abs(coeff_2)) print(np.abs(coeff_3)) print(np.abs(coeff))
运行后coeff_1与coeff_2结果不一致,以下是原因排查:
问题原因分析
1. 输入数据本身的不一致性
首先拆解y1和y2的实际值:
y1 = -19.64927911 - 6.1398258jy2 = -(20.362010267083804 + 5.457126922032681j) = -20.362010267083804 - 5.457126922032681j
而x1与x2完全相同:x1 = x2 = -1.1754612296645994 + 1.246124677990216j
由于y1和y2是两组不同的测量数据,本身数值存在差异(模值分别约为20.57和21.09),因此除以同一个x得到的coeff_1和coeff_2必然不同。这是测量数据本身的误差或不一致性导致的,并非代码逻辑问题。
2. 最小二乘与直接除法的结果差异原因
np.linalg.lstsq()处理复系数回归时,是通过最小化所有数据点残差的模平方和求解最优a,核心公式为:a = (X^H Y) / (X^H X)
其中X^H代表X的共轭转置。
而直接除法yi/xi仅基于单组数据计算比值,当多组数据存在矛盾时,最小二乘会给出全局最优的拟合值,自然和单组数据的局部比值不同。
解决建议
- 若预期
coeff_1与coeff_2一致,需检查测量数据的准确性,确认y1和y2是否对应同一真实值,排查是否存在测量误差或记录错误。 - 当多组数据存在不一致时,最小二乘结果是更可靠的全局拟合值,适合用来估计真实的
a。
内容的提问来源于stack exchange,提问作者SAHAR GOHARSHENASAN
相关产品推荐
相关产品推荐

