跳到正文
格致开物MATHWIKI

核回归

核回归(kernel regression)利用预测位置附近的数据估计条件均值,而不预先规定整条回归曲线必须是直线或某个固定次数的多项式。附近样本得到较大权重,远处样本得到较小权重;带宽控制“附近”的范围。这里重点讨论局部常数的Nadaraya–Watson估计,并与边界处更灵活的局部线性方法比较。

局部加权平均

设观测对 (Xi,Yi) 独立同分布,研究目标为 m(x)=𝔼[Y∣X=x];需要相应条件期望存在。给定非负核函数 K 和带宽 h>0,定义 m^h(x)=∑i=1nK((x−Xi)/h)Yi∑i=1nK((x−Xi)/h)=∑iwi(x)Yi. 分母须为正。通常核的积分归一化为一,但在这个比值中,共同的正常数和 1/h 会约掉;不能据此省略核密度估计中的归一化。这里估计的是响应条件均值;核密度估计根据样本位置构造概率密度,曲线下的区间面积对应概率,目标与核回归不同。[1]

高斯核采用 K(u)=(2π)−1/2e−u2/2。它处处为正,因此在精确算术下,非空有限样本的分母总正;紧支撑核在远离数据的地方可能分母为零,应报告无有效邻域而非擅自填零。

由局部最小二乘得到公式

在目标点 x 附近,暂用一个常数 a 近似条件均值,最小化 Qx(a)=∑iki(x)(Yi−a)2,ki(x)=K((x−Xi)/h). 求导得到 Q'x(a)=2∑iki(x)(a−Yi)。若权重和为正,二阶导数 2∑iki(x)>0,所以唯一最小点就是上面的加权平均。这一推导解释了“局部常数”的含义:在每一个目标点重新拟合常数,不是用一个常数描述全部样本。

由于 wi≥0,∑iwi=1,估计值位于观测响应的最小值与最大值之间。这个性质有利于稳定,却也说明它不会自动外推一条在数据之外持续上升的直线。

三个点的带宽比较

取输入 X=(0,1,2),响应 Y=(0,1,4),估计 x=1 处的条件均值。令 r=e−1/(2h2),三个未归一化权重为 (r,1,r),故 m^h(1)=1+4r1+2r. 当 h=1,r=e−1/2,得到约一点五四八一;当 h=1/2,r=e−2,得到约一点二一三零。带宽减小,使中心点权重更大;带宽很大时,三个权重趋于相等,预测趋于样本均值 5/3。

三个观测点与带宽0.4、1、3的高斯核局部常数回归曲线
较小带宽更贴近附近观测,较大带宽把曲线拉向总体平均。样本并非从真实函数精确观测得到,这里只比较同一数据上的加权规则。

变式。 将中心响应从一改成二,保持 h=1,则 m^1(1)=(2+4e−1/2)/(1+2e−1/2)=2。两端平均也是二,所以此时中心预测恰好等于二;这来自本例的对称平衡,不表示任意样本都能被核回归精确插值。

边界偏差与局部线性修正

另取无噪声直线数据 X=(0,1,2),Y=(0,1,2),预测最左端 x=0,带宽为一。局部常数估计为 m^1(0)=e−1/2+2e−21+e−1/2+e−2≈0.50360. 真实直线在零处等于零,但右侧邻居把局部平均拉高。数据支持边界缺少另一侧样本,正是这种误差的来源。

局部线性方法在每个 x 处改为最小化 ∑iki(x){Yi−a−b(Xi−x)}2, 并以 a^ 作为该点预测。令 vi=(1,Xi−x)𝖳,正规方程是 (∑ikivivi𝖳)(ab)=∑ikiviYi. 若加权设计满秩,且数据恰为 Yi=α+βXi,选 a=α+βx,b=β 就使每项残差为零;唯一性保证预测精确重现这条直线。前面的边界例由此得到零。局部线性估计改善边界表现,但可能产生负的等价权重,预测也不再一定落在响应范围内。[1]

三个共线数据点;边界处局部常数估计约0.504,局部线性估计为零
局部常数的误差不是计算错误,而是其拟合常数的限制。加上局部斜率后,满秩的加权拟合能精确重现无噪声直线。

稳定权重的Python实现

下面计算一维高斯核局部常数预测。先减去最大对数权重,再取指数,避免所有权重同时下溢到零;对极端到不能形成有限平方距离的输入,明确拒绝计算。原始单位差异极大时,应先作合适的尺度变换。

Python 3
import math

def gaussian_kernel_mean(xs, ys, point, bandwidth):
    x, y = list(map(float, xs)), list(map(float, ys))
    if not (len(x) == len(y) and len(x) > 0
            and all(math.isfinite(v) for v in x+y+[point, bandwidth])
            and bandwidth > 0):
        raise ValueError("finite paired data and positive bandwidth required")
    log_weights = []
    for xi in x:
        z = (point-xi)/bandwidth
        value = -0.5*z*z
        if not math.isfinite(value):
            raise ValueError("rescale coordinates before computing distances")
        log_weights.append(value)
    largest = max(log_weights)
    weights = [math.exp(v-largest) for v in log_weights]
    total = math.fsum(weights)
    return math.fsum((w/total)*yi for w, yi in zip(weights, y))

print(gaussian_kernel_mean([0, 1, 2], [0, 1, 4], 1, 1))
print(gaussian_kernel_mean([0, 1, 2], [0, 1, 4], 1, 0.5))

输出约一点五四八一和一点二一三零。单个目标点时间和附加存储均为 O(n);对 q 个点逐个调用需 O(nq) 时间,原输入不会修改。高斯核处处为正不表示远离训练数据的预测可靠,稳定的浮点运算也不能创造数据支持。

带宽选择与适用范围

小带宽能保留局部变化,也会使预测更多依赖少量带噪声观测;大带宽降低局部波动,却会抹平峰、谷及边界结构。这是偏差和方差之间的取舍。可用训练折内部的交叉验证选择带宽;时间序列或同组记录不能不加区分地随机拆分,前面的独立抽样解释也需相应修改。

多维核可把每个坐标的距离组合起来,但维数增加后,局部邻域很快变得稀疏。核回归不适合把缺少相似样本的高维预测包装成精确估计,也不能仅凭平滑曲线认定因果关系。先检查散点、数据覆盖、带宽敏感性和留出误差,通常比只展示一条平滑线更有信息。

参考文献

  1. ↑ 1.0 1.1 statsmodels:KernelReg,局部常数Nadaraya–Watson、局部线性回归、边界偏差及带宽选择说明。