使用np.linalg.lstsq求解多变量问题报错排查
代码错误排查与修正
核心错误点
- X矩阵构造逻辑错误:
原代码中x按特征维度存储数据(3个特征,每个特征对应8个样本值),但最小二乘要求X矩阵每行对应一个样本(每行包含该样本的所有特征:常数项1、ln(W)、ln(H))。同时错误添加了np.ones(len(x)),len(x)为3,生成的数组长度与样本数8不匹配,触发形状冲突。 - vstack与转置误用:
原代码的vstack和转置操作导致X矩阵形状错误,无法与目标变量y(长度8)匹配,进而引发求解错误。
修正后的代码
方式一:直接构造样本行
import numpy as np # 构造8行3列的特征矩阵X,每行对应[1, ln(W_i), ln(H_i)] X = np.array([ [1, np.log(70), np.log(170)], [1, np.log(75), np.log(165)], [1, np.log(77), np.log(175)], [1, np.log(80), np.log(183)], [1, np.log(82), np.log(188)], [1, np.log(84), np.log(187)], [1, np.log(87), np.log(190)], [1, np.log(90), np.log(197)] ]) # 目标变量:ln(A)的数组 y = np.array([ np.log(1.86), np.log(1.88), np.log(1.92), np.log(2.15), np.log(2.18), np.log(2.16), np.log(2.25), np.log(2.29) ]) # 最小二乘求解参数ln(a)、b、c lna, b, c = np.linalg.lstsq(X, y, rcond=None)[0] # 还原原参数a a = np.exp(lna) print(f"ln(a) = {lna:.4f}, b = {b:.4f}, c = {c:.4f}") print(f"拟合得到的a值:{a:.4f}")
方式二:基于原有特征序列构造
import numpy as np # 提取各特征的样本值 const_term = np.ones(8) lnW = np.array([np.log(70), np.log(75), np.log(77), np.log(80), np.log(82), np.log(84), np.log(87), np.log(90)]) lnH = np.array([np.log(170), np.log(165), np.log(175), np.log(183), np.log(188), np.log(187), np.log(190), np.log(197)]) # 按列堆叠成8行3列的X矩阵 X = np.column_stack([const_term, lnW, lnH]) y = np.array([np.log(1.86), np.log(1.88), np.log(1.92), np.log(2.15), np.log(2.18), np.log(2.16), np.log(2.25), np.log(2.29)]) lna, b, c = np.linalg.lstsq(X, y, rcond=None)[0] a = np.exp(lna) print(f"ln(a) = {lna:.4f}, b = {b:.4f}, c = {c:.4f}") print(f"拟合得到的a值:{a:.4f}")
关键说明
- 修正后的X矩阵形状为
(8,3),与y的形状(8,)匹配,符合最小二乘求解的输入要求。 - 通过
np.exp(lna)可以还原原方程中的参数a,因为拟合结果lna是ln(a)的估计值。
内容的提问来源于stack exchange,提问作者afg
相关产品推荐
相关产品推荐

