如何用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

