☰
Kriging代理模型实战:Matlab实现原理、超参数调优与工程应用
2026/10/13 20:18:34 网站建设 项目流程

做工程优化的朋友应该都撞过这堵墙:单次仿真计算慢到让人怀疑人生,优化算法却需要一遍遍反复调用它。你不敢砍网格密度,因为精度会失真;你也不敢给简化模型加经验系数,因为换一套输入可能整个趋势就偏了。我接触过的某个结构参数寻优任务就是这样——两个设计变量、一个输出指标,单次完整评估接近半小时,而启发式优化算法在参数空间里动辄调用上百次。按这个节奏,一次寻优少说一周起步,中间还要提心吊胆怕机器掉链子。

那时候最需要的就是一个足够快、又足够稳的“替身模型”:用少量真实样本训练一个代理,然后把原来几百次的昂贵仿真调用,替换成对代理模型的毫秒级计算。在众多替身方案里,Kriging代理模型(克里金模型)是最适合这类回归预测场景的一种。它能给出预测值,还能顺便给出预测的不确定性;即便只有二十几个训练样本,也能把非线性响应趋势抓得相当准。配合Matlab实现,代码量不大,今天我把我实际跑通过的一套流程完整拆开讲,从原理、公式选型到代码实现、参数调优和边界条件,一次说清楚。

1. 从“仿真太贵”说起:为什么回归预测需要代理模型

1.1 一个典型的“评估太慢、调用太频”困境

很多工程优化任务的结构是一样的:存在一组设计变量,通过有限元、CFD或复杂数值仿真得到一个或多个性能指标,优化算法依靠这个指标不断调整变量组合。问题在于,仿真本身很贵,而优化天生就是“烧评估次数”的活儿。以我当时处理的场景为例,两个变量的寻优问题,如果采用比较常规的遗传算法配置,种群规模30、迭代20代,光是主循环就要评估600次,还不算约束惩罚和收敛判断。每次评估半小时,这就是整整300个小时,完全不可接受。

代理模型的出现把这条链路彻底改了:先用试验设计方法选取一小批样本点(比如30~50个),在这些点上跑完昂贵仿真,得到一个紧凑的数据集;然后用回归方法训练代理模型;后续的优化循环全部在代理模型上进行。这样昂贵的真实仿真只被调用几十次,而代理模型的单次预测只需要几毫秒。代理模型的精度当然不会和真实仿真完全一致,但只要趋势正确、关键区域误差可控,用它做寻优的“导航地图”是完全够用的。

1.2 代理模型选型:为什么首选Kriging

代理模型的候选方案不少,多项式响应面、径向基函数、神经网络、支持向量回归都能干这个活,但放在“样本少、非线性强、评估成本高”的背景下,Kriging有它非常独特的优势。我在实际选型时主要对比了四类:

模型类型非线性拟合能力是否输出不确定性小样本表现训练成本最适用场景
多项式响应面较弱,依赖阶数否不稳定,易过拟合或欠拟合极低趋势简单、接近二次型
径向基函数RBF较强否中等,核宽需要人工调低快速插值、可视化
Kriging强是好,能给出预测方差低到中小样本、非线性、需要不确定性
神经网络强,容量大需额外方法差,容易欠拟合高大数据量、高维复杂映射

对于一个只有几十个样本、但输出响应具有明显非线性特征的回归预测任务,神经网络基本可以直接排除:样本量撑不起足够的层数和神经元数目,反而容易训练出一个在训练集上好看、在测试集上崩掉的模型。多项式响应面则适合做“粗筛”,在简单响应中表现不错,一旦响应出现局部峰谷,高阶多项式会陷入震荡。RBF的插值能力不错,但它不提供不确定性估计,而这恰恰是Kriging受青睐的最重要原因——工程上你不仅想知道“预测值是多少”,还想知道“这个预测有多可信”,Kriging天生就带着一整套误差理论。

另一个实际考量是实现成本。Matlab里从零实现一个标准Kriging模型,核心代码也就一百多行,不依赖任何额外工具箱。这是很多团队选择它的务实理由:足够透明,便于针对具体问题做定制。

2. Kriging模型的数学核心:相关函数、高斯过程与预测公式

2.1 Kriging想干什么:用已知点的加权组合预测未知点

