You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python、NumPy或SciPy计算多元回归的残差范数?

如何用Python/NumPy/SciPy计算残差范数?

嘿,这个问题我太熟了!其实用NumPy或者SciPy来计算残差范数非常直接,我给你一步步讲清楚,还附上示例代码~

首先得明确:残差是观测值Y和模型预测值之间的差,也就是 残差 = Y - X @ theta(这里@是矩阵乘法运算符,和np.dot效果一致,写法更直观)。而残差范数就是对这个残差向量计算对应的范数,最常用的是L2范数(欧几里得范数),当然也可以计算L1、无穷范数等。

步骤1:计算残差向量

不管用哪种范数,第一步都是先算出残差。假设你的X是(n_samples, n_features)的特征矩阵,theta是(n_features,)的参数向量,Y是(n_samples,)的观测向量,用NumPy一行代码就能搞定:

import numpy as np

# 先定义你的X、Y、theta(这里用模拟数据示例,方便复现)
np.random.seed(42)
X = np.random.randn(100, 5)
theta = np.array([1, 2, 3, 4, 5])
Y = X @ theta + np.random.randn(100)  # 带噪声的观测值

# 计算残差
residuals = Y - X @ theta

步骤2:计算不同类型的残差范数

接下来就可以针对需求计算对应的范数了:

最常用:L2范数(欧几里得范数)

L2范数是残差向量的欧几里得长度,也就是残差平方和的平方根,是回归问题里最常用的指标。用NumPy直接调用np.linalg.norm就行,默认就是L2范数:

l2_norm = np.linalg.norm(residuals)
print(f"L2残差范数: {l2_norm:.4f}")

如果需要残差平方和(也就是L2范数的平方),可以直接计算:

squared_l2_norm = np.sum(residuals ** 2)
# 或者等价写法:np.linalg.norm(residuals) ** 2

L1范数(曼哈顿范数)

L1范数是残差绝对值的和,常用于鲁棒回归场景:

l1_norm = np.linalg.norm(residuals, ord=1)
print(f"L1残差范数: {l1_norm:.4f}")

无穷范数(切比雪夫范数)

无穷范数是残差中绝对值最大的那个值,能帮你找到最离谱的预测偏差:

inf_norm = np.linalg.norm(residuals, ord=np.inf)
print(f"无穷残差范数: {inf_norm:.4f}")

用SciPy的方式计算

如果你习惯用SciPy,它的scipy.linalg.norm函数用法和NumPy的几乎完全一致,导入后直接用就行:

from scipy.linalg import norm

l2_norm_scipy = norm(residuals)
l1_norm_scipy = norm(residuals, ord=1)

小提示

要注意数组的维度:如果你的theta是列向量(比如形状是(5,1)),Y是列向量((100,1)),NumPy的@运算符会自动处理广播,残差结果还是列向量,完全不影响范数计算——因为范数计算只关注向量元素,不管是一维还是二维列向量。

内容的提问来源于stack exchange,提问作者Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:04