如何使用NumPy复现sklearn中WhiteKernel的计算逻辑
NumPy实现WhiteKernel核的重构思路
你要实现的组合核为 kernel=ConstantKernel() * RBF() + WhiteKernel(),现有代码已经完成ConstantKernel与RBF核的预测逻辑,WhiteKernel可按以下逻辑实现,无需大幅改动现有代码:
- 先明确WhiteKernel的数学性质:白核用于建模观测值的独立高斯噪声,仅当两个输入完全为同一样本时,核函数取值为噪声超参数
noise_level,其余场景取值恒为0,表达式为k_white(a,b) = noise_level * δ(a,b),其中δ为克罗内克函数,a==b时返回1,否则返回0。 - 第一处修改:训练阶段的自核矩阵补充白核项
训练阶段计算训练集样本两两之间的自协方差矩阵K_train时,在原有Constant*RBF的计算结果基础上,给矩阵对角线加上白核的噪声值,再进行Cholesky分解求解self.alpha即可,对应代码片段:# 训练集自核平方距离计算逻辑和你现有predict里的平方距离逻辑一致 n_train = self.x_train.shape[0] x_train_scaled = self.x_train / self.length_scale sqdist_train = np.sum(x_train_scaled**2, axis=1).reshape(-1,1) + np.sum(x_train_scaled**2, axis=1) - 2*np.dot(x_train_scaled, x_train_scaled.T) K_train = np.exp(-0.5 * sqdist_train) * self.constant_value # 补充WhiteKernel项:仅对角线加噪声方差 K_train += self.noise_level * np.eye(n_train) # 后续执行Cholesky分解、求解self.alpha的逻辑保持不变 - 第二处说明:现有predict方法的
k_star计算逻辑无需修改
预测阶段计算的是训练集与测试集之间的交叉协方差矩阵k_star = k(x_train, x_test),训练样本和测试样本是独立观测的,二者之间不存在共享的观测噪声,因此白核在交叉协方差矩阵中的贡献恒为0,你当前写的k_star计算、以及最终均值预测的代码可以直接复用,不需要加任何白核相关计算。 - 可选扩展:如果需要计算预测结果的方差,在无噪声预测方差的基础上,给对角元素加上
self.noise_level即可得到带观测噪声的预测方差。
内容的提问来源于stack exchange,提问作者Max Berktold
相关产品推荐
相关产品推荐