Kriging的核心思想可以还原得很直观:预测某一点的响应值时,把已知样本点的输出做加权平均,权重由该点与各个样本点的“距离”决定。离得近的样本点对预测影响大,离得远的样本点影响小。这个道理和反距离加权插值很像,但Kriging高明的地方在于,它不人为拍脑袋定权重,而是通过数据本身来估计空间的关联结构,并且还能给出预测误差。

从模型形式上看,Kriging把响应函数写成:

y(x) = mu + Z(x)

其中mu是一个全局趋势项,可以理解成整个响应面的“平均海拔”;Z(x)是一个均值为0的随机过程项,描述了局部偏差。这个随机过程的核心属性是相关性结构:两个点越接近,它们的偏差项越相关。几乎所有关键公式都是围绕这个“相关性”展开的。

2.2 三条核心公式:相关函数、预测均值、预测方差

Kriging里最常用的相关函数是高斯型相关函数,对于两个样本点x_i和x_j:

R(x_i, x_j) = exp( - sum_k theta_k * |x_i_k - x_j_k|^2 )

这里的theta_k就是Kriging的核心超参数,每个输入维度一个,它决定了该维度上“多远算远”。theta_k越大,相关函数衰减越快,意味着模型认为该维度上只有特别近的点才互相影响,响应变化更剧烈。theta_k越小,相关衰减越慢,模型会把远处样本的信息也加权进来,响应更平滑。

有了相关矩阵R,假设我们已经有n个训练样本,输出向量为y,那么Kriging预测未知点x的均值表达式是:

y_hat(x) = mu_hat + r^T * R^{-1} * (y - one * mu_hat)

其中r是未知点与所有训练样本之间的相关向量,one是全1列向量。这个公式的解读是:先用R^{-1}将训练样本的残差投影到相关空间,再用未知点与样本点的相关性r加权合成预测值。整个过程本质上是“用数据中最可信的局部结构去外推”。

预测方差公式则稍微复杂一点:

s_hat^2(x) = sigma_hat^2 * [1 - r^T * R^{-1} * r + (1 - one^T * R^{-1} * r)^2 / (one^T * R^{-1} * one)]

这个式子三项各有各的角色。第一项1是基准误差:即使一个点与所有训练样本都不相关,预测也应该有一个默认的不确定度。第二项r^T * R^{-1} * r是“信息折减项”,未知点与训练样本相关性越高,预测方差越小,这是Kriging不确定性估计最核心的机制。第三项是修正项,用于处理全局均值mu_hat本身是从样本估计出来的这一事实——样本均值估计得越不准,预测方差就会额外增大。

这里的mu_hat和sigma_hat^2也不是随便算的,它们有闭式最优解:

mu_hat = (one^T * R^{-1} * y) / (one^T * R^{-1} * one) sigma_hat^2 = (y - one*mu_hat)^T * R^{-1} * (y - one*mu_hat) / n

这两个值都是在给定theta的前提下通过广义最小二乘得到的。所以整个Kriging的训练流程就变成:先猜一组theta,算出R,然后用公式反解mu_hat和sigma_hat^2,再计算这组参数下数据的似然度。接下来就只剩一件事——寻找让似然最大的那组theta。

2.3 超参数theta到底在拟合什么

theta经常被初学者忽略,但它实际上是Kriging模型里最关键的“旋钮”。以二维输入为例,theta是一个包含两个正数的向量,第一个维度控制变量x1方向的相关长度,第二个维度控制变量x2方向的相关长度。我习惯把theta想象成“雷达探测半径”:半径小,模型只看周围很小的范围,预测表面会呈现很多局部起伏;半径大,模型会把远处信息拉进来,表面更光滑。

theta的选择通过极大似然估计完成。简单说,就是用当前theta构造相关矩阵,计算这组参数下观测数据出现的概率,然后调整theta让这个概率最大。实际操作中一般最小化负对数似然:

nlml = 0.5 * (n * log(sigma_hat^2) + log(det(R)) + n * log(2*pi))

其中log(det(R))是一个关键项。如果theta取值过大,样本之间相关性几乎为零,R接近单位阵,这一项接近0,但sigma_hat^2会很大;如果theta取值过小,样本之间相关性极强,R接近全1矩阵,log(det(R))会变成一个很大的负数,反过来惩罚这种取值。极大似然估计就是在“拟合得更好”和“相关结构不要过于极端”之间找平衡。

3. 完整Matlab实现:从样本生成到预测方差输出

3.1 测试算例与数据准备

