含异常值时LK范数阶数对模型训练的影响及实验疑问
背景说明
RMSE和MAE都是衡量预测值与真实值差异的指标,都属于范数范畴。在向量运算中,范数用于表示向量的“大小”或“长度”。
回归任务中通常首选RMSE,但当数据集存在大量异常值时,MAE(平均绝对误差)更合适。本质原因是:范数的阶数越高,越关注大值、忽略小值,所以RMSE(对应L2范数)比MAE(对应L1范数)对异常值更敏感。(来源:《Hands-On Machine Learning with Scikit-Learn and TensorFlow》)
基于此,理论上在含大量异常值的数据集中,残差向量(即预测值与真实值的绝对差,如下方代码中的y_diff)的Lk范数应该随阶数k增大而增大——也就是RMSE应该大于MAE。如果这个观点有误,请指正。
实验与疑问
按照上述理论,我生成了含大量异常值的随机数据集,计算了残差y_diff在k从1到5时的Lk范数,却发现Lk范数随k增大而减小,和预期的RMSE大于MAE不符。
请问为什么Lk范数随阶数k增大反而减小,和理论相悖?另外,L3、L4等高阶范数适用于哪些场景?
实验代码
import numpy as np import plotly.offline as pyo import plotly.graph_objs as go from plotly import tools num_points = 1000 num_outliers = 50 x = np.linspace(0, 10, num_points) # 选择添加异常值的位置 outlier_locs = np.random.choice(len(x), size=num_outliers, replace=False) outlier_vals = np.random.normal(loc=1, scale=5, size=num_outliers) y_true = 2 * x y_pred = 2 * x + np.random.normal(size=num_points) y_pred[outlier_locs] += outlier_vals y_diff = y_true - y_pred losses_given_lk = [] norms = np.linspace(1, 5, 50) for k in norms: losses_given_lk.append(np.linalg.norm(y_diff, k)) trace_1 = go.Scatter(x=norms, y=losses_given_lk, mode="markers+lines", name="lk_norm") trace_2 = go.Scatter(x=x, y=y_true, mode="lines", name="y_true") trace_3 = go.Scatter(x=x, y=y_pred, mode="markers", name="y_true + noise") fig = tools.make_subplots(rows=1, cols=3, subplot_titles=("lk_norms", "y_true", "y_true + noise")) fig.append_trace(trace_1, 1, 1) fig.append_trace(trace_2, 1, 2) fig.append_trace(trace_3, 1, 3) pyo.plot(fig, filename="lk_norms.html")
实验输出

问题解答
1. 为什么Lk范数随k增大反而减小?
核心原因是混淆了原始Lk范数和回归任务中常用的平均误差指标(RMSE/MAE)的定义:
- 回归里的MAE是L1范数除以样本总数,RMSE是L2范数除以样本数的平方根。这两个指标确实满足“RMSE > MAE(当存在异常值时)”的结论。
- 但代码中直接计算的
np.linalg.norm(y_diff, k)是向量的原始Lk范数,定义为:$||x||k = (\sum{i=1}^n |x_i|k){1/k}$。
以你的数据集为例:1000个样本里有50个异常值(残差大),950个正常样本(残差小)。当k增大时:
- L1范数是所有残差的绝对值之和,等于50个大残差加950个小残差,数值很大;
- 当k=2时,L2范数是(大残差平方和+小残差平方和)的平方根,此时小残差的平方和占比已经很低,但平方根运算会拉低整体数值;
- 当k继续增大到3、4、5时,小残差的k次方几乎可以忽略不计,Lk范数近似等于(50 * 大残差k)(1/k) = 大残差 * 50(1/k)。而50(1/k)会随着k增大不断减小(比如k=1时是50,k=5时约为2.18),所以整体Lk范数会持续趋近于最大的那个残差值,自然比L1范数小很多。
简单说:你对比的是“原始范数”,但理论里说的是“平均后的误差指标”,两者不是同一个东西,所以结果看似相悖,实际是概念混淆导致的。
2. L3、L4等高阶范数的适用场景
高阶范数(k>2)的核心特点是比L2更聚焦于极端大值,同时比L∞范数(取最大元素)更平滑,常见应用场景包括:
- 极端异常点检测:相比L2,高阶范数对超大的异常值敏感度更高,能快速定位到远超正常范围的离群点;
- 稀疏信号恢复:在信号处理中,高阶范数可以在保留稀疏性的同时,比L2更好地抑制中等噪声,比L1的结果更平滑;
- 鲁棒优化与误差约束:可以近似替代L∞范数(限制最大误差),但计算上更易处理,适合需要严格控制极端误差的场景;
- 计算机视觉任务:比如图像去噪、超分辨率中,高阶范数能在保留边缘细节的同时,更有效地去除大的噪声斑点。
内容的提问来源于stack exchange,提问作者I. A