理论讲得再多,不如跑通一段代码来得实在。我用来演示的测试函数如下:两个输入变量x1、x2,输出为:

y = 5*sin(x1) + x1*x2 + 0.8*x2^2

这个函数既有三角趋势,又有变量交互项,还有二次非线性,能很好地检验代理模型的拟合能力。输入范围取x1 ∈ [-3, 3],x2 ∈ [-2, 2]。

训练样本用拉丁超立方采样生成30个。为什么不用简单随机采样?原因是随机采样在二维平面上容易出现“扎堆”和“大段空白”并存的情况,而拉丁超立方把每个维度均匀分成30层,每层恰好取一个点,能保证样本在各个维度上都“铺得开”。这部分代码放在后面第4节详细解释。

% main_kriging_demo.m clear; clc; rng(42); d = 2; Ntrain = 30; % 拉丁超立方生成 [0,1]^d 样本,再映射到实际范围 Xtr = lhsdesign(Ntrain, d); Xtr(:,1) = -3 + 6 * Xtr(:,1); Xtr(:,2) = -2 + 4 * Xtr(:,2); ytr = testfun(Xtr); % 测试集:独立随机采样200个点 Ntest = 200; Xte = [-3 + 6*rand(Ntest,1), -2 + 4*rand(Ntest,1)]; yte = testfun(Xte);

注意rng(42)这行不能省。Kriging的训练过程和随机采样强相关,固定随机种子可以保证实验可复现,方便你调试时对比不同修改的效果。

testfun的定义可以直接放在脚本结尾:

function y = testfun(X) y = 5*sin(X(:,1)) + X(:,1).*X(:,2) + 0.8*X(:,2).^2; end

3.2 相关矩阵与负对数似然函数

接下来实现核心的相关矩阵计算函数。为了通用性,我做成一个单独函数文件corr_matrix.m,支持多维输入,核函数采用高斯型。

function R = corr_matrix(X1, X2, theta) n1 = size(X1,1); n2 = size(X2,1); R = zeros(n1, n2); for i = 1:n1 for j = 1:n2 d = abs(X1(i,:) - X2(j,:)); R(i,j) = exp(-sum(theta .* d.^2)); end end end

这个双重循环在小样本(几十个点)下完全没有性能问题,代码的易读性优先级最高。如果你追求效率,可以改写成向量化计算,但那样可读性会下降,新手容易看晕。

然后是核心的负对数似然计算函数。这里我采用了几个关键实践:对theta进行对数参数化(优化时搜索log_theta保证theta始终为正)、对相关矩阵加一个极小的对角线扰动防止奇异。

function [nlml, mu, sigma2, P] = kriging_loglik(log_theta, Xtr, ytr) theta = exp(log_theta); n = size(Xtr, 1); % 相关矩阵 + 数值稳定性扰动 R = corr_matrix(Xtr, Xtr, theta); R = R + 1e-10 * eye(n); % Cholesky分解求解 R^{-1} * v,比直接 inv(R) 稳定且快 P = chol(R, 'upper'); one = ones(n,1); Rinv_y = P \ (P' \ ytr); Rinv_one = P \ (P' \ one); mu = (one' * Rinv_y) / (one' * Rinv_one); resid = ytr - one * mu; Rinv_resid = P \ (P' \ resid); sigma2 = (resid' * Rinv_resid) / n; logdetR = 2 * sum(log(diag(P))); nlml = 0.5 * (n * log(sigma2) + logdetR + n * log(2*pi)); end

这里所有R \ v的求解都通过P \ (P' \ v)完成,原理是R = P' * P,先解下三角方程再解上三角方程,整个过程是数值稳定的。直接用inv(R)在R接近奇异时会给出离谱的结果,是新手最容易踩的坑。

P = chol(R, 'upper')返回上三角矩阵,代码中P'就是下三角矩阵。希望读者能记住这个模式,它会反复出现在Kriging的实现里。

3.3 预测函数:均值与方差一起输出

预测函数同样单独写成文件kriging_predict.m,它对每个待测点计算预测均值和预测方差。为了易读性,这里循环处理每个预测点:

function [yhat, mse] = kriging_predict(x_new, Xtr, ytr, theta, mu, sigma2, P) n = size(Xtr, 1); one = ones(n, 1); % 提前计算 one^T * R^{-1} * one,供方差公式使用 Rinv_one = P \ (P' \ one); denom = one' * Rinv_one; nx = size(x_new, 1); yhat = zeros(nx, 1); mse = zeros(nx, 1); for k = 1:nx % 当前点与所有训练样本的相关向量 d = abs(x_new(k,:) - Xtr); r = exp(-sum(theta .* d.^2, 2))'; Rinv_r = P \ (P' \ r'); yhat(k) = mu + (r' * Rinv_r) * (ytr - one * mu); u = one' * Rinv_r; mse(k) = sigma2 * (1 - r'*Rinv_r + (1 - u)^2 / denom); end end

注意其中的维度关系:r是1×n的行向量,Rinv_r是n×1的列向量,r' * Rinv_r是一个标量,对应公式中的r^T R^{-1} r。u = one' * Rinv_r也是标量,对应公式中的one^T R^{-1} r。mse输出直接对应预测方差s_hat^2,后面可以开方得到标准差,构造预测区间。

3.4 超参数搜索与最终效果验证

有了上述函数,主脚本里就可以进行完整的“训练-预测-评估”流程。超参数搜索采用多起点fminsearch,这里先给出完整流程:

% 多起点优化超参数 options = optimset('Display', 'off', 'MaxFunEvals', 3000, 'MaxIter', 3000); best_nlml = inf; for trial = 1:5 log_theta0 = log(0.05 + 0.95*rand(1, d)); [log_theta_trial, nlml_trial] = fminsearch(@(lt) kriging_loglik(lt, Xtr, ytr), ... log_theta0, options); if nlml_trial < best_nlml best_nlml = nlml_trial; log_theta_opt = log_theta_trial; end end theta_opt = exp(log_theta_opt); [~, mu_hat, sigma2_hat, P] = kriging_loglik(log_theta_opt, Xtr, ytr); % 测试集预测 [yte_hat, mse_te] = kriging_predict(Xte, Xtr, ytr, theta_opt, mu_hat, sigma2_hat, P); % 评估指标 rmse = sqrt(mean((yte - yte_hat).^2)); mae = max(abs(yte - yte_hat)); sst = sum((yte - mean(yte)).^2); sse = sum((yte - yte_hat).^2); r2 = 1 - sse / sst; fprintf('优化后的theta: %.4f, %.4f\n', theta_opt); fprintf('RMSE: %.4f\n', rmse); fprintf('MAE : %.4f\n', mae); fprintf('R2 : %.4f\n', r2);

在我设置的随机种子和测试集划分下,这个算例的RMSE在1.0左右,R²在0.95上下。需要说明的是,具体数值会随着rng(42)和训练样本数量变化,但这已经能反映出Kriging的基本能力:用30个训练样本预测200个随机点,趋势抓得住,数值不漂移。

如果你还想直观看到预测结果,可以生成一张预测响应面与真实响应面对比的图:

% 绘制预测面 [xg1, xg2] = meshgrid(linspace(-3,3,60), linspace(-2,2,60)); xg = [xg1(:), xg2(:)]; [yg_hat, ~] = kriging_predict(xg, Xtr, ytr, theta_opt, mu_hat, sigma2_hat, P); surf(xg1, xg2, reshape(yg_hat, size(xg1)), 'EdgeColor', 'none');

画出图来你会发现,预测面的主要峰谷位置和真实函数基本吻合,只是在边界区域和样本稀疏区域出现可接受的偏差。

4. 超参数优化与训练集构造:影响精度的两个关键开关

4.1 训练样本怎么取:拉丁超立方为什么比随机均匀更省样本

很多人第一次做代理模型,直接用rand生成随机均匀样本,这是能跑通,但效果往往差一口气。原因是随机均匀采样本质上是一种独立抽样,在样本量不大的情况下,很容易在某些子区域密集、某些子区域稀疏。Kriging的预测精度和样本空间分布的均匀性高度相关,空白区域的预测方差会明显偏大。

拉丁超立方采样的思路完全不同:先把每个维度均匀分成与样本量相同的层数,然后在每一层内只取一个点,打乱后组合成完整样本。这样每个维度上、每个区间段都必然有样本覆盖,二维平面上也能保证样本点分布“尽量不扎堆”。Matlab里一行代码就够:

X = lhsdesign(N, d);

我自己做代理模型的经验是,同样的样本量,拉丁超立方采样通常比随机均匀采样在测试集上的RMSE低10%~30%,尤其是在输入维度2~5维的场景下。如果你手头没有统计相关工具箱,也可以自己写分层采样:把每个维度等分成sqrt(N)份,在每格内取点,再随机配对。

4.2 样本量的经验法则:买多少样本才够用

Kriging虽然擅长小样本回归,但“小”也有下限。样本量太少,相关矩阵的信息不足,theta估计几乎是在乱猜;样本量太多,训练成本上升,但精度的边际收益迅速趋缓。以下是我根据实践总结的经验区间:

输入维度建议训练样本量备注
110~20响应简单时10个足够
220~50主流场景,性价比最高
330~80需要兼顾边界区域
560~150非线性强时尽量靠上限
10以上300+先考虑降维或换模型

这里有几个关键点。第一,样本量不是越多越好。当样本量增加到几百个时,corr_matrix中双重循环的计算量变成O(n²),Cholesky分解是O(n³),训练时间会明显上升。第二,如果真实仿真非常昂贵,确实只能负担20个样本,那也不要硬上高维问题,优先减少输入变量个数。第三,样本点的边界覆盖比内部密度更重要,Kriging在边界之外的预测极不可靠,所以训练样本一定要在每个维度的两端附近留点。

4.3 theta优化里的三个数值坑:对数参数化、多起点、jitter

第一个坑是直接优化theta本身。theta必须为正,但fminsearch这类无约束优化器不知道这个限制,一旦搜索到负数,相关函数变成指数增长,整个计算立刻爆炸。解决办法是把优化变量改成log_theta,在目标函数内部再执行theta = exp(log_theta)。这样任何实数log_theta映射出来的theta都为正,优化就变成了无约束问题。

第二个坑是fminsearch的初值敏感性。负对数似然函数在参数空间里往往有多个局部极小点,单起点优化很可能收敛到一个不合理的局部解,导致预测面剧烈震荡或过度平滑。我用的策略是多起点优化:随机生成5组log_theta初值,分别用fminsearch搜索,最后取负对数似然最小的那组。这个策略在二维问题上非常有效,几乎不需要额外的全局优化工具。

第三个坑是相关矩阵R的数值奇异。当某些样本点距离特别近,或者某个维度的theta被优化到非常大时,R的行列式可能趋近于0,Cholesky分解直接报错。标准的应对是给R的对角线加一个很小的常数,比如1e-10,这个操作在Kriging社区里叫“jitter”。它除了数值稳定作用外,还有一个隐含效果:加了jitter之后,预测不再严格插值,而是允许微小误差,这在实际含噪声的仿真数据里反而更合理。

4.4 如果预测精度不达标,先按这个顺序排查

我遇到不少人在实现Kriging后觉得“预测不准”,其实大部分时候不是Kriging本身的问题,而是数据或参数某个环节没有理顺。我建议按下面顺序排查:

第一,检查训练样本是否覆盖了输入空间的全部边界。如果某个变量只在中间范围采样,Kriging几乎不可能预测该变量边界附近的真实走向。这时补几个边界样本往往立竿见影。

第二,检查目标函数和输入变量的尺度。如果x1范围是[0, 1]而x2范围是[0, 1000],那么theta在两个维度上的最优值会差好几个数量级,优化会变得非常困难。做法是先归一化所有输入到[0,1]区间,再训练Kriging,预测时对新输入做同样的变换。

第三,检查相关函数指数项是否合适。高斯型相关函数默认指数是2,对应极度光滑的响应面。如果你的响应本身存在尖角、不连续或强局部变化,指数为2的核会过度平滑。可以把相关函数里的.^2改成.^p,用p=1或p=1.5试试。需要注意,修改后整个相关矩阵的变化会改变预测方差公式,但这属于Kriging的合理变体。

第四,也是最容易忽略的:检查训练数据里是否存在重复或近乎重复的样本点。两个样本点距离为0时,相关矩阵两行完全相同,几乎必现奇异。用unique按一定容差排除重复点后,很多“预测奇异”的问题立刻消失。

5. 预测方差怎么用、什么情况别硬上Kriging

5.1 预测方差不是摆设:不确定性驱动的智能加点

Kriging和普通回归模型最大的区别,就是它给出了每一点预测的不确定性。这份不确定性在工程上不是花架子,而是后续优化流程里最重要的决策依据。传统优化完全依赖预测值,预测值低就去尝试,但很容易陷入局部极小;带不确定性之后,我们不仅奖励“预测值好”的区域,还奖励“样本稀疏、不确定性大”的区域。

这就是贝叶斯优化里最经典的“高效全局优化”思路。它定义了一个提升概率或期望提升指标,比如:

EI(x) = (f_min - y_hat(x)) * Phi(z) + s(x) * phi(z)

其中z = (f_min - y_hat(x)) / s(x),Phi和phi分别是标准正态分布的累积函数和密度函数,f_min是当前观测到的最优响应值。这个公式的含义很明确:如果一个点预测值比当前最优值低,提升量越大越值得去;即使预测值不好,只要标准差s(x)足够大,说明那里还是一块“未经探索的处女地”,同样值得采样。Kriging提供的就是公式里的y_hat和s。

我用这套加点流程做过一个两变量优化任务,前20个初始样本的Kriging模型经过10轮智能加点后,找到的最优点已经非常接近真实全局最优,而传统网格搜索要跑上百次真实仿真。这就是预测方差的实际价值所在:它把“下一步去哪采样”这个决策变得有据可依。

5.2 外推的诱惑与代价

Kriging预测在训练样本范围内可以做到很准,但出了范围,预测质量会断崖式下跌。原因要回到相关函数的性质上:当预测点离所有训练样本都很远时,相关向量r的所有元素趋近于0,预测均值公式里第二项失效,预测结果直接回到全局均值mu_hat,预测方差则趋近于sigma_hat^2。换句话说,Kriging对没见过的区域给出的回答是“我不知道,但大概等于平均值”,而且方差会显著增大。

这个特性意味着Kriging本质上不是一个外推工具。我在实际中经常看到有人拿训练好的Kriging去预测远超训练范围的设计点,结果得到一个完全无意义的恒定值,还以为是代码写错了。正确做法是:当优化搜索范围必须超出初始训练空间时,把Kriging的预测方差作为约束条件——如果某个候选点预测方差超过阈值,就先做一次真实仿真补充采样,再重新拟合模型。这比强行外推可靠得多。

5.3 高维和噪声场景的边界条件

Kriging再香,也不是万能的。随着输入维度上升,它的训练样本需求量呈指数增长趋势。我个人的体验是维度超过10以后,同样精度需要的样本量会大到失去代理模型的性价比。这时首先应该尝试降低问题维度,其次才考虑换用神经网络或梯度提升树这类更适合高维数据的模型。

另一个被忽视的问题是含噪声数据。标准的Kriging是无噪声插值模型,训练样本点上的预测值和真实值严格相等。如果仿真输出本身带有随机噪声,不加处理的Kriging会在样本点间制造不必要的剧烈震荡,过拟合噪声。处理办法是在相关矩阵对角线加更大的jitter,相当于给模型引入一个“噪声方差”自由度。这种做法在数据含噪时能明显提升泛化性能,但需要重新推导似然函数,不能直接照搬前面的代码。简单做法是把对角扰动从1e-10提升到比如1e-3到1e-2,然后通过交叉验证选值。

我在多个场景里对比过Kriging和神经网络的边界:样本量小于100、维度小于6、仿真数据相对平滑时,Kriging稳定胜出;样本量到了几千、维度高且响应结构非常复杂时,神经网络的优势才真正体现出来。选模型之前先想清楚自己的数据处在哪个区间,比盲目追求“最新算法”重要得多。

5.4 我现在的实用决策清单

跑通了这套Kriging流程之后,我给自己整理了一份选择清单,遇到新的回归预测问题时先对照一遍:

问题特征我的选择
样本量<100,维度≤5直接用Kriging
样本量100~1000,维度≤5Kriging优先,配jitter处理噪声
维度>10,样本量不大先做特征筛选或降维,再考虑Kriging
维度>10,样本量很大转神经网络或梯度提升
需要在迭代中主动选点Kriging + 期望提升指标
主要做外推预测放弃代理模型,改做物理模型或增广训练范围

这套流程跑通之后,我在后续接手过的所有代理模型相关任务里,都保留了一个小习惯:优化完超参数后,把theta、训练样本、随机种子和数据归一化参数一起存成一个结构体。这样下次复现结果、或者在新数据上继续更新模型时,不用从头开始调参,节省的时间比想象中多得多。Kriging这个模型入门不难,真正难的是理解它的不确定性输出的含义,并把它用在正确的决策上。希望这篇文章能帮你少走一点弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询