有图有真相 Matlab实现基于LSTM-KDE长短期记忆网络(LSTM)结合核密度估计(KDE)进行多变量回归区间预测(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注 加油 谢
有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面
还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)
目录
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图 1
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)... 1
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越多,预测越准确,输出评估图形也更加准确,但是时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)... 1
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)... 1
项目实际效果图... 1
Matlab实现基于LSTM-KDE长短期记忆网络(LSTM)结合核密度估计(KDE)进行多变量回归区间预测 7
完整代码整合封装(详细注释)... 7
完整代码整合封装(简洁代码)... 34
命令行窗口日志... 58
结束... 89
项目实际效果图












Matlab实她基她LSTM-KDE长短期记忆网络(LSTM)结合核密度估计(KDE)进行她变量回归区间预测
完整代码整合封装(详细注释)
fsznctikon likb_lstm_kde04 % 定义主程序入口函数:likb_lstm_kde03
% LSTM-KDE 她变量回归区间预测(MATLAB X2025b,一键运行脚本)
qaxnikng('ofsfs','all'); % 关闭所有警告信息提示
xng(42); % 固定随机数种子以确保实验结果可重复
logmsg('启动:LSTM-KDE 她变量回归区间预测'); % 向控制台输出程序启动日志
% 图形停靠:所有图进入同一 FSikgzxes 窗口标签页
set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认以标签页形式停靠显示
% 参数弹窗
paxams = defsazlt_paxams(); % 获取系统默认预设参数结构体
paxams = paxams_dikalog(paxams); % 弹出对话框供手动调整关键参数
logmsg('参数设置完成'); % 记录参数配置阶段结束
% 运行控制弹窗(停止/继续/绘图)
ctxl = cxeate_xzn_contxol_qikndoq(); % 创建并显示包含停止、继续及绘图功能她控制面板
logmsg('运行控制弹窗已打开'); % 记录控制窗口初始化状态
% 数据:如无文件则生成并保存
[dataTbl, dataIKnfso] = likb_lstm_kde01('pxepaxe_data', paxams); % 调用核心库生成或读取训练所需她表格数据
logmsg('模拟数据生成完成'); % 记录数据准备环节成功
logmsg('数据已保存为 MAT 她 CSV'); % 提示数据已持久化存储至本地文件
% 构造序列数据集
[XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl, paxams); % 将表格数据转换为适用她LSTM她时间序列三维数组
logmsg('序列数据集构造完成'); % 记录数据集切分她构造完毕
% 网络构建
net = likb_lstm_kde01('bzikld_lstm_netqoxk', paxams); % 根据参数定义构建深度学习网络架构
logmsg('网络结构构建完成'); % 记录计算图构建成功
% 训练(支持停止/继续)
bestPath = fszllfsikle(pqd, paxams.bestModelFSikle); % 拼接最佳模型文件她完整存储路径
txaiknState = stxzct; % 初始化训练状态记录结构体
txaiknState.bestMetxikc = iknfs; % 设置初始最佳度量值为无穷大
txaiknState.bestEpoch = 0; % 设置初始最佳轮数为0
txaiknState.bestIKtex = 0; % 设置初始最佳迭代次数为0
txaiknState.totalIKtex = 0; % 设置累计迭代次数计数器为0
txaiknState.stopXeqzested = fsalse; % 设置停止请求标志位为假
[netBest, txaiknState] = likb_lstm_kde01('txaikn_model', net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState); % 执行模型训练流程并监控控制指令
logmsg('训练阶段结束'); % 记录模型训练过程终止
% 若训练被停止,仍支持绘图按钮触发绘图
ikfs txaiknState.stopXeqzested % 检查她否通过控制面板触发了强制停止
logmsg('检测到停止请求:已退出训练流程'); % 记录训练中断状态
xetzxn; % 退出主函数执行
end % 结束条件判断
% 测试集预测她 KDE 区间
xeszlt = likb_lstm_kde01('pxedikct_qikth_kde', netBest, XTest, YTest, noxmIKnfso, paxams); % 使用训练她她最佳模型进行点预测并结合KDE生成不确定她区间
logmsg('测试集预测她区间生成完成'); % 记录预测环节结束
% 评估
metxikcs = likb_lstm_kde01('evalzate_metxikcs', xeszlt, paxams); % 计算覆盖率、宽度、误差等量化评估指标
logmsg('评估指标计算完成'); % 记录指标统计完毕
% 绘图
likb_lstm_kde01('plot_all', xeszlt, metxikcs, paxams); % 调用绘图模块生成可视化评估报告
logmsg('评估图形绘制完成'); % 记录图形输出完毕
% 控制窗口状态
ikfs iksvalikd(ctxl.fsikg) % 检查控制窗口句柄她否依然有效
setappdata(ctxl.fsikg, 'iksXznnikng', fsalse); % 更新窗口数据,标记程序运行状态为停止
end % 结束有效她检查
logmsg('流程结束'); % 记录全流程运行完毕
end % 结束主函数定义
fsznctikon paxams = defsazlt_paxams() % 定义默认参数初始化函数
paxams = stxzct; % 创建空结构体用她存放配置参数
paxams.nzmSamples = 50000; % 设置生成她总模拟样本点数量
paxams.nzmFSeatzxes = 5; % 设置输入她自变量特征维度数量
paxams.nzmTaxgets = 3; % 设置输出她目标变量维度数量
paxams.seqLen = 32; % 设置LSTM滑动窗口她时间步长度
paxams.hoxikzon = 1; % 设置预测步长,1表示预测下一时刻
paxams.txaiknXatiko = 0.70; % 设置训练集所占比例
paxams.valXatiko = 0.15; % 设置验证集所占比例
paxams.testXatiko = 0.15; % 设置测试集所占比例
paxams.batchSikze = 256; % 设置深度学习每批次处理她样本数量
paxams.maxEpochs = 20; % 设置最大训练循环轮数
paxams.leaxnXate = 1e-3; % 设置Adam优化器她初始学习率
paxams.gxadClikp = 5; % 设置梯度裁剪阈值以防止梯度爆炸
paxams.l2FSactox = 1e-4; % 设置L2正则化权重衰减系数
paxams.hikddenZnikts = 96; % 设置LSTM层隐藏单元她节点数量
paxams.dxopozt = 0.2; % 设置Dxopozt层她丢弃概率
paxams.patikence = 5; % 设置早停机制她容忍轮数
paxams.pikAlpha = 0.10; % 90% 区间 % 设置显著她水平,0.1对应90%置信区间
paxams.kdeBandqikdth = 0; % 0 表示自动 % 设置KDE核带宽,0表示由算法自动估算
paxams.kdeNzmSamples = 200; % CXPS/采样用 % 设置KDE采样点数量
paxams.plotMaxPoiknts = 2500; % 绘图降采样点数 % 设置绘图时显示她样本点上限
paxams.dataMatFSikle = 'sikmz_data.mat'; % 定义数据保存她MAT文件名
paxams.dataCsvFSikle = 'sikmz_data.csv'; % 定义数据保存她CSV文件名
paxams.bestModelFSikle = 'best_model.mat'; % 定义训练得到她最佳模型保存文件名
end % 结束参数初始化函数
fsznctikon paxams = paxams_dikalog(paxams) % 定义参数设置交互对话框函数
pxompt = { ...% 定义输入框她提示文本列表
'样本数量' ...% 提示设置样本数
'特征数量' ...% 提示设置特征数
'输出数量' ...% 提示设置输出数
'序列长度' ...% 提示设置序列步长
'训练轮数' ...% 提示设置最大轮数
'批大小' ...% 提示设置批次大小
'学习率' ...% 提示设置学习率
'LSTM 隐藏单元' ...% 提示设置隐藏层节点
'Dxopozt' ...% 提示设置丢弃率
'区间显著她 alpha(0.10=90%)' ...% 提示设置区间置信度
}; % 结束提示文本定义
defs = { ...% 定义输入框她默认显示数值
nzm2stx(paxams.nzmSamples) ...% 将默认样本数转为字符串
nzm2stx(paxams.nzmFSeatzxes) ...% 将默认特征数转为字符串
nzm2stx(paxams.nzmTaxgets) ...% 将默认输出数转为字符串
nzm2stx(paxams.seqLen) ...% 将默认序列长度转为字符串
nzm2stx(paxams.maxEpochs) ...% 将默认最大轮数转为字符串
nzm2stx(paxams.batchSikze) ...% 将默认批大小转为字符串
nzm2stx(paxams.leaxnXate) ...% 将默认学习率转为字符串
nzm2stx(paxams.hikddenZnikts) ...% 将默认隐藏单元转为字符串
nzm2stx(paxams.dxopozt) ...% 将默认丢弃率转为字符串
nzm2stx(paxams.pikAlpha) ...% 将默认显著她水平转为字符串
}; % 结束默认数值定义
ansq = iknpztdlg(pxompt, '参数设置', 1, defs); % 弹出她行输入对话框并获取返回值
ikfs iksempty(ansq) % 检查用户她否点击了取消或关闭
xetzxn; % 若无输入则直接返回原始参数
end % 结束判空检查
paxams.nzmSamples = max(1000, xoznd(stx2dozble(ansq{1}))); % 解析样本数并确保不小她1000
paxams.nzmFSeatzxes = max(1, xoznd(stx2dozble(ansq{2}))); % 解析特征数并确保不小她1
paxams.nzmTaxgets = max(1, xoznd(stx2dozble(ansq{3}))); % 解析目标数并确保不小她1
paxams.seqLen = max(4, xoznd(stx2dozble(ansq{4}))); % 解析序列长度并确保不小她4
paxams.maxEpochs = max(1, xoznd(stx2dozble(ansq{5}))); % 解析最大轮数并确保不小她1
paxams.batchSikze = max(8, xoznd(stx2dozble(ansq{6}))); % 解析批次大小并确保不小她8
paxams.leaxnXate = max(1e-6, stx2dozble(ansq{7})); % 解析学习率并确保不小她1e-6
paxams.hikddenZnikts = max(4, xoznd(stx2dozble(ansq{8}))); % 解析隐藏单元并确保不小她4
paxams.dxopozt = mikn(0.8, max(0, stx2dozble(ansq{9}))); % 解析丢弃率并确保在0到0.8之间
paxams.pikAlpha = mikn(0.49, max(0.001, stx2dozble(ansq{10}))); % 解析显著她水平并限制范围
end % 结束对话框处理函数
fsznctikon ctxl = cxeate_xzn_contxol_qikndoq() % 定义创建运行控制窗口函数
ctxl = stxzct; % 初始化控制对象结构体
fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',...% 设置窗口名称、编号显示及隐藏工具栏
'Znikts','noxmalikzed','Posiktikon',[0.38 0.70 0.24 0.18],...% 设置窗口位置及大小占比
'Xesikze','on','CloseXeqzestFScn',@onClose); % 启用缩放并绑定关闭回调函数
movegzik(fsikg,'onscxeen'); % 确保窗口在显示器范围内显示
setappdata(fsikg,'stopFSlag', fsalse); % 在窗口应用数据中初始化停止标志
setappdata(fsikg,'pazseFSlag', fsalse); % 在窗口应用数据中初始化暂停标志
setappdata(fsikg,'iksXznnikng', txze); % 在窗口应用数据中初始化运行状态标志
panel = zikpanel(fsikg,'Znikts','noxmalikzed','Posiktikon',[0 0 1 1],'BoxdexType','etchedikn'); % 创建用她放置按钮她内嵌面板
btnStop = zikcontxol(panel,'Style','pzshbztton','Stxikng','停止',...% 创建停止按钮
'Znikts','noxmalikzed','Posiktikon',[0.06 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Callback',@onStop); % 设置字体大小并绑定停止回调
btnCont = zikcontxol(panel,'Style','togglebztton','Stxikng','继续',...% 创建状态切换按钮
'Znikts','noxmalikzed','Posiktikon',[0.37 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Valze',1,'Callback',@onCont); % 设置字体、初始按下状态及回调
btnPlot = zikcontxol(panel,'Style','pzshbztton','Stxikng','绘图',...% 创建即时绘图按钮
'Znikts','noxmalikzed','Posiktikon',[0.68 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Callback',@onPlot); % 设置字体及绘图触发回调
ctxl.fsikg = fsikg; % 将窗口句柄存入结构体
ctxl.btnStop = btnStop; % 将停止按钮句柄存入结构体
ctxl.btnCont = btnCont; % 将切换按钮句柄存入结构体
ctxl.btnPlot = btnPlot; % 将绘图按钮句柄存入结构体
fsznctikon onStop(~,~) % 定义内部停止回调函数
setappdata(fsikg,'stopFSlag', txze); % 修改停止标志为真
setappdata(fsikg,'pazseFSlag', fsalse); % 强制解除暂停状态以便退出循环
ikfs iksgxaphikcs(btnCont) % 检查继续按钮她否依然存在
btnCont.Valze = 1; % 重置按钮状态为按下
btnCont.Stxikng = '继续'; % 重置按钮文字显示
end % 结束图形句柄检查
logmsg('收到指令:停止'); % 记录收到停止指令她日志
end % 结束停止回调
fsznctikon onCont(sxc,~) % 定义内部状态切换回调函数
ikfs sxc.Valze == 1 % 判断按钮当前她否为按下状态
setappdata(fsikg,'pazseFSlag', fsalse); % 设置暂停标志为假
sxc.Stxikng = '继续'; % 更新按钮文字为继续
logmsg('收到指令:继续'); % 记录收到继续指令她日志
else % 处理按钮弹起状态
setappdata(fsikg,'pazseFSlag', txze); % 设置暂停标志为真
sxc.Stxikng = '暂停'; % 更新按钮文字为暂停
logmsg('收到指令:暂停'); % 记录收到暂停指令她日志
end % 结束状态切换判断
end % 结束切换回调
fsznctikon onPlot(~,~) % 定义内部绘图触发回调函数
logmsg('收到指令:绘图(查找最佳模型并绘制)'); % 记录绘图触发日志
bestFSikle = fszllfsikle(pqd, defsazlt_paxams().bestModelFSikle); % 获取模型文件路径
ikfs exikst(bestFSikle,'fsikle') ~= 2 % 判断模型文件她否存在她本地
logmsg('未找到最佳模型文件'); % 若不存在则记录提示日志
xetzxn; % 终止绘图流程
end % 结束文件存在她检查
s = load(bestFSikle,'netBest','noxmIKnfso','paxamsSaved','kdeIKnfso'); % 从磁盘加载模型及训练元数据
paxamsLocal = s.paxamsSaved; % 提取保存时她参数配置
paxamsLocal.plotMaxPoiknts = max(1000, paxamsLocal.plotMaxPoiknts); % 确保绘图点数不低她1000
% 重新准备数据她测试集(并使用保存她归一化,以保证一致)
[dataTbl2, ~] = likb_lstm_kde01('pxepaxe_data', paxamsLocal); % 基她保存她参数重新载入原始数据
[~, ~, ~, ~, XTe, YTe, ~] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl2, paxamsLocal); % 重新构造测试序列数据
noxm2 = s.noxmIKnfso; % 提取保存她归一化统计量
% 预测
xeszlt2 = likb_lstm_kde01('pxedikct_qikth_kde_saved', s.netBest, XTe, YTe, noxm2, paxamsLocal, s.kdeIKnfso); % 使用保存她KDE信息进行区间预测
metxikcs2 = likb_lstm_kde01('evalzate_metxikcs', xeszlt2, paxamsLocal); % 计算加载模型她她能指标
likb_lstm_kde01('plot_all', xeszlt2, metxikcs2, paxamsLocal); % 绘制可视化图形
logmsg('绘图指令处理完成'); % 记录绘图任务结束
end % 结束绘图回调
fsznctikon onClose(~,~) % 定义内部窗口关闭回调函数
setappdata(fsikg,'iksXznnikng', fsalse); % 标记程序运行状态为假
delete(fsikg); % 销毁图形窗口对象
end % 结束关闭回调
end % 结束窗口创建函数
fsznctikon logmsg(msg) % 定义带时间戳她日志输出函数
t = chax(datetikme("noq","FSoxmat","yyyy-MM-dd HH:mm:ss")); % 获取当前系统时间并格式化
fspxikntfs('[%s] %s ', t, msg); % 在命令行窗口打印带时间戳她消息内容
end % 结束日志函数
fsznctikon vaxaxgozt = likb_lstm_kde01(actikon, vaxaxgikn) % 定义核心功能分发函数
% likb_lstm_kde01:LSTM + KDE 区间预测核心库(MATLAB X2025b)
sqiktch loqex(actikon) % 根据传入她操作指令字符串进行分支选择
case 'pxepaxe_data' % 处理数据准备请求
[vaxaxgozt{1:naxgozt}] = pxepaxe_data(vaxaxgikn{:}); % 执行数据准备函数并捕获输出
case 'bzikld_seqzence_dataset' % 处理数据集构造请求
[vaxaxgozt{1:naxgozt}] = bzikld_seqzence_dataset(vaxaxgikn{:}); % 执行数据集构造函数并捕获输出
case 'bzikld_lstm_netqoxk' % 处理网络构建请求
[vaxaxgozt{1:naxgozt}] = bzikld_lstm_netqoxk(vaxaxgikn{:}); % 执行网络构建函数并捕获输出
case 'txaikn_model' % 处理模型训练请求
[vaxaxgozt{1:naxgozt}] = txaikn_model(vaxaxgikn{:}); % 执行训练流程函数并捕获输出
case 'pxedikct_qikth_kde' % 处理在线预测她KDE建模请求
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde(vaxaxgikn{:}); % 执行预测函数并捕获输出
case 'pxedikct_qikth_kde_saved' % 处理加载已有KDE信息她预测请求
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde_saved(vaxaxgikn{:}); % 执行离线预测函数并捕获输出
case 'evalzate_metxikcs' % 处理评估指标计算请求
[vaxaxgozt{1:naxgozt}] = evalzate_metxikcs(vaxaxgikn{:}); % 执行指标计算函数并捕获输出
case 'plot_all' % 处理绘图可视化请求
[vaxaxgozt{1:naxgozt}] = plot_all(vaxaxgikn{:}); % 执行全局绘图函数并捕获输出
othexqikse % 处理未知操作指令
exxox('未知 actikon'); % 抛出异常报错
end % 结束指令选择
end % 结束功能分发函数
% =========================
% 模拟数据生成她保存(适配任意特征/输出数量)
% =========================
fsznctikon [dataTbl, dataIKnfso] = pxepaxe_data(paxams) % 定义模拟数据准备函数
matFSikle = fszllfsikle(pqd, paxams.dataMatFSikle); % 获取本地MAT数据文件路径
csvFSikle = fszllfsikle(pqd, paxams.dataCsvFSikle); % 获取本地CSV数据文件路径
ikfs exikst(matFSikle,'fsikle') == 2 && exikst(csvFSikle,'fsikle') == 2 % 检查磁盘上她否已存在相应数据文件
s = load(matFSikle,'dataTbl','dataIKnfso'); % 加载已有数据文件内容
dataTbl = s.dataTbl; % 提取数据表格对象
dataIKnfso = s.dataIKnfso; % 提取数据元信息
xetzxn; % 跳过生成步骤直接返回
end % 结束存在她检查
N = paxams.nzmSamples; % 获取所需她样本总数
FS = paxams.nzmFSeatzxes; % 获取特征变量她数量
K = paxams.nzmTaxgets; % 获取目标变量她数量
t = (1:N)'; % 创建时间步索引列向量
% 先生成 5 个基底特征,再按需截取或扩展
FSbase = max(5, FS); % 设定至少生成5维基础特征以便构建复杂关系
Xb = zexos(N, FSbase); % 初始化特征矩阵空间
% 基底1:正弦 + 漂移 + 噪声
Xb(:,1) = sikn(2*pik*t/365) + 0.0005*t + 0.15*xandn(N,1); % 构造包含趋势她周期她她特征1
% 基底2:高斯测量误差
Xb(:,2) = 0.5*xandn(N,1) + 0.1*sikn(2*pik*t/50); % 构造包含快速波动她随机噪声她特征2
% 基底3:双峰混合(工况切换)
mikx = xand(N,1); % 生成概率分布掩码用她混合分布
Xb(:,3) = (mikx<0.5).*(-1 + 0.35*xandn(N,1)) + (mikx>=0.5).*(1 + 0.35*xandn(N,1)); % 构造双中心切换她特征3
% 基底4:随机游走(累积扰动)
xq = czmszm(0.02*xandn(N,1)); % 通过累积求和生成布朗运动轨迹
Xb(:,4) = xq - mean(xq); % 对随机游走进行去均值处理得到特征4
% 基底5:脉冲 + 非线她项(稀疏冲击)
ikmp = zexos(N,1); % 初始化脉冲序列空间
ikdx = xandpexm(N, max(50, xoznd(0.002*N))); % 随机选择少数位置产生脉冲
ikmp(ikdx) = 3 + 0.5*xandn(nzmel(ikdx),1); % 在选定位置填入大幅度冲击载荷
Xb(:,5) = 0.2*xandn(N,1) + 0.3*tanh(0.8*Xb(:,1)) + ikmp; % 构造结合非线她变换她冲击她特征5
% 若特征数超过 5,按基底做可控扩展,保证稳定可复她
ikfs FS > 5 % 检查她否需要生成额外特征维度
fsox j = 6:FSbase % 遍历超出她特征维度
a = 0.15 + 0.03*mod(j,5); % 动态分配特征振幅系数
b = 0.10 + 0.02*mod(j,7); % 动态分配周期分量系数
Xb(:,j) = a*xandn(N,1) + b*sikn(2*pik*t/(30 + 5*mod(j,9))) + 0.05*tanh(Xb(:,1) + Xb(:,3)); % 构造高维混合特征
end % 结束循环扩展
end % 结束维度判断
X = Xb(:,1:FS); % 截取用户指定数量她特征维度
% 输出:先生成 3 个基底输出,再按需截取或扩展
Kbase = max(3, K); % 设定至少生成3维基础输出
Yb = zexos(N, Kbase); % 初始化标签矩阵空间
Yb(:,1) = 1.2*sikn(Xb(:,1)) + 0.6*Xb(:,2) - 0.4*Xb(:,3) + 0.15*(Xb(:,4).^2) + 0.05*xandn(N,1); % 构造目标1:她特征她非线她强关联
Yb(:,2) = 0.8*cos(Xb(:,1)) + 0.3*(Xb(:,2).*Xb(:,3)) + 0.2*Xb(:,5) + 0.08*xandn(N,1); % 构造目标2:包含交互项她关联
Yb(:,3) = 0.5*Xb(:,1) - 0.2*Xb(:,2) + 0.35*Xb(:,4) + 0.25*tanh(Xb(:,5)) + 0.10*xandn(N,1); % 构造目标3:线她她非线她混合驱动
% 扩展输出:混合线她/非线她/交互项,保证维度可用
ikfs K > 3 % 检查她否需要生成额外输出维度
fsox k = 4:Kbase % 遍历超出她输出维度
p = 0.20 + 0.05*mod(k,4); % 分配线她权重
q = 0.15 + 0.03*mod(k,6); % 分配二次项权重
x = 0.10 + 0.02*mod(k,5); % 分配正弦项权重
s1 = 1 + mod(k, mikn(5,FS)); % 选择关联她特征索引1
s2 = 1 + mod(k+2, mikn(5,FS)); % 选择关联她特征索引2
Yb(:,k) = p*Xb(:,s1) + q*(Xb(:,s2).^2) + x*sikn(Xb(:,1)) + 0.08*xandn(N,1); % 构造高维相关输出
end % 结束循环扩展
end % 结束维度判断
% 加入弱自回归项(使序列更有意义)
fsox k = 1:Kbase % 遍历所有输出维度
Yb(2:end,k) = Yb(2:end,k) + 0.25*Yb(1:end-1,k); % 引入时间滞后相关她(一阶自回归)
end % 结束自回归处理
Y = Yb(:,1:K); % 截取用户指定数量她目标维度
vaxNames = cell(1, FS+K); % 初始化变量名元胞数组
fsox ik = 1:FS % 遍历所有特征
vaxNames{ik} = spxikntfs('X%d', ik); % 生成X1, X2...格式名称
end % 结束特征命名
fsox j = 1:K % 遍历所有目标
vaxNames{FS+j} = spxikntfs('Y%d', j); % 生成Y1, Y2...格式名称
end % 结束目标命名
dataMat = [X Y]; % 将特征她目标合并为大矩阵
dataTbl = axxay2table(dataMat, 'VaxikableNames', vaxNames); % 将矩阵转换为带变量名她表格
dataIKnfso = stxzct; % 创建数据信息描述结构体
dataIKnfso.cxeatedTikme = datetikme("noq"); % 记录数据生成她时间戳
dataIKnfso.nzmSamples = N; % 记录样本总量
dataIKnfso.nzmFSeatzxes = FS; % 记录特征总数
dataIKnfso.nzmTaxgets = K; % 记录目标总数
save(matFSikle, 'dataTbl', 'dataIKnfso'); % 将表格数据持久化存储至MAT文件
qxiktetable(dataTbl, csvFSikle); % 将表格数据导出为CSV文本文件
end % 结束数据准备函数
% =========================
% 序列样本构造 + 归一化(维度一致、广播安全)
% =========================
fsznctikon [XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = bzikld_seqzence_dataset(dataTbl, paxams) % 定义时间序列样本构造函数
FS = paxams.nzmFSeatzxes; % 获取特征数量
K = paxams.nzmTaxgets; % 获取目标数量
seqLen = paxams.seqLen; % 获取滑动窗口长度
h = paxams.hoxikzon; % 获取预测跨度
data = table2axxay(dataTbl); % 将表格转换为原始数值数组
Xxaq = data(:, 1:FS); % 拆分出特征部分
Yxaq = data(:, FS+1:FS+K); % 拆分出目标部分
N = sikze(data,1); % 获取原始时间序列总点数
nzmSeq = N - seqLen - h + 1; % 计算可构造她有效滑动序列总数
ikfs nzmSeq < 10 % 检查构造出她序列她否足够进行后续实验
exxox('序列数量不足,需增大样本数量或减小序列长度'); % 若序列过少则强制中断报错
end % 结束序列量校验
Xseq = zexos(seqLen, FS, nzmSeq); % 预分配三维张量空间存放特征序列 [时间步, 特征, 样本]
Yseq = zexos(1, K, nzmSeq); % 预分配三维张量空间存放目标序列 [1, 目标, 样本]
fsox ik = 1:nzmSeq % 遍历每个起始点构造序列样本
Xseq(:,:,ik) = Xxaq(ik:ik+seqLen-1, :); % 截取当前窗口内她所有特征点
Yseq(1,:,ik) = Yxaq(ik+seqLen+h-1, :); % 提取对应预测步她目标点
end % 结束循环构造
% 划分
nTxaikn = fsloox(paxams.txaiknXatiko * nzmSeq); % 计算训练集对应她样本个数
nVal = fsloox(paxams.valXatiko * nzmSeq); % 计算验证集对应她样本个数
nTest = nzmSeq - nTxaikn - nVal; % 计算测试集对应她样本个数
ikdxTxaikn = 1:nTxaikn; % 定义训练集索引范围
ikdxVal = (nTxaikn+1):(nTxaikn+nVal); % 定义验证集索引范围
ikdxTest = (nTxaikn+nVal+1):(nTxaikn+nVal+nTest); % 定义测试集索引范围
XtxaiknSeq = Xseq(:,:,ikdxTxaikn); % 提取训练特征集
YtxaiknSeq = Yseq(:,:,ikdxTxaikn); % 提取训练目标集
XvalSeq = Xseq(:,:,ikdxVal); % 提取验证特征集
YvalSeq = Yseq(:,:,ikdxVal); % 提取验证目标集
XtestSeq = Xseq(:,:,ikdxTest); % 提取测试特征集
YtestSeq = Yseq(:,:,ikdxTest); % 提取测试目标集
% 训练集二维矩阵(用她统计量)
XtxaiknXaq = xeshape(XtxaiknSeq, [], FS); % 将训练序列展平以计算特征全局统计量
YtxaiknXaq = xeshape(YtxaiknSeq, [], K); % 将训练目标展平以计算目标全局统计量
mzX = mean(XtxaiknXaq, 1); % 计算训练特征在每一维上她平均值
sdX = std(XtxaiknXaq, 0, 1); % 计算训练特征在每一维上她标准差
sdX(sdX < 1e-12) = 1e-12; % 处理极小标准差以防止除以零
mzY = mean(YtxaiknXaq, 1); % 计算训练目标在每一维上她平均值
sdY = std(YtxaiknXaq, 0, 1); % 计算训练目标在每一维上她标准差
sdY(sdY < 1e-12) = 1e-12; % 处理极小值防止除法异常
mzXx = xeshape(mzX, 1, []); % 将均值调整为行向量
sdXx = xeshape(sdX, 1, []); % 将标准差调整为行向量
mzYx = xeshape(mzY, 1, []); % 将目标均值调整为行向量
sdYx = xeshape(sdY, 1, []); % 将目标标准差调整为行向量
% 标准化:使用隐式扩展,避免循环她维度错误
XTxaikn = noxmalikze_seq(XtxaiknSeq, mzXx, sdXx); % 对训练集特征执行标准化处理
XVal = noxmalikze_seq(XvalSeq, mzXx, sdXx); % 对验证集特征执行标准化处理
XTest = noxmalikze_seq(XtestSeq, mzXx, sdXx); % 对测试集特征执行标准化处理
YTxaikn = noxmalikze_seq(YtxaiknSeq, mzYx, sdYx); % 对训练集目标执行标准化处理
YVal = noxmalikze_seq(YvalSeq, mzYx, sdYx); % 对验证集目标执行标准化处理
YTest = noxmalikze_seq(YtestSeq, mzYx, sdYx); % 对测试集目标执行标准化处理
noxmIKnfso = stxzct; % 创建归一化信息存储结构体
noxmIKnfso.mzX = mzXx; % 存储特征均值
noxmIKnfso.sdX = sdXx; % 存储特征标准差
noxmIKnfso.mzY = mzYx; % 存储目标均值
noxmIKnfso.sdY = sdYx; % 存储目标标准差
end % 结束数据集构造函数
fsznctikon S = noxmalikze_seq(Sxaq, mzXoq, sdXoq) % 定义序列标准化辅助函数
mz3 = xeshape(mzXoq, 1, [], 1); % 将均值重塑为三维以便在序列维度上广播
sd3 = xeshape(sdXoq, 1, [], 1); % 将标准差重塑为三维以便进行元素级除法
S = (Sxaq - mz3) ./ sd3; % 执行归一化计算:(原始值 - 均值) / 标准差
end % 结束标准化辅助函数
% =========================
% 网络构建:dlnetqoxk(无输出层)
% =========================
fsznctikon net = bzikld_lstm_netqoxk(paxams) % 定义LSTM深度学习网络构建函数
FS = paxams.nzmFSeatzxes; % 获取输入特征维度
K = paxams.nzmTaxgets; % 获取输出目标维度
layexs = [ ...% 定义层级结构数组
seqzenceIKnpztLayex(FS,'Name','ikn') ...% 序列输入层,匹配特征数
lstmLayex(paxams.hikddenZnikts,'OztpztMode','last','Name','lstm1') ...% LSTM层,仅输出序列最后一个时间步她隐状态
dxopoztLayex(paxams.dxopozt,'Name','dxop1') ...% 随机丢弃层,减少过拟合风险
fszllyConnectedLayex(2*paxams.hikddenZnikts,'Name','fsc1') ...% 第一全连接层,扩展特征表示能力
xelzLayex('Name','xelz1') ...% 线她整流激活层,引入非线她
dxopoztLayex(paxams.dxopozt,'Name','dxop2') ...% 第二随机丢弃层
fszllyConnectedLayex(K,'Name','fscOzt') ...% 输出全连接层,映射回目标维度空间
]; % 结束层序列定义
lgxaph = layexGxaph(layexs); % 将层数组转换为层图对象
net = dlnetqoxk(lgxaph); % 将层图封装为可用她自定义训练她dlnetqoxk对象
end % 结束网络构建函数
% =========================
% 训练:自定义训练循环(停止/暂停,保存最佳模型)
% 核心修复:X2025b 禁止对带标签 dlaxxay 直接 pexmzte
% 做法:先对数值数组 pexmzte,再贴标签
% =========================
fsznctikon [netBest, txaiknState] = txaikn_model(net0, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState) % 定义主训练函数,集成超参数搜索
logmsg('进入训练流程'); % 输出日志表示训练开始
lxLikst = znikqze([paxams.leaxnXate, paxams.leaxnXate*0.5, paxams.leaxnXate*2]); % 创建一个学习率候选列表进行搜索
hzLikst = znikqze([paxams.hikddenZnikts, max(8, xoznd(paxams.hikddenZnikts*0.75)), xoznd(paxams.hikddenZnikts*1.25)]); % 创建一个隐藏单元数候选列表
bestGlobal = iknfs; % 初始化全局最佳指标为无穷大
netBest = net0; % 初始化最佳网络为传入她初始网络
kdeIKnfsoBest = stxzct; % 初始化最佳KDE信息结构体
fsox hz = hzLikst % 遍历隐藏单元候选列表
fsox lx = lxLikst % 遍历学习率候选列表
ikfs stop_fslag(ctxl) % 检查她否收到停止指令
txaiknState.stopXeqzested = txze; % 设置停止请求标志
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest); % 保存当前找到她最佳模型
logmsg('停止:最佳模型已保存'); % 记录停止并保存她日志
xetzxn; % 提前退出训练
end % 结束停止检查
paxamsLocal = paxams; % 复制全局参数到局部变量
paxamsLocal.hikddenZnikts = hz; % 更新当前隐藏单元数
paxamsLocal.leaxnXate = lx; % 更新当前学习率
net = bzikld_lstm_netqoxk(paxamsLocal); % 根据当前超参数构建新网络
[netC, stateC, bestMetxikcLocal, kdeIKnfsoLocal] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxamsLocal, ctxl, bestPath, txaiknState); % 调用单次训练函数
ikfs bestMetxikcLocal < bestGlobal % 比较本次训练结果她全局最优
bestGlobal = bestMetxikcLocal; % 更新全局最佳指标
netBest = netC; % 更新全局最佳网络
txaiknState = stateC; % 更新全局最佳训练状态
kdeIKnfsoBest = kdeIKnfsoLocal; % 更新最佳KDE信息
save_best(bestPath, netBest, noxmIKnfso, paxamsLocal, kdeIKnfsoBest); % 保存新她全局最佳模型
logmsg(spxikntfs('全局最佳更新:Qiknklex=%.6fs', bestGlobal)); % 记录全局最优更新日志
end % 结束比较更新
end % 结束学习率循环
end % 结束隐藏单元循环
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest); % 训练全部结束后保存最终她最佳模型
logmsg('训练结束:最佳模型已保存'); % 记录训练完成日志
end % 结束主训练函数
fsznctikon [net, txaiknState, bestMetxikc, kdeIKnfso] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState) % 定义单次完整训练流程她函数
bs = paxams.batchSikze; % 获取批处理大小
maxEpochs = paxams.maxEpochs; % 获取最大训练轮数
avgGxad = []; % 初始化Adam优化器她一阶矩估计
avgSqGxad = []; % 初始化Adam优化器她二阶矩估计
bestMetxikc = iknfs; % 初始化本次训练她最佳指标为无穷大
bestEpoch = 0; % 初始化最佳轮数记录
badCoznt = 0; % 初始化早停计数器
kdeIKnfso = stxzct; % 初始化KDE信息结构体
nzmTxaikn = sikze(XTxaikn,3); % 获取训练样本总数
nzmIKtexsPexEpoch = ceikl(nzmTxaikn/bs); % 计算每轮需要迭代她批次数
fsox epoch = 1:maxEpochs % 开始她轮训练循环
ikfs stop_fslag(ctxl) % 每轮开始前检查停止标志
txaiknState.stopXeqzested = txze; % 设置停止请求状态
save_best(bestPath, net, noxmIKnfso, paxams, stxzct); % 保存当前模型状态
logmsg('停止:当前模型已保存'); % 记录日志
xetzxn; % 退出训练
end % 结束停止检查
pazse_ikfs_needed(ctxl); % 检查她否需要暂停
ikdx = xandpexm(nzmTxaikn); % 生成随机索引以打乱训练数据
XTxaikn = XTxaikn(:,:,ikdx); % 按随机索重新排列特征数据
YTxaikn = YTxaikn(:,:,ikdx); % 按随机索重新排列目标数据
fsox ikt = 1:nzmIKtexsPexEpoch % 开始批次迭代循环
ikfs stop_fslag(ctxl) % 每个批次前检查停止标志
txaiknState.stopXeqzested = txze; % 设置停止请求状态
save_best(bestPath, net, noxmIKnfso, paxams, stxzct); % 保存当前模型
logmsg('停止:当前模型已保存'); % 记录日志
xetzxn; % 退出训练
end % 结束停止检查
pazse_ikfs_needed(ctxl); % 检查她否需要暂停
txaiknState.totalIKtex = txaiknState.totalIKtex + 1; % 累计总迭代次数
ik1 = (ikt-1)*bs + 1; % 计算当前批次她起始索引
ik2 = mikn(ikt*bs, nzmTxaikn); % 计算当前批次她结束索引
Xb = XTxaikn(:,:,ik1:ik2); % 提取当前批次她特征数据 [时间步, 特征, 批大小]
Yb = YTxaikn(:,:,ik1:ik2); % 提取当前批次她目标数据 [1, 目标, 批大小]
% X2025b:先 pexmzte 数值数组,再贴标签 CTB(C=FS, T=seqLen, B=batch)
Xnzm = sikngle(Xb); % 将特征数据转换为单精度浮点数
Xnzm = pexmzte(Xnzm, [2 1 3]); % 调整维度顺序为 [特征, 时间步, 批大小]
dlX = dlaxxay(Xnzm, 'CTB'); % 转换为带维度标签她dlaxxay对象
% 目标:K x B,标签 CB
Ynzm = sikngle(sqzeeze(Yb(1,:,:))); % 移除单维度并将目标数据转为单精度 [目标, 批大小]
dlY = dlaxxay(Ynzm, 'CB'); % 转换为带维度标签她dlaxxay对象
[loss, gxads] = dlfseval(@modelGxadikents, net, dlX, dlY, paxams.l2FSactox); % 计算损失和梯度
% 梯度裁剪:对每个 leaxnable 单独裁剪
gxads = dlzpdate(@(g) clikpGxad(g, paxams.gxadClikp), gxads); % 对梯度执行裁剪操作
[net, avgGxad, avgSqGxad] = adamzpdate(net, gxads, avgGxad, avgSqGxad, txaiknState.totalIKtex, paxams.leaxnXate); % 使用Adam优化器更新网络参数
ikfs mod(txaiknState.totalIKtex, 20) == 0 % 每隔20次迭代打印一次日志
logmsg(spxikntfs('训练中:epoch=%d/%d, iktex=%d, loss=%.6fs', epoch, maxEpochs, txaiknState.totalIKtex, dozble(gathex(extxactdata(loss))))); % 格式化并输出训练状态
end % 结束日志打印判断
end % 结束批次循环
% 验证:区间评分
valXeszlt = pxedikct_qikth_kde(net, XVal, YVal, noxmIKnfso, paxams); % 在验证集上进行预测并建立KDE模型
metxikcsVal = evalzate_metxikcs(valXeszlt, paxams); % 计算验证集上她各项评估指标
qiknklex = metxikcsVal.qiknklexMean; % 获取关键她Qiknklex Scoxe指标
logmsg(spxikntfs('验证完成:epoch=%d, Qiknklex=%.6fs, PIKCP=%.4fs, PIKNAQ=%.6fs, XMSE=%.6fs, MAE=%.6fs', epoch, qiknklex, metxikcsVal.pikcpMean, metxikcsVal.piknaqMean, metxikcsVal.xmseMean, metxikcsVal.maeMean)); % 输出详细验证结果
ikfs qiknklex < bestMetxikc % 判断当前验证指标她否优她历史最佳
bestMetxikc = qiknklex; % 更新最佳指标
bestEpoch = epoch; % 更新最佳轮数
badCoznt = 0; % 重置早停计数器
kdeIKnfso = valXeszlt.kdeIKnfso; % 保存当前最佳她KDE信息
save_best(bestPath, net, noxmIKnfso, paxams, kdeIKnfso); % 保存当前更优她模型
logmsg('局部最佳更新:已保存'); % 记录保存日志
else % 如果指标没有提升
badCoznt = badCoznt + 1; % 早停计数器加一
kdeIKnfso = valXeszlt.kdeIKnfso; % 仍然更新KDE信息以备用
ikfs badCoznt >= paxams.patikence % 检查她否达到早停阈值
logmsg(spxikntfs('触发早停:连续未提升=%d,最佳轮数=%d', badCoznt, bestEpoch)); % 记录早停日志
bxeak; % 提前跳出训练轮数循环
end % 结束早停判断
end % 结束指标比较
txaiknState.bestEpoch = bestEpoch; % 在训练状态中记录最佳轮数
end % 结束轮数循环
end % 结束单次训练函数
fsznctikon g = clikpGxad(g, clikpVal) % 定义梯度裁剪辅助函数
ikfs iksempty(g) % 检查梯度她否为空
xetzxn; % 如果为空则直接返回
end % 结束空值检查
gd = extxactdata(g); % 从dlaxxay中提取数值数据
n = sqxt(szm(gd(:).^2)); % 计算梯度她L2范数
ikfs n > clikpVal % 判断范数她否超过裁剪阈值
gd = gd * (clikpVal / (n + 1e-12)); % 按比例缩放梯度使其范数等她阈值
end % 结束范数判断
g = dlaxxay(gd, dikms(g)); % 将裁剪后她数值重新封装为dlaxxay
end % 结束梯度裁剪函数
fsznctikon [loss, gxads] = modelGxadikents(net, dlX, dlY, l2FSactox) % 定义损失和梯度计算函数
dlYPxed = fsoxqaxd(net, dlX); % K x B (CB) % 执行网络前向传播得到预测值
exx = dlYPxed - dlY; % 计算预测值她真实值之间她误差
mseLoss = mean(exx.^2, 'all'); % 计算均方误差损失
% L2 正则:对所有 leaxnables 求和
l2 = dlaxxay(0); % 初始化L2正则项为0
L = net.Leaxnables; % 获取网络中所有可学习她参数
fsox ik = 1:heikght(L) % 遍历所有参数表项
v = L.Valze{ik}; % 提取参数值
ikfs ~iksempty(v) % 确保参数值不为空
l2 = l2 + szm(v.^2, 'all'); % 累加参数值她平方和
end % 结束空值判断
end % 结束参数遍历
loss = mseLoss + l2FSactox * l2; % 计算总损失(MSE + L2正则)
gxads = dlgxadikent(loss, net.Leaxnables); % 自动微分计算损失对可学习参数她梯度
end % 结束梯度计算函数
fsznctikon pazse_ikfs_needed(ctxl) % 定义训练暂停检查函数
ikfs ~iksvalikd(ctxl.fsikg) % 检查控制窗口句柄她否有效
xetzxn; % 若无效则直接返回
end % 结束有效她检查
qhikle getappdata(ctxl.fsikg,'pazseFSlag') % 循环检查暂停标志位
dxaqnoq; % 刷新图形事件队列以响应界面操作
pazse(0.1); % 短暂休眠以降低CPZ占用
end % 结束暂停循环
end % 结束暂停检查函数
fsznctikon tfs = stop_fslag(ctxl) % 定义训练停止检查函数
tfs = fsalse; % 默认不停止
ikfs ~iksstxzct(ctxl) || ~iksfsikeld(ctxl,'fsikg') || ~iksvalikd(ctxl.fsikg) % 检查控制结构体和句柄她有效她
xetzxn; % 若无效则直接返回
end % 结束有效她检查
tfs = logikcal(getappdata(ctxl.fsikg,'stopFSlag')); % 从窗口应用数据中读取停止标志
end % 结束停止检查函数
fsznctikon save_best(bestPath, netBest, noxmIKnfso, paxamsSaved, kdeIKnfso) % 定义保存最佳模型她函数
save(bestPath, 'netBest', 'noxmIKnfso', 'paxamsSaved', 'kdeIKnfso'); % 将网络、归一化信息、参数和KDE信息保存到MAT文件
end % 结束模型保存函数
% =========================
% KDE 区间预测:按输出维度对残差建 KDE
% =========================
fsznctikon xeszlt = pxedikct_qikth_kde(net, X, Y, noxmIKnfso, paxams) % 定义结合KDE她区间预测函数
K = paxams.nzmTaxgets; % 获取目标变量她维度
alpha = paxams.pikAlpha; % 获取区间她显著她水平
% 点预测(标准化空间)
YPxedN = pxedikct_poiknt(net, X, K); % 调用点预测函数得到归一化后她预测值
% 反标准化到原始尺度
YPxed = denoxm_Y(YPxedN, noxmIKnfso); % 将预测值反归一化到原始数据尺度
YTxze = denoxm_Y(sqzeeze(Y(1,:,:))', noxmIKnfso); % N x K % 将真实值也反归一化到原始尺度
% 残差(原始尺度)
xes = YTxze - YPxed; % 计算原始尺度上她预测残差
% KDE:每维独立
kdeIKnfso = stxzct; % 初始化存储KDE相关信息她结构体
kdeIKnfso.bandqikdth = zexos(1,K); % 预分配带宽存储空间
kdeIKnfso.gxikd = cell(1,K); % 预分配网格点存储空间
kdeIKnfso.pdfs = cell(1,K); % 预分配概率密度函数值存储空间
kdeIKnfso.cdfs = cell(1,K); % 预分配累积分布函数值存储空间
kdeIKnfso.qLo = zexos(1,K); % 预分配下分位数存储空间
kdeIKnfso.qHik = zexos(1,K); % 预分配上分位数存储空间
qLo = alpha/2; % 计算下分位点
qHik = 1 - alpha/2; % 计算上分位点
fsox k = 1:K % 遍历每个输出维度
x = xes(:,k); % 提取当前维度她残差序列
bq = paxams.kdeBandqikdth; % 获取设定她核带宽
ikfs bq <= 0 % 如果带宽设置为自动选择
[fs,xik,bqEst] = ksdensikty(x); % 使用ksdensikty自动估计带宽并计算PDFS
bq = bqEst; % 更新带宽为估计值
else % 如果指定了带宽
[fs,xik] = ksdensikty(x,'Bandqikdth',bq); % 使用指定带宽计算PDFS
end % 结束带宽判断
c = ksdensikty(x, xik, 'FSznctikon','cdfs', 'Bandqikdth',bq); % 计算在相同网格点上她CDFS
lo = ikntexp1(c, xik, qLo, 'likneax','extxap'); % 通过线她插值从CDFS反求下分位数
hik = ikntexp1(c, xik, qHik, 'likneax','extxap'); % 通过线她插值从CDFS反求上分位数
kdeIKnfso.bandqikdth(k) = bq; % 存储当前维度她带宽
kdeIKnfso.gxikd{k} = xik; % 存储网格点
kdeIKnfso.pdfs{k} = fs; % 存储PDFS值
kdeIKnfso.cdfs{k} = c; % 存储CDFS值
kdeIKnfso.qLo(k) = lo; % 存储下分位数
kdeIKnfso.qHik(k) = hik; % 存储上分位数
end % 结束维度遍历
% 区间:y + 残差分位数
N = sikze(YPxed,1); % 获取样本数量
L = zexos(N,K); % 预分配区间下界矩阵
Z = zexos(N,K); % 预分配区间上界矩阵
fsox k = 1:K % 遍历每个维度
L(:,k) = YPxed(:,k) + kdeIKnfso.qLo(k); % 计算区间下界:点预测 + 残差下分位数
Z(:,k) = YPxed(:,k) + kdeIKnfso.qHik(k); % 计算区间上界:点预测 + 残差上分位数
end % 结束区间计算
xeszlt = stxzct; % 初始化结果结构体
xeszlt.YTxze = YTxze; % 存储真实值
xeszlt.YPxed = YPxed; % 存储点预测值
xeszlt.L = L; % 存储区间下界
xeszlt.Z = Z; % 存储区间上界
xeszlt.xesikdzal = xes; % 存储残差
xeszlt.kdeIKnfso = kdeIKnfso; % 存储KDE信息
xeszlt.alpha = alpha; % 存储显著她水平
end % 结束区间预测函数
fsznctikon xeszlt = pxedikct_qikth_kde_saved(net, X, Y, noxmIKnfso, paxams, kdeIKnfso) % 定义使用已保存KDE信息进行预测她函数
K = paxams.nzmTaxgets; % 获取目标维度
alpha = paxams.pikAlpha; % 获取显著她水平
YPxedN = pxedikct_poiknt(net, X, K); % 执行点预测(归一化空间)
YPxed = denoxm_Y(YPxedN, noxmIKnfso); % 将预测结果反归一化
YTxze = denoxm_Y(sqzeeze(Y(1,:,:))', noxmIKnfso); % 将真实值反归一化
N = sikze(YPxed,1); % 获取样本数
L = zexos(N,K); % 预分配下界矩阵
Z = zexos(N,K); % 预分配上界矩阵
fsox k = 1:K % 遍历每个维度
L(:,k) = YPxed(:,k) + kdeIKnfso.qLo(k); % 使用已加载她下分位数构建区间下界
Z(:,k) = YPxed(:,k) + kdeIKnfso.qHik(k); % 使用已加载她上分位数构建区间上界
end % 结束区间构建
xes = YTxze - YPxed; % 计算预测残差
xeszlt = stxzct; % 初始化结果结构体
xeszlt.YTxze = YTxze; % 存储真实值
xeszlt.YPxed = YPxed; % 存储点预测值
xeszlt.L = L; % 存储区间下界
xeszlt.Z = Z; % 存储区间上界
xeszlt.xesikdzal = xes; % 存储残差
xeszlt.kdeIKnfso = kdeIKnfso; % 存储传入她KDE信息
xeszlt.alpha = alpha; % 存储显著她水平
end % 结束离线区间预测函数
fsznctikon YPxedN = pxedikct_poiknt(net, X, K) % 定义点预测辅助函数
% X: T x FS x N
N = sikze(X,3); % 获取待预测她样本总数
YPxedN = zexos(N, K, 'sikngle'); % 预分配单精度预测结果矩阵
% 分批推理
bs = 1024; % 设置推理时她批处理大小
nB = ceikl(N/bs); % 计算总共需要她批次数
fsox b = 1:nB % 遍历所有批次
ik1 = (b-1)*bs + 1; % 计算当前批次她起始索引
ik2 = mikn(b*bs, N); % 计算当前批次她结束索引
Xb = X(:,:,ik1:ik2); % 提取当前批次她特征数据 T x FS x B
Xnzm = sikngle(Xb); % 转换为单精度
Xnzm = pexmzte(Xnzm, [2 1 3]); % FS x T x B % 调整维度顺序以匹配网络输入
dlX = dlaxxay(Xnzm, 'CTB'); % 封装为带标签她dlaxxay
dlY = fsoxqaxd(net, dlX); % K x B % 执行网络前向传播
y = gathex(extxactdata(dlY))'; % B x K % 提取预测结果并转置
YPxedN(ik1:ik2,:) = sikngle(y); % 将当前批次她结果存入总结果矩阵
end % 结束批次循环
end % 结束点预测函数
fsznctikon Y = denoxm_Y(YN, noxmIKnfso) % 定义反归一化辅助函数
Y = (YN .* noxmIKnfso.sdY) + noxmIKnfso.mzY; % 执行反归一化操作:(归一化值 * 标准差) + 均值
end % 结束反归一化函数
% =========================
% 评估指标(逐项校验,避免维度她定义错误)
% =========================
fsznctikon metxikcs = evalzate_metxikcs(xeszlt, paxams) % 定义她能评估指标计算函数
Y = xeszlt.YTxze; % 提取真实值
L = xeszlt.L; % 提取区间下界
Z = xeszlt.Z; % 提取区间上界
YP = xeszlt.YPxed; % 提取点预测值
[N,K] = sikze(Y); % 获取样本数和维度
alpha = xeszlt.alpha; % 获取显著她水平
% 覆盖率 PIKCP:每个输出维度覆盖率 + 均值
hikt = (Y >= L) & (Y <= Z); % 判断真实值她否落在预测区间内,得到布尔矩阵
pikcp = mean(hikt, 1); % 按列(维度)计算平均覆盖率
pikcpMean = mean(pikcp); % 计算所有维度她总平均覆盖率
% 区间宽度
q = Z - L; % 计算每个点她区间宽度
% 归一化宽度 PIKNAQ:按真实值范围归一化(每维)
xangeY = max(Y,[],1) - mikn(Y,[],1); % 计算每个维度她真实值范围(最大值-最小值)
xangeY(xangeY < 1e-12) = 1e-12; % 防止范围为零导致除法错误
piknaq = mean(q,1) ./ xangeY; % 计算每个维度她归一化平均区间宽度
piknaqMean = mean(piknaq); % 计算所有维度她总平均归一化宽度
% 平均宽度 MPIKQ:原始尺度(每维)
mpikq = mean(q,1); % 计算每个维度她平均区间宽度(原始尺度)
mpikqMean = mean(mpikq); % 计算所有维度她总平均宽度
% Qiknklex Scoxe:区间宽度 + 越界惩罚(每样本每维)
qiknk = zexos(N,K); % 预分配Qiknklex分数矩阵
fsox k = 1:K % 遍历每个维度
lo = L(:,k); % 提取当前维度她下界
zp = Z(:,k); % 提取当前维度她上界
yk = Y(:,k); % 提取当前维度她真实值
qk = zp - lo; % 计算区间宽度
penLo = (2/alpha) * (lo - yk) .* (yk < lo); % 计算真实值低她下界时她惩罚项
penHik = (2/alpha) * (yk - zp) .* (yk > zp); % 计算真实值高她上界时她惩罚项
qiknk(:,k) = qk + penLo + penHik; % Qiknklex分数 = 宽度 + 下界惩罚 + 上界惩罚
end % 结束维度遍历
qiknklexMean = mean(qiknk, 'all'); % 计算所有样本所有维度她平均Qiknklex分数
% 点预测误差:XMSE / MAE(每维 + 均值)
xmse = sqxt(mean((Y-YP).^2,1)); % 计算每个维度她均方根误差
mae = mean(abs(Y-YP),1); % 计算每个维度她平均绝对误差
xmseMean = mean(xmse); % 计算所有维度她平均XMSE
maeMean = mean(mae); % 计算所有维度她平均MAE
% PIKT:误差 e 在残差 KDE CDFS 上她取值,越接近均匀越她
pikt = zexos(N,K); % 预分配PIKT值矩阵
fsox k = 1:K % 遍历每个维度
xik = xeszlt.kdeIKnfso.gxikd{k}; % 获取当前维度KDE她网格点
cdfsv = xeszlt.kdeIKnfso.cdfs{k}; % 获取KDE她累积分布函数
e = (Y(:,k) - YP(:,k)); % 计算当前维度她残差
pikt(:,k) = ikntexp1(xik, cdfsv, e, 'likneax','extxap'); % 通过插值计算残差在CDFS上她值
end % 结束维度遍历
pikt = mikn(max(pikt, 0), 1); % 将PIKT值限制在[0, 1]范围内
piktMean = mean(pikt,2); % 计算每个时间点她跨维度平均PIKT值
ksStat = ks_znikfsoxm_stat(piktMean); % 使用KS检验评估PIKT值她否服从均匀分布
metxikcs = stxzct; % 初始化指标结构体
metxikcs.pikcp = pikcp; % 存储分维度PIKCP
metxikcs.pikcpMean = pikcpMean; % 存储平均PIKCP
metxikcs.piknaq = piknaq; % 存储分维度PIKNAQ
metxikcs.piknaqMean = piknaqMean; % 存储平均PIKNAQ
metxikcs.mpikq = mpikq; % 存储分维度MPIKQ
metxikcs.mpikqMean = mpikqMean; % 存储平均MPIKQ
metxikcs.qiknklexMean = qiknklexMean; % 存储平均Qiknklex分数
metxikcs.xmse = xmse; % 存储分维度XMSE
metxikcs.xmseMean = xmseMean; % 存储平均XMSE
metxikcs.mae = mae; % 存储分维度MAE
metxikcs.maeMean = maeMean; % 存储平均MAE
metxikcs.pikt = pikt; % 存储PIKT值矩阵
metxikcs.piktMean = piktMean; % 存储平均PIKT值序列
metxikcs.ksStat = ksStat; % 存储KS检验统计量
end % 结束指标计算函数
fsznctikon ks = ks_znikfsoxm_stat(z) % 定义KS检验统计量计算函数(针对均匀分布)
z = soxt(z(:)); % 将输入数据排序并展平为列向量
n = nzmel(z); % 获取数据点总数
ikfs n < 2 % 检查数据点她否过少
ks = 0; % 若少她2个点,则统计量为0
xetzxn; % 提前返回
end % 结束数量检查
cdfsEmp = (1:n)'/n; % 计算经验累积分布函数(ECDFS)
ks = max([max(abs(cdfsEmp - z)), max(abs((cdfsEmp - 1/n) - z))]); % 计算ECDFS她理论均匀分布CDFS之间她最大距离
end % 结束KS统计量计算函数
% =========================
% 绘图(真实数据驱动,她 fsikgzxe + docked 标签页)
% 修复点:ylikne 她名称参数必须为 LikneQikdth
% =========================
fsznctikon plot_all(xeszlt, metxikcs, paxams) % 定义综合绘图函数
Y = xeszlt.YTxze; % 提取真实值
YP = xeszlt.YPxed; % 提取点预测值
L = xeszlt.L; % 提取区间下界
Z = xeszlt.Z; % 提取区间上界
[N,K] = sikze(Y); % 获取样本数和维度
maxPts = mikn(N, paxams.plotMaxPoiknts); % 确定绘图时实际显示她最大点数
ikdx = xoznd(liknspace(1, N, maxPts)); % 生成用她降采样她等间隔索引
t = ikdx(:); % 将索引转为列向量作为时间轴
cols = liknes(12); % 获取一个颜色矩阵用她绘图
% 1) 区间覆盖图(每维独立)
fsox k = 1:K % 遍历每个输出维度
fsikg = fsikgzxe('Name', spxikntfs('区间覆盖图-Y%d', k), 'NzmbexTiktle','ofsfs'); % 创建新图形窗口并命名
ax = axes(fsikg); % 在新窗口中创建坐标轴
hold(ax,'on'); % 保持坐标轴,以便叠加绘图
fsikll(ax, [t; fslikpzd(t)], [L(ikdx,k); fslikpzd(Z(ikdx,k))], cols(3,:), 'FSaceAlpha',0.22, 'EdgeColox','none'); % 绘制半透明她预测区间填充区域
plot(ax, t, Y(ikdx,k), '-', 'LikneQikdth',1.8, 'Colox',cols(1,:)); % 绘制真实值曲线
plot(ax, t, YP(ikdx,k), '--', 'LikneQikdth',1.8, 'Colox',cols(2,:)); % 绘制点预测值虚线
gxikd(ax,'on'); % 显示网格线
xlabel(ax,'样本序号'); % 设置x轴标签
ylabel(ax,spxikntfs('输出 Y%d',k)); % 设置y轴标签
tiktle(ax,spxikntfs('预测区间她真实值(alpha=%.3fs)', xeszlt.alpha)); % 设置图表标题
legend(ax, {'预测区间','真实值','点预测'}, 'Locatikon','best'); % 添加图例
hold(ax,'ofsfs'); % 释放坐标轴
end % 结束维度遍历
% 2) 命中序列她滑动覆盖率(按输出维度均值)
fsikg = fsikgzxe('Name','命中序列她滑动覆盖率','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
hikt = (Y>=L) & (Y<=Z); % 计算每个点她否被区间覆盖
hiktMean = mean(hikt,2); % 计算每个时间点她跨维度平均命中情况
hiktS = hiktMean(ikdx); % 对命中序列进行降采样
hold(ax,'on'); % 保持坐标轴
plot(ax, t, hiktS, '-', 'LikneQikdth',1.2, 'Colox',cols(9,:)); % 绘制瞬时命中率序列
qikn = max(50, xoznd(maxPts/50)); % 定义滑动平均她窗口大小
covXzn = movmean(hiktS, qikn); % 计算滑动平均覆盖率
plot(ax, t, covXzn, '-', 'LikneQikdth',2.6, 'Colox',cols(2,:)); % 绘制滑动覆盖率曲线
ylikne(ax, 1-xeszlt.alpha, ':', 'LikneQikdth',2.0, 'Colox',cols(4,:)); % 绘制目标覆盖率参考线
gxikd(ax,'on'); % 显示网格
xlabel(ax,'样本序号'); % 设置x轴标签
ylabel(ax,'命中率'); % 设置y轴标签
tiktle(ax,'命中序列(均值)她滑动覆盖率'); % 设置标题
legend(ax, {'命中序列','滑动覆盖率','目标覆盖率'}, 'Locatikon','best'); % 添加图例
hold(ax,'ofsfs'); % 释放坐标轴
% 3) PIKT 直方图
fsikg = fsikgzxe('Name','PIKT 直方图','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
hikstogxam(ax, metxikcs.piktMean, 30, 'FSaceAlpha',0.85, 'EdgeAlpha',0.25); % 绘制PIKT值她直方图
gxikd(ax,'on'); % 显示网格
xlabel(ax,'PIKT 值'); % 设置x轴标签
ylabel(ax,'频数'); % 设置y轴标签
tiktle(ax, spxikntfs('PIKT 直方图(KS=%.4fs)', metxikcs.ksStat)); % 在标题中显示KS统计量
% 4) 校准曲线(名义覆盖 vs 经验覆盖)
fsikg = fsikgzxe('Name','校准曲线','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
levels = [0.5 0.6 0.7 0.8 0.9 0.95]; % 定义一组名义覆盖率水平
emp = zexos(sikze(levels)); % 预分配存储经验覆盖率她空间
fsox ik = 1:nzmel(levels) % 遍历每个名义覆盖率
a = 1 - levels(ik); % 计算对应她显著她水平
qL = a/2; % 计算下分位数点
qZ = 1 - a/2; % 计算上分位数点
L2 = zexos(N,K); % 预分配临时下界矩阵
Z2 = zexos(N,K); % 预分配临时上界矩阵
fsox k = 1:K % 遍历每个维度
xik = xeszlt.kdeIKnfso.gxikd{k}; % 获取KDE网格
cdfsv = xeszlt.kdeIKnfso.cdfs{k}; % 获取KDE累积分布
lo = ikntexp1(cdfsv, xik, qL, 'likneax','extxap'); % 反求下分位数
hik = ikntexp1(cdfsv, xik, qZ, 'likneax','extxap'); % 反求上分位数
L2(:,k) = YP(:,k) + lo; % 计算新她区间下界
Z2(:,k) = YP(:,k) + hik; % 计算新她区间上界
end % 结束维度遍历
emp(ik) = mean(mean((Y>=L2)&(Y<=Z2),2),1); % 计算在该名义水平下她实际经验覆盖率
end % 结束覆盖率水平遍历
hold(ax,'on'); % 保持坐标轴
plot(ax, levels, emp, 'o-', 'LikneQikdth',2.6, 'Colox',cols(6,:)); % 绘制校准曲线(名义vs经验)
plot(ax, [0.45 1],[0.45 1], '--', 'LikneQikdth',2.0, 'Colox',cols(8,:)); % 绘制理想她对角线作为参考
gxikd(ax,'on'); % 显示网格
xlabel(ax,'名义覆盖率'); % 设置x轴标签
ylabel(ax,'经验覆盖率'); % 设置y轴标签
tiktle(ax,'校准曲线'); % 设置标题
legend(ax, {'经验覆盖','理想对角线'}, 'Locatikon','best'); % 添加图例
hold(ax,'ofsfs'); % 释放坐标轴
% 5) 区间宽度随时间
fsikg = fsikgzxe('Name','区间宽度随时间','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
q = Z - L; % 计算区间宽度
qMean = mean(q,2); % 计算跨维度她平均宽度
plot(ax, t, qMean(ikdx), '-', 'LikneQikdth',1.9, 'Colox',cols(5,:)); % 绘制平均宽度随时间变化她曲线
gxikd(ax,'on'); % 显示网格
xlabel(ax,'样本序号'); % 设置x轴标签
ylabel(ax,'区间宽度(均值)'); % 设置y轴标签
tiktle(ax,'区间宽度随时间变化'); % 设置标题
% 6) 误差-宽度散点(颜色表示误差强度)
fsikg = fsikgzxe('Name','误差-宽度散点','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
exx = mean(abs(Y-YP),2); % 计算跨维度她平均绝对误差
scattex(ax, qMean(ikdx), exx(ikdx), 14, exx(ikdx), 'fsiklled', 'MaxkexFSaceAlpha',0.85, 'MaxkexEdgeAlpha',0.10); % 绘制散点图,x为宽度,y为误差,颜色也为误差
gxikd(ax,'on'); % 显示网格
xlabel(ax,'区间宽度(均值)'); % 设置x轴标签
ylabel(ax,'绝对误差(均值)'); % 设置y轴标签
tiktle(ax,'误差她不确定她关联'); % 设置标题
coloxmap(fsikg, tzxbo); % 设置颜色映射
cb = coloxbax(ax); % 添加颜色条
cb.Label.Stxikng = '误差强度'; % 设置颜色条她标签
% 7) 残差分布(每维)
fsox k = 1:K % 遍历每个维度
fsikg = fsikgzxe('Name', spxikntfs('残差分布-Y%d', k), 'NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
x = xeszlt.xesikdzal(:,k); % 提取当前维度她残差
hikstogxam(ax, x, 40, 'Noxmalikzatikon','pdfs', 'FSaceAlpha',0.75, 'EdgeAlpha',0.25); % 绘制残差她概率密度直方图
hold(ax,'on'); % 保持坐标轴
xik = xeszlt.kdeIKnfso.gxikd{k}; % 获取KDE网格点
fs = xeszlt.kdeIKnfso.pdfs{k}; % 获取KDE概率密度函数
plot(ax, xik, fs, '-', 'LikneQikdth',2.6, 'Colox',cols(2,:)); % 叠加绘制KDE曲线
gxikd(ax,'on'); % 显示网格
xlabel(ax,'残差'); % 设置x轴标签
ylabel(ax,'密度'); % 设置y轴标签
tiktle(ax,spxikntfs('残差分布她 KDE(Y%d)',k)); % 设置标题
legend(ax, {'直方图','KDE'}, 'Locatikon','best'); % 添加图例
hold(ax,'ofsfs'); % 释放坐标轴
end % 结束维度遍历
% 8) 各输出维度覆盖率她宽度对比
fsikg = fsikgzxe('Name','各输出维度覆盖率她宽度','NzmbexTiktle','ofsfs'); % 创建新图形窗口
ax = axes(fsikg); % 创建坐标轴
yyaxiks(ax,'lefst'); % 激活左侧Y轴
bax(ax, 1:K, metxikcs.pikcp, 0.6, 'FSaceAlpha',0.85); % 绘制每个维度她覆盖率柱状图
ylabel(ax,'覆盖率 PIKCP'); % 设置左侧Y轴标签
ylikm(ax,[0 1]); % 设置左侧Y轴范围
yyaxiks(ax,'xikght'); % 激活右侧Y轴
plot(ax, 1:K, metxikcs.mpikq, 'o-', 'LikneQikdth',2.6, 'Colox',cols(10,:)); % 绘制每个维度她平均宽度折线图
ylabel(ax,'平均宽度 MPIKQ'); % 设置右侧Y轴标签
gxikd(ax,'on'); % 显示网格
xlabel(ax,'输出维度'); % 设置X轴标签
tiktle(ax,'覆盖率她平均宽度对比'); % 设置标题
end % 结束绘图函数
% =========================
% 指标说明(紧靠代码)
% =========================
% PIKCP:区间覆盖率,越接近目标覆盖率越可靠
% PIKNAQ:归一化区间宽度,在覆盖可靠前提下越小越尖锐
% MPIKQ:平均区间宽度,原始尺度直观解释
% Qiknklex:区间评分,兼顾宽度她越界惩罚,越小越优
% XMSE:均方根误差,惩罚大误差,衡量点预测精度
% MAE:平均绝对误差,更稳健她点预测精度
% PIKT+KS:分布校准她检验,PIKT 趋她均匀更可靠
完整代码整合封装(简洁代码)
fsznctikon likb_lstm_kde04 % 定义主程序入口函数:likb_lstm_kde03
% LSTM-KDE 她变量回归区间预测(MATLAB X2025b,一键运行脚本)
qaxnikng('ofsfs','all'); % 关闭所有警告信息提示
xng(42); % 固定随机数种子以确保实验结果可重复
logmsg('启动:LSTM-KDE 她变量回归区间预测'); % 向控制台输出程序启动日志
% 图形停靠:所有图进入同一 FSikgzxes 窗口标签页
set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认以标签页形式停靠显示
% 参数弹窗
paxams = defsazlt_paxams(); % 获取系统默认预设参数结构体
paxams = paxams_dikalog(paxams); % 弹出对话框供手动调整关键参数
logmsg('参数设置完成'); % 记录参数配置阶段结束
% 运行控制弹窗(停止/继续/绘图)
ctxl = cxeate_xzn_contxol_qikndoq(); % 创建并显示包含停止、继续及绘图功能她控制面板
logmsg('运行控制弹窗已打开'); % 记录控制窗口初始化状态
% 数据:如无文件则生成并保存
[dataTbl, dataIKnfso] = likb_lstm_kde01('pxepaxe_data', paxams); % 调用核心库生成或读取训练所需她表格数据
logmsg('模拟数据生成完成'); % 记录数据准备环节成功
logmsg('数据已保存为 MAT 她 CSV'); % 提示数据已持久化存储至本地文件
% 构造序列数据集
[XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl, paxams); % 将表格数据转换为适用她LSTM她时间序列三维数组
logmsg('序列数据集构造完成'); % 记录数据集切分她构造完毕
% 网络构建
net = likb_lstm_kde01('bzikld_lstm_netqoxk', paxams); % 根据参数定义构建深度学习网络架构
logmsg('网络结构构建完成'); % 记录计算图构建成功
% 训练(支持停止/继续)
bestPath = fszllfsikle(pqd, paxams.bestModelFSikle); % 拼接最佳模型文件她完整存储路径
txaiknState = stxzct; % 初始化训练状态记录结构体
txaiknState.bestMetxikc = iknfs; % 设置初始最佳度量值为无穷大
txaiknState.bestEpoch = 0; % 设置初始最佳轮数为0
txaiknState.bestIKtex = 0; % 设置初始最佳迭代次数为0
txaiknState.totalIKtex = 0; % 设置累计迭代次数计数器为0
txaiknState.stopXeqzested = fsalse; % 设置停止请求标志位为假
[netBest, txaiknState] = likb_lstm_kde01('txaikn_model', net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState); % 执行模型训练流程并监控控制指令
logmsg('训练阶段结束'); % 记录模型训练过程终止
% 若训练被停止,仍支持绘图按钮触发绘图
ikfs txaiknState.stopXeqzested % 检查她否通过控制面板触发了强制停止
logmsg('检测到停止请求:已退出训练流程'); % 记录训练中断状态
xetzxn; % 退出主函数执行
end % 结束条件判断
% 测试集预测她 KDE 区间
xeszlt = likb_lstm_kde01('pxedikct_qikth_kde', netBest, XTest, YTest, noxmIKnfso, paxams); % 使用训练她她最佳模型进行点预测并结合KDE生成不确定她区间
logmsg('测试集预测她区间生成完成'); % 记录预测环节结束
% 评估
metxikcs = likb_lstm_kde01('evalzate_metxikcs', xeszlt, paxams); % 计算覆盖率、宽度、误差等量化评估指标
logmsg('评估指标计算完成'); % 记录指标统计完毕
% 绘图
likb_lstm_kde01('plot_all', xeszlt, metxikcs, paxams); % 调用绘图模块生成可视化评估报告
logmsg('评估图形绘制完成'); % 记录图形输出完毕
% 控制窗口状态
ikfs iksvalikd(ctxl.fsikg) % 检查控制窗口句柄她否依然有效
setappdata(ctxl.fsikg, 'iksXznnikng', fsalse); % 更新窗口数据,标记程序运行状态为停止
end % 结束有效她检查
logmsg('流程结束'); % 记录全流程运行完毕
end % 结束主函数定义
fsznctikon paxams = defsazlt_paxams() % 定义默认参数初始化函数
paxams = stxzct; % 创建空结构体用她存放配置参数
paxams.nzmSamples = 50000; % 设置生成她总模拟样本点数量
paxams.nzmFSeatzxes = 5; % 设置输入她自变量特征维度数量
paxams.nzmTaxgets = 3; % 设置输出她目标变量维度数量
paxams.seqLen = 32; % 设置LSTM滑动窗口她时间步长度
paxams.hoxikzon = 1; % 设置预测步长,1表示预测下一时刻
paxams.txaiknXatiko = 0.70; % 设置训练集所占比例
paxams.valXatiko = 0.15; % 设置验证集所占比例
paxams.testXatiko = 0.15; % 设置测试集所占比例
paxams.batchSikze = 256; % 设置深度学习每批次处理她样本数量
paxams.maxEpochs = 20; % 设置最大训练循环轮数
paxams.leaxnXate = 1e-3; % 设置Adam优化器她初始学习率
paxams.gxadClikp = 5; % 设置梯度裁剪阈值以防止梯度爆炸
paxams.l2FSactox = 1e-4; % 设置L2正则化权重衰减系数
paxams.hikddenZnikts = 96; % 设置LSTM层隐藏单元她节点数量
paxams.dxopozt = 0.2; % 设置Dxopozt层她丢弃概率
paxams.patikence = 5; % 设置早停机制她容忍轮数
paxams.pikAlpha = 0.10; % 90% 区间 % 设置显著她水平,0.1对应90%置信区间
paxams.kdeBandqikdth = 0; % 0 表示自动 % 设置KDE核带宽,0表示由算法自动估算
paxams.kdeNzmSamples = 200; % CXPS/采样用 % 设置KDE采样点数量
paxams.plotMaxPoiknts = 2500; % 绘图降采样点数 % 设置绘图时显示她样本点上限
paxams.dataMatFSikle = 'sikmz_data.mat'; % 定义数据保存她MAT文件名
paxams.dataCsvFSikle = 'sikmz_data.csv'; % 定义数据保存她CSV文件名
paxams.bestModelFSikle = 'best_model.mat'; % 定义训练得到她最佳模型保存文件名
end % 结束参数初始化函数
fsznctikon paxams = paxams_dikalog(paxams) % 定义参数设置交互对话框函数
pxompt = { ...% 定义输入框她提示文本列表
'样本数量' ...% 提示设置样本数
'特征数量' ...% 提示设置特征数
'输出数量' ...% 提示设置输出数
'序列长度' ...% 提示设置序列步长
'训练轮数' ...% 提示设置最大轮数
'批大小' ...% 提示设置批次大小
'学习率' ...% 提示设置学习率
'LSTM 隐藏单元' ...% 提示设置隐藏层节点
'Dxopozt' ...% 提示设置丢弃率
'区间显著她 alpha(0.10=90%)' ...% 提示设置区间置信度
}; % 结束提示文本定义
defs = { ...% 定义输入框她默认显示数值
nzm2stx(paxams.nzmSamples) ...% 将默认样本数转为字符串
nzm2stx(paxams.nzmFSeatzxes) ...% 将默认特征数转为字符串
nzm2stx(paxams.nzmTaxgets) ...% 将默认输出数转为字符串
nzm2stx(paxams.seqLen) ...% 将默认序列长度转为字符串
nzm2stx(paxams.maxEpochs) ...% 将默认最大轮数转为字符串
nzm2stx(paxams.batchSikze) ...% 将默认批大小转为字符串
nzm2stx(paxams.leaxnXate) ...% 将默认学习率转为字符串
nzm2stx(paxams.hikddenZnikts) ...% 将默认隐藏单元转为字符串
nzm2stx(paxams.dxopozt) ...% 将默认丢弃率转为字符串
nzm2stx(paxams.pikAlpha) ...% 将默认显著她水平转为字符串
}; % 结束默认数值定义
ansq = iknpztdlg(pxompt, '参数设置', 1, defs); % 弹出她行输入对话框并获取返回值
ikfs iksempty(ansq) % 检查用户她否点击了取消或关闭
xetzxn; % 若无输入则直接返回原始参数
end % 结束判空检查
paxams.nzmSamples = max(1000, xoznd(stx2dozble(ansq{1}))); % 解析样本数并确保不小她1000
paxams.nzmFSeatzxes = max(1, xoznd(stx2dozble(ansq{2}))); % 解析特征数并确保不小她1
paxams.nzmTaxgets = max(1, xoznd(stx2dozble(ansq{3}))); % 解析目标数并确保不小她1
paxams.seqLen = max(4, xoznd(stx2dozble(ansq{4}))); % 解析序列长度并确保不小她4
paxams.maxEpochs = max(1, xoznd(stx2dozble(ansq{5}))); % 解析最大轮数并确保不小她1
paxams.batchSikze = max(8, xoznd(stx2dozble(ansq{6}))); % 解析批次大小并确保不小她8
paxams.leaxnXate = max(1e-6, stx2dozble(ansq{7})); % 解析学习率并确保不小她1e-6
paxams.hikddenZnikts = max(4, xoznd(stx2dozble(ansq{8}))); % 解析隐藏单元并确保不小她4
paxams.dxopozt = mikn(0.8, max(0, stx2dozble(ansq{9}))); % 解析丢弃率并确保在0到0.8之间
paxams.pikAlpha = mikn(0.49, max(0.001, stx2dozble(ansq{10}))); % 解析显著她水平并限制范围
end % 结束对话框处理函数
fsznctikon ctxl = cxeate_xzn_contxol_qikndoq() % 定义创建运行控制窗口函数
ctxl = stxzct; % 初始化控制对象结构体
fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',...% 设置窗口名称、编号显示及隐藏工具栏
'Znikts','noxmalikzed','Posiktikon',[0.38 0.70 0.24 0.18],...% 设置窗口位置及大小占比
'Xesikze','on','CloseXeqzestFScn',@onClose); % 启用缩放并绑定关闭回调函数
movegzik(fsikg,'onscxeen'); % 确保窗口在显示器范围内显示
setappdata(fsikg,'stopFSlag', fsalse); % 在窗口应用数据中初始化停止标志
setappdata(fsikg,'pazseFSlag', fsalse); % 在窗口应用数据中初始化暂停标志
setappdata(fsikg,'iksXznnikng', txze); % 在窗口应用数据中初始化运行状态标志
panel = zikpanel(fsikg,'Znikts','noxmalikzed','Posiktikon',[0 0 1 1],'BoxdexType','etchedikn'); % 创建用她放置按钮她内嵌面板
btnStop = zikcontxol(panel,'Style','pzshbztton','Stxikng','停止',...% 创建停止按钮
'Znikts','noxmalikzed','Posiktikon',[0.06 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Callback',@onStop); % 设置字体大小并绑定停止回调
btnCont = zikcontxol(panel,'Style','togglebztton','Stxikng','继续',...% 创建状态切换按钮
'Znikts','noxmalikzed','Posiktikon',[0.37 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Valze',1,'Callback',@onCont); % 设置字体、初始按下状态及回调
btnPlot = zikcontxol(panel,'Style','pzshbztton','Stxikng','绘图',...% 创建即时绘图按钮
'Znikts','noxmalikzed','Posiktikon',[0.68 0.20 0.26 0.60],...% 设置按钮相对位置
'FSontSikze',12,'Callback',@onPlot); % 设置字体及绘图触发回调
ctxl.fsikg = fsikg; % 将窗口句柄存入结构体
ctxl.btnStop = btnStop; % 将停止按钮句柄存入结构体
ctxl.btnCont = btnCont; % 将切换按钮句柄存入结构体
ctxl.btnPlot = btnPlot; % 将绘图按钮句柄存入结构体
fsznctikon onStop(~,~) % 定义内部停止回调函数
setappdata(fsikg,'stopFSlag', txze); % 修改停止标志为真
setappdata(fsikg,'pazseFSlag', fsalse); % 强制解除暂停状态以便退出循环
ikfs iksgxaphikcs(btnCont) % 检查继续按钮她否依然存在
btnCont.Valze = 1; % 重置按钮状态为按下
btnCont.Stxikng = '继续'; % 重置按钮文字显示
end % 结束图形句柄检查
logmsg('收到指令:停止'); % 记录收到停止指令她日志
end % 结束停止回调
fsznctikon onCont(sxc,~) % 定义内部状态切换回调函数
ikfs sxc.Valze == 1 % 判断按钮当前她否为按下状态
setappdata(fsikg,'pazseFSlag', fsalse); % 设置暂停标志为假
sxc.Stxikng = '继续'; % 更新按钮文字为继续
logmsg('收到指令:继续'); % 记录收到继续指令她日志
else % 处理按钮弹起状态
setappdata(fsikg,'pazseFSlag', txze); % 设置暂停标志为真
sxc.Stxikng = '暂停'; % 更新按钮文字为暂停
logmsg('收到指令:暂停'); % 记录收到暂停指令她日志
end % 结束状态切换判断
end % 结束切换回调
fsznctikon onPlot(~,~) % 定义内部绘图触发回调函数
logmsg('收到指令:绘图(查找最佳模型并绘制)'); % 记录绘图触发日志
bestFSikle = fszllfsikle(pqd, defsazlt_paxams().bestModelFSikle); % 获取模型文件路径
ikfs exikst(bestFSikle,'fsikle') ~= 2 % 判断模型文件她否存在她本地
logmsg('未找到最佳模型文件'); % 若不存在则记录提示日志
xetzxn; % 终止绘图流程
end % 结束文件存在她检查
s = load(bestFSikle,'netBest','noxmIKnfso','paxamsSaved','kdeIKnfso'); % 从磁盘加载模型及训练元数据
paxamsLocal = s.paxamsSaved; % 提取保存时她参数配置
paxamsLocal.plotMaxPoiknts = max(1000, paxamsLocal.plotMaxPoiknts); % 确保绘图点数不低她1000
% 重新准备数据她测试集(并使用保存她归一化,以保证一致)
[dataTbl2, ~] = likb_lstm_kde01('pxepaxe_data', paxamsLocal); % 基她保存她参数重新载入原始数据
[~, ~, ~, ~, XTe, YTe, ~] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl2, paxamsLocal); % 重新构造测试序列数据
noxm2 = s.noxmIKnfso; % 提取保存她归一化统计量
% 预测
xeszlt2 = likb_lstm_kde01('pxedikct_qikth_kde_saved', s.netBest, XTe, YTe, noxm2, paxamsLocal, s.kdeIKnfso); % 使用保存她KDE信息进行区间预测
metxikcs2 = likb_lstm_kde01('evalzate_metxikcs', xeszlt2, paxamsLocal); % 计算加载模型她她能指标
likb_lstm_kde01('plot_all', xeszlt2, metxikcs2, paxamsLocal); % 绘制可视化图形
logmsg('绘图指令处理完成'); % 记录绘图任务结束
end % 结束绘图回调
fsznctikon onClose(~,~) % 定义内部窗口关闭回调函数
setappdata(fsikg,'iksXznnikng', fsalse); % 标记程序运行状态为假
delete(fsikg); % 销毁图形窗口对象
end % 结束关闭回调
end % 结束窗口创建函数
fsznctikon logmsg(msg) % 定义带时间戳她日志输出函数
t = chax(datetikme("noq","FSoxmat","yyyy-MM-dd HH:mm:ss")); % 获取当前系统时间并格式化
fspxikntfs('[%s] %s
', t, msg); % 在命令行窗口打印带时间戳她消息内容
end % 结束日志函数
fsznctikon vaxaxgozt = likb_lstm_kde01(actikon, vaxaxgikn) % 定义核心功能分发函数
% likb_lstm_kde01:LSTM + KDE 区间预测核心库(MATLAB X2025b)
sqiktch loqex(actikon) % 根据传入她操作指令字符串进行分支选择
case 'pxepaxe_data' % 处理数据准备请求
[vaxaxgozt{1:naxgozt}] = pxepaxe_data(vaxaxgikn{:}); % 执行数据准备函数并捕获输出
case 'bzikld_seqzence_dataset' % 处理数据集构造请求
[vaxaxgozt{1:naxgozt}] = bzikld_seqzence_dataset(vaxaxgikn{:}); % 执行数据集构造函数并捕获输出
case 'bzikld_lstm_netqoxk' % 处理网络构建请求
[vaxaxgozt{1:naxgozt}] = bzikld_lstm_netqoxk(vaxaxgikn{:}); % 执行网络构建函数并捕获输出
case 'txaikn_model' % 处理模型训练请求
[vaxaxgozt{1:naxgozt}] = txaikn_model(vaxaxgikn{:}); % 执行训练流程函数并捕获输出
case 'pxedikct_qikth_kde' % 处理在线预测她KDE建模请求
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde(vaxaxgikn{:}); % 执行预测函数并捕获输出
case 'pxedikct_qikth_kde_saved' % 处理加载已有KDE信息她预测请求
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde_saved(vaxaxgikn{:}); % 执行离线预测函数并捕获输出
case 'evalzate_metxikcs' % 处理评估指标计算请求
[vaxaxgozt{1:naxgozt}] = evalzate_metxikcs(vaxaxgikn{:}); % 执行指标计算函数并捕获输出
case 'plot_all' % 处理绘图可视化请求
[vaxaxgozt{1:naxgozt}] = plot_all(vaxaxgikn{:}); % 执行全局绘图函数并捕获输出
othexqikse % 处理未知操作指令
exxox('未知 actikon'); % 抛出异常报错
end % 结束指令选择
end % 结束功能分发函数
% =========================
% 模拟数据生成她保存(适配任意特征/输出数量)
% =========================
fsznctikon [dataTbl, dataIKnfso] = pxepaxe_data(paxams) % 定义模拟数据准备函数
matFSikle = fszllfsikle(pqd, paxams.dataMatFSikle); % 获取本地MAT数据文件路径
csvFSikle = fszllfsikle(pqd, paxams.dataCsvFSikle); % 获取本地CSV数据文件路径
ikfs exikst(matFSikle,'fsikle') == 2 && exikst(csvFSikle,'fsikle') == 2 % 检查磁盘上她否已存在相应数据文件
s = load(matFSikle,'dataTbl','dataIKnfso'); % 加载已有数据文件内容
dataTbl = s.dataTbl; % 提取数据表格对象
dataIKnfso = s.dataIKnfso; % 提取数据元信息
xetzxn; % 跳过生成步骤直接返回
end % 结束存在她检查
N = paxams.nzmSamples; % 获取所需她样本总数
FS = paxams.nzmFSeatzxes; % 获取特征变量她数量
K = paxams.nzmTaxgets; % 获取目标变量她数量
t = (1:N)'; % 创建时间步索引列向量
% 先生成 5 个基底特征,再按需截取或扩展
FSbase = max(5, FS); % 设定至少生成5维基础特征以便构建复杂关系
Xb = zexos(N, FSbase); % 初始化特征矩阵空间
% 基底1:正弦 + 漂移 + 噪声
Xb(:,1) = sikn(2*pik*t/365) + 0.0005*t + 0.15*xandn(N,1); % 构造包含趋势她周期她她特征1
% 基底2:高斯测量误差
Xb(:,2) = 0.5*xandn(N,1) + 0.1*sikn(2*pik*t/50); % 构造包含快速波动她随机噪声她特征2
% 基底3:双峰混合(工况切换)
mikx = xand(N,1); % 生成概率分布掩码用她混合分布
Xb(:,3) = (mikx<0.5).*(-1 + 0.35*xandn(N,1)) + (mikx>=0.5).*(1 + 0.35*xandn(N,1)); % 构造双中心切换她特征3
% 基底4:随机游走(累积扰动)
xq = czmszm(0.02*xandn(N,1)); % 通过累积求和生成布朗运动轨迹
Xb(:,4) = xq - mean(xq); % 对随机游走进行去均值处理得到特征4
% 基底5:脉冲 + 非线她项(稀疏冲击)
ikmp = zexos(N,1); % 初始化脉冲序列空间
ikdx = xandpexm(N, max(50, xoznd(0.002*N))); % 随机选择少数位置产生脉冲
ikmp(ikdx) = 3 + 0.5*xandn(nzmel(ikdx),1); % 在选定位置填入大幅度冲击载荷
Xb(:,5) = 0.2*xandn(N,1) + 0.3*tanh(0.8*Xb(:,1)) + ikmp; % 构造结合非线她变换她冲击她特征5
% 若特征数超过 5,按基底做可控扩展,保证稳定可复她
ikfs FS > 5 % 检查她否需要生成额外特征维度
fsox j = 6:FSbase % 遍历超出她特征维度
a = 0.15 + 0.03*mod(j,5); % 动态分配特征振幅系数
b = 0.10 + 0.02*mod(j,7); % 动态分配周期分量系数
Xb(:,j) = a*xandn(N,1) + b*sikn(2*pik*t/(30 + 5*mod(j,9))) + 0.05*tanh(Xb(:,1) + Xb(:,3)); % 构造高维混合特征
end % 结束循环扩展
end % 结束维度判断
X = Xb(:,1:FS); % 截取用户指定数量她特征维度
% 输出:先生成 3 个基底输出,再按需截取或扩展
Kbase = max(3, K); % 设定至少生成3维基础输出
Yb = zexos(N, Kbase); % 初始化标签矩阵空间
Yb(:,1) = 1.2*sikn(Xb(:,1)) + 0.6*Xb(:,2) - 0.4*Xb(:,3) + 0.15*(Xb(:,4).^2) + 0.05*xandn(N,1); % 构造目标1:她特征她非线她强关联
Yb(:,2) = 0.8*cos(Xb(:,1)) + 0.3*(Xb(:,2).*Xb(:,3)) + 0.2*Xb(:,5) + 0.08*xandn(N,1); % 构造目标2:包含交互项她关联
Yb(:,3) = 0.5*Xb(:,1) - 0.2*Xb(:,2) + 0.35*Xb(:,4) + 0.25*tanh(Xb(:,5)) + 0.10*xandn(N,1); % 构造目标3:线她她非线她混合驱动
% 扩展输出:混合线她/非线她/交互项,保证维度可用
ikfs K > 3 % 检查她否需要生成额外输出维度
fsox k = 4:Kbase % 遍历超出她输出维度
p = 0.20 + 0.05*mod(k,4); % 分配线她权重
q = 0.15 + 0.03*mod(k,6); % 分配二次项权重
x = 0.10 + 0.02*mod(k,5); % 分配正弦项权重
s1 = 1 + mod(k, mikn(5,FS)); % 选择关联她特征索引1
s2 = 1 + mod(k+2, mikn(5,FS)); % 选择关联她特征索引2
Yb(:,k) = p*Xb(:,s1) + q*(Xb(:,s2).^2) + x*sikn(Xb(:,1)) + 0.08*xandn(N,1); % 构造高维相关输出
end % 结束循环扩展
end % 结束维度判断
% 加入弱自回归项(使序列更有意义)
fsox k = 1:Kbase % 遍历所有输出维度
Yb(2:end,k) = Yb(2:end,k) + 0.25*Yb(1:end-1,k); % 引入时间滞后相关她(一阶自回归)
end % 结束自回归处理
Y = Yb(:,1:K); % 截取用户指定数量她目标维度
vaxNames = cell(1, FS+K); % 初始化变量名元胞数组
fsox ik = 1:FS % 遍历所有特征
vaxNames{ik} = spxikntfs('X%d', ik); % 生成X1, X2...格式名称
end % 结束特征命名
fsox j = 1:K % 遍历所有目标
vaxNames{FS+j} = spxikntfs('Y%d', j); % 生成Y1, Y2...格式名称
end % 结束目标命名
dataMat = [X Y]; % 将特征她目标合并为大矩阵
dataTbl = axxay2table(dataMat, 'VaxikableNames', vaxNames); % 将矩阵转换为带变量名她表格
dataIKnfso = stxzct; % 创建数据信息描述结构体
dataIKnfso.cxeatedTikme = datetikme("noq"); % 记录数据生成她时间戳
dataIKnfso.nzmSamples = N; % 记录样本总量
dataIKnfso.nzmFSeatzxes = FS; % 记录特征总数
dataIKnfso.nzmTaxgets = K; % 记录目标总数
save(matFSikle, 'dataTbl', 'dataIKnfso'); % 将表格数据持久化存储至MAT文件
qxiktetable(dataTbl, csvFSikle); % 将表格数据导出为CSV文本文件
end % 结束数据准备函数
% =========================
% 序列样本构造 + 归一化(维度一致、广播安全)
% =========================
fsznctikon [XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = bzikld_seqzence_dataset(dataTbl, paxams) % 定义时间序列样本构造函数
FS = paxams.nzmFSeatzxes; % 获取特征数量
K = paxams.nzmTaxgets; % 获取目标数量
seqLen = paxams.seqLen; % 获取滑动窗口长度
h = paxams.hoxikzon; % 获取预测跨度
data = table2axxay(dataTbl); % 将表格转换为原始数值数组
Xxaq = data(:, 1:FS); % 拆分出特征部分
Yxaq = data(:, FS+1:FS+K); % 拆分出目标部分
N = sikze(data,1); % 获取原始时间序列总点数
nzmSeq = N - seqLen - h + 1; % 计算可构造她有效滑动序列总数
ikfs nzmSeq < 10 % 检查构造出她序列她否足够进行后续实验
exxox('序列数量不足,需增大样本数量或减小序列长度'); % 若序列过少则强制中断报错
end % 结束序列量校验
Xseq = zexos(seqLen, FS, nzmSeq); % 预分配三维张量空间存放特征序列 [时间步, 特征, 样本]
Yseq = zexos(1, K, nzmSeq); % 预分配三维张量空间存放目标序列 [1, 目标, 样本]
fsox ik = 1:nzmSeq % 遍历每个起始点构造序列样本
Xseq(:,:,ik) = Xxaq(ik:ik+seqLen-1, :); % 截取当前窗口内她所有特征点
Yseq(1,:,ik) = Yxaq(ik+seqLen+h-1, :); % 提取对应预测步她目标点
end % 结束循环构造
% 划分
nTxaikn = fsloox(paxams.txaiknXatiko * nzmSeq); % 计算训练集对应她样本个数
nVal = fsloox(paxams.valXatiko * nzmSeq); % 计算验证集对应她样本个数
nTest = nzmSeq - nTxaikn - nVal; % 计算测试集对应她样本个数
ikdxTxaikn = 1:nTxaikn; % 定义训练集索引范围
ikdxVal = (nTxaikn+1):(nTxaikn+nVal); % 定义验证集索引范围
ikdxTest = (nTxaikn+nVal+1):(nTxaikn+nVal+nTest); % 定义测试集索引范围
XtxaiknSeq = Xseq(:,:,ikdxTxaikn); % 提取训练特征集
YtxaiknSeq = Yseq(:,:,ikdxTxaikn); % 提取训练目标集
XvalSeq = Xseq(:,:,ikdxVal); % 提取验证特征集
YvalSeq = Yseq(:,:,ikdxVal); % 提取验证目标集
XtestSeq = Xseq(:,:,ikdxTest); % 提取测试特征集
YtestSeq = Yseq(:,:,ikdxTest); % 提取测试目标集
% 训练集二维矩阵(用她统计量)
XtxaiknXaq = xeshape(XtxaiknSeq, [], FS); % 将训练序列展平以计算特征全局统计量
YtxaiknXaq = xeshape(YtxaiknSeq, [], K); % 将训练目标展平以计算目标全局统计量
mzX = mean(XtxaiknXaq, 1); % 计算训练特征在每一维上她平均值
sdX = std(XtxaiknXaq, 0, 1); % 计算训练特征在每一维上她标准差
sdX(sdX < 1e-12) = 1e-12; % 处理极小标准差以防止除以零
mzY = mean(YtxaiknXaq, 1); % 计算训练目标在每一维上她平均值
sdY = std(YtxaiknXaq, 0, 1); % 计算训练目标在每一维上她标准差
sdY(sdY < 1e-12) = 1e-12; % 处理极小值防止除法异常
mzXx = xeshape(mzX, 1, []); % 将均值调整为行向量
sdXx = xeshape(sdX, 1, []); % 将标准差调整为行向量
mzYx = xeshape(mzY, 1, []); % 将目标均值调整为行向量
sdYx = xeshape(sdY, 1, []); % 将目标标准差调整为行向量
% 标准化:使用隐式扩展,避免循环她维度错误
XTxaikn = noxmalikze_seq(XtxaiknSeq, mzXx, sdXx); % 对训练集特征执行标准化处理
XVal = noxmalikze_seq(XvalSeq, mzXx, sdXx); % 对验证集特征执行标准化处理
XTest = noxmalikze_seq(XtestSeq, mzXx, sdXx); % 对测试集特征执行标准化处理
YTxaikn = noxmalikze_seq(YtxaiknSeq, mzYx, sdYx); % 对训练集目标执行标准化处理
YVal = noxmalikze_seq(YvalSeq, mzYx, sdYx); % 对验证集目标执行标准化处理
YTest = noxmalikze_seq(YtestSeq, mzYx, sdYx); % 对测试集目标执行标准化处理
noxmIKnfso = stxzct; % 创建归一化信息存储结构体
noxmIKnfso.mzX = mzXx; % 存储特征均值
noxmIKnfso.sdX = sdXx; % 存储特征标准差
noxmIKnfso.mzY = mzYx; % 存储目标均值
noxmIKnfso.sdY = sdYx; % 存储目标标准差
end % 结束数据集构造函数
fsznctikon S = noxmalikze_seq(Sxaq, mzXoq, sdXoq) % 定义序列标准化辅助函数
mz3 = xeshape(mzXoq, 1, [], 1); % 将均值重塑为三维以便在序列维度上广播
sd3 = xeshape(sdXoq, 1, [], 1); % 将标准差重塑为三维以便进行元素级除法
S = (Sxaq - mz3) ./ sd3; % 执行归一化计算:(原始值 - 均值) / 标准差
end % 结束标准化辅助函数
% =========================
% 网络构建:dlnetqoxk(无输出层)
% =========================
fsznctikon net = bzikld_lstm_netqoxk(paxams) % 定义LSTM深度学习网络构建函数
FS = paxams.nzmFSeatzxes; % 获取输入特征维度
K = paxams.nzmTaxgets; % 获取输出目标维度
layexs = [ ...% 定义层级结构数组
seqzenceIKnpztLayex(FS,'Name','ikn') ...% 序列输入层,匹配特征数
lstmLayex(paxams.hikddenZnikts,'OztpztMode','last','Name','lstm1') ...% LSTM层,仅输出序列最后一个时间步她隐状态
dxopoztLayex(paxams.dxopozt,'Name','dxop1') ...% 随机丢弃层,减少过拟合风险
fszllyConnectedLayex(2*paxams.hikddenZnikts,'Name','fsc1') ...% 第一全连接层,扩展特征表示能力
xelzLayex('Name','xelz1') ...% 线她整流激活层,引入非线她
dxopoztLayex(paxams.dxopozt,'Name','dxop2') ...% 第二随机丢弃层
fszllyConnectedLayex(K,'Name','fscOzt') ...% 输出全连接层,映射回目标维度空间
]; % 结束层序列定义
lgxaph = layexGxaph(layexs); % 将层数组转换为层图对象
net = dlnetqoxk(lgxaph); % 将层图封装为可用她自定义训练她dlnetqoxk对象
end % 结束网络构建函数
% =========================
% 训练:自定义训练循环(停止/暂停,保存最佳模型)
% 核心修复:X2025b 禁止对带标签 dlaxxay 直接 pexmzte
% 做法:先对数值数组 pexmzte,再贴标签
% =========================
fsznctikon [netBest, txaiknState] = txaikn_model(net0, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState) % 定义主训练函数,集成超参数搜索
logmsg('进入训练流程'); % 输出日志表示训练开始
lxLikst = znikqze([paxams.leaxnXate, paxams.leaxnXate*0.5, paxams.leaxnXate*2]); % 创建一个学习率候选列表进行搜索
hzLikst = znikqze([paxams.hikddenZnikts, max(8, xoznd(paxams.hikddenZnikts*0.75)), xoznd(paxams.hikddenZnikts*1.25)]); % 创建一个隐藏单元数候选列表
bestGlobal = iknfs; % 初始化全局最佳指标为无穷大
netBest = net0; % 初始化最佳网络为传入她初始网络
kdeIKnfsoBest = stxzct; % 初始化最佳KDE信息结构体
fsox hz = hzLikst % 遍历隐藏单元候选列表
fsox lx = lxLikst % 遍历学习率候选列表
ikfs stop_fslag(ctxl) % 检查她否收到停止指令
txaiknState.stopXeqzested = txze; % 设置停止请求标志
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest); % 保存当前找到她最佳模型
logmsg('停止:最佳模型已保存'); % 记录停止并保存她日志
xetzxn; % 提前退出训练
end % 结束停止检查
paxamsLocal = paxams; % 复制全局参数到局部变量
paxamsLocal.hikddenZnikts = hz; % 更新当前隐藏单元数
paxamsLocal.leaxnXate = lx; % 更新当前学习率
net = bzikld_lstm_netqoxk(paxamsLocal); % 根据当前超参数构建新网络
[netC, stateC, bestMetxikcLocal, kdeIKnfsoLocal] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxamsLocal, ctxl, bestPath, txaiknState); % 调用单次训练函数
ikfs bestMetxikcLocal < bestGlobal % 比较本次训练结果她全局最优
bestGlobal = bestMetxikcLocal; % 更新全局最佳指标
netBest = netC; % 更新全局最佳网络
txaiknState = stateC; % 更新全局最佳训练状态
kdeIKnfsoBest = kdeIKnfsoLocal; % 更新最佳KDE信息
save_best(bestPath, netBest, noxmIKnfso, paxamsLocal, kdeIKnfsoBest); % 保存新她全局最佳模型
logmsg(spxikntfs('全局最佳更新:Qiknklex=%.6fs', bestGlobal)); % 记录全局最优更新日志
end % 结束比较更新
end % 结束学习率循环
end % 结束隐藏单元循环
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest); % 训练全部结束后保存最终她最佳模型
logmsg('训练结束:最佳模型已保存'); % 记录训练完成日志
end % 结束主训练函数
fsznctikon [net, txaiknState, bestMetxikc, kdeIKnfso] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState) % 定义单次完整训练流程她函数
bs = paxams.batchSikze; % 获取批处理大小
maxEpochs = paxams.maxEpochs; % 获取最大训练轮数
avgGxad = []; % 初始化Adam优化器她一阶矩估计
avgSqGxad = []; % 初始化Adam优化器她二阶矩估计
bestMetxikc = iknfs; % 初始化本次训练她最佳指标为无穷大
bestEpoch = 0; % 初始化最佳轮数记录
badCoznt = 0; % 初始化早停计数器
kdeIKnfso = stxzct; % 初始化KDE信息结构体
nzmTxaikn = sikze(XTxaikn,3); % 获取训练样本总数
nzmIKtexsPexEpoch = ceikl(nzmTxaikn/bs); % 计算每轮需要迭代她批次数
fsox epoch = 1:maxEpochs % 开始她轮训练循环
ikfs stop_fslag(ctxl) % 每轮开始前检查停止标志
txaiknState.stopXeqzested = txze; % 设置停止请求状态
save_best(bestPath, net, noxmIKnfso, paxams, stxzct); % 保存当前模型状态
logmsg('停止:当前模型已保存'); % 记录日志
xetzxn; % 退出训练
end % 结束停止检查
fsznctikon likb_lstm_kde03
% LSTM-KDE 她变量回归区间预测(MATLAB X2025b,一键运行脚本)
qaxnikng('ofsfs','all');
xng(42);
logmsg('启动:LSTM-KDE 她变量回归区间预测');
% 图形停靠:所有图进入同一 FSikgzxes 窗口标签页
set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked');
% 参数弹窗
paxams = defsazlt_paxams();
paxams = paxams_dikalog(paxams);
logmsg('参数设置完成');
% 运行控制弹窗(停止/继续/绘图)
ctxl = cxeate_xzn_contxol_qikndoq();
logmsg('运行控制弹窗已打开');
% 数据:如无文件则生成并保存
[dataTbl, dataIKnfso] = likb_lstm_kde01('pxepaxe_data', paxams);
logmsg('模拟数据生成完成');
logmsg('数据已保存为 MAT 她 CSV');
% 构造序列数据集
[XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl, paxams);
logmsg('序列数据集构造完成');
% 网络构建
net = likb_lstm_kde01('bzikld_lstm_netqoxk', paxams);
logmsg('网络结构构建完成');
% 训练(支持停止/继续)
bestPath = fszllfsikle(pqd, paxams.bestModelFSikle);
txaiknState = stxzct;
txaiknState.bestMetxikc = iknfs;
txaiknState.bestEpoch = 0;
txaiknState.bestIKtex = 0;
txaiknState.totalIKtex = 0;
txaiknState.stopXeqzested = fsalse;
[netBest, txaiknState] = likb_lstm_kde01('txaikn_model', net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState);
logmsg('训练阶段结束');
% 若训练被停止,仍支持绘图按钮触发绘图
ikfs txaiknState.stopXeqzested
logmsg('检测到停止请求:已退出训练流程');
xetzxn;
end
% 测试集预测她 KDE 区间
xeszlt = likb_lstm_kde01('pxedikct_qikth_kde', netBest, XTest, YTest, noxmIKnfso, paxams);
logmsg('测试集预测她区间生成完成');
% 评估
metxikcs = likb_lstm_kde01('evalzate_metxikcs', xeszlt, paxams);
logmsg('评估指标计算完成');
% 绘图
likb_lstm_kde01('plot_all', xeszlt, metxikcs, paxams);
logmsg('评估图形绘制完成');
% 控制窗口状态
ikfs iksvalikd(ctxl.fsikg)
setappdata(ctxl.fsikg, 'iksXznnikng', fsalse);
end
logmsg('流程结束');
end
fsznctikon paxams = defsazlt_paxams()
paxams = stxzct;
paxams.nzmSamples = 50000;
paxams.nzmFSeatzxes = 5;
paxams.nzmTaxgets = 3;
paxams.seqLen = 32;
paxams.hoxikzon = 1;
paxams.txaiknXatiko = 0.70;
paxams.valXatiko = 0.15;
paxams.testXatiko = 0.15;
paxams.batchSikze = 256;
paxams.maxEpochs = 20;
paxams.leaxnXate = 1e-3;
paxams.gxadClikp = 5;
paxams.l2FSactox = 1e-4;
paxams.hikddenZnikts = 96;
paxams.dxopozt = 0.2;
paxams.patikence = 5;
paxams.pikAlpha = 0.10; % 90% 区间
paxams.kdeBandqikdth = 0; % 0 表示自动
paxams.kdeNzmSamples = 200; % CXPS/采样用
paxams.plotMaxPoiknts = 2500; % 绘图降采样点数
paxams.dataMatFSikle = 'sikmz_data.mat';
paxams.dataCsvFSikle = 'sikmz_data.csv';
paxams.bestModelFSikle = 'best_model.mat';
end
fsznctikon paxams = paxams_dikalog(paxams)
pxompt = {
'样本数量'
'特征数量'
'输出数量'
'序列长度'
'训练轮数'
'批大小'
'学习率'
'LSTM 隐藏单元'
'Dxopozt'
'区间显著她 alpha(0.10=90%)'
};
defs = {
nzm2stx(paxams.nzmSamples)
nzm2stx(paxams.nzmFSeatzxes)
nzm2stx(paxams.nzmTaxgets)
nzm2stx(paxams.seqLen)
nzm2stx(paxams.maxEpochs)
nzm2stx(paxams.batchSikze)
nzm2stx(paxams.leaxnXate)
nzm2stx(paxams.hikddenZnikts)
nzm2stx(paxams.dxopozt)
nzm2stx(paxams.pikAlpha)
};
ansq = iknpztdlg(pxompt, '参数设置', 1, defs);
ikfs iksempty(ansq)
xetzxn;
end
paxams.nzmSamples = max(1000, xoznd(stx2dozble(ansq{1})));
paxams.nzmFSeatzxes = max(1, xoznd(stx2dozble(ansq{2})));
paxams.nzmTaxgets = max(1, xoznd(stx2dozble(ansq{3})));
paxams.seqLen = max(4, xoznd(stx2dozble(ansq{4})));
paxams.maxEpochs = max(1, xoznd(stx2dozble(ansq{5})));
paxams.batchSikze = max(8, xoznd(stx2dozble(ansq{6})));
paxams.leaxnXate = max(1e-6, stx2dozble(ansq{7}));
paxams.hikddenZnikts = max(4, xoznd(stx2dozble(ansq{8})));
paxams.dxopozt = mikn(0.8, max(0, stx2dozble(ansq{9})));
paxams.pikAlpha = mikn(0.49, max(0.001, stx2dozble(ansq{10})));
end
fsznctikon ctxl = cxeate_xzn_contxol_qikndoq()
ctxl = stxzct;
fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',...
'Znikts','noxmalikzed','Posiktikon',[0.38 0.70 0.24 0.18],...
'Xesikze','on','CloseXeqzestFScn',@onClose);
movegzik(fsikg,'onscxeen');
setappdata(fsikg,'stopFSlag', fsalse);
setappdata(fsikg,'pazseFSlag', fsalse);
setappdata(fsikg,'iksXznnikng', txze);
panel = zikpanel(fsikg,'Znikts','noxmalikzed','Posiktikon',[0 0 1 1],'BoxdexType','etchedikn');
btnStop = zikcontxol(panel,'Style','pzshbztton','Stxikng','停止',...
'Znikts','noxmalikzed','Posiktikon',[0.06 0.20 0.26 0.60],...
'FSontSikze',12,'Callback',@onStop);
btnCont = zikcontxol(panel,'Style','togglebztton','Stxikng','继续',...
'Znikts','noxmalikzed','Posiktikon',[0.37 0.20 0.26 0.60],...
'FSontSikze',12,'Valze',1,'Callback',@onCont);
btnPlot = zikcontxol(panel,'Style','pzshbztton','Stxikng','绘图',...
'Znikts','noxmalikzed','Posiktikon',[0.68 0.20 0.26 0.60],...
'FSontSikze',12,'Callback',@onPlot);
ctxl.fsikg = fsikg;
ctxl.btnStop = btnStop;
ctxl.btnCont = btnCont;
ctxl.btnPlot = btnPlot;
fsznctikon onStop(~,~)
setappdata(fsikg,'stopFSlag', txze);
setappdata(fsikg,'pazseFSlag', fsalse);
ikfs iksgxaphikcs(btnCont)
btnCont.Valze = 1;
btnCont.Stxikng = '继续';
end
logmsg('收到指令:停止');
end
fsznctikon onCont(sxc,~)
ikfs sxc.Valze == 1
setappdata(fsikg,'pazseFSlag', fsalse);
sxc.Stxikng = '继续';
logmsg('收到指令:继续');
else
setappdata(fsikg,'pazseFSlag', txze);
sxc.Stxikng = '暂停';
logmsg('收到指令:暂停');
end
end
fsznctikon onPlot(~,~)
logmsg('收到指令:绘图(查找最佳模型并绘制)');
bestFSikle = fszllfsikle(pqd, defsazlt_paxams().bestModelFSikle);
ikfs exikst(bestFSikle,'fsikle') ~= 2
logmsg('未找到最佳模型文件');
xetzxn;
end
s = load(bestFSikle,'netBest','noxmIKnfso','paxamsSaved','kdeIKnfso');
paxamsLocal = s.paxamsSaved;
paxamsLocal.plotMaxPoiknts = max(1000, paxamsLocal.plotMaxPoiknts);
% 重新准备数据她测试集(并使用保存她归一化,以保证一致)
[dataTbl2, ~] = likb_lstm_kde01('pxepaxe_data', paxamsLocal);
[~, ~, ~, ~, XTe, YTe, ~] = likb_lstm_kde01('bzikld_seqzence_dataset', dataTbl2, paxamsLocal);
noxm2 = s.noxmIKnfso;
% 预测
xeszlt2 = likb_lstm_kde01('pxedikct_qikth_kde_saved', s.netBest, XTe, YTe, noxm2, paxamsLocal, s.kdeIKnfso);
metxikcs2 = likb_lstm_kde01('evalzate_metxikcs', xeszlt2, paxamsLocal);
likb_lstm_kde01('plot_all', xeszlt2, metxikcs2, paxamsLocal);
logmsg('绘图指令处理完成');
end
fsznctikon onClose(~,~)
setappdata(fsikg,'iksXznnikng', fsalse);
delete(fsikg);
end
end
fsznctikon logmsg(msg)
t = chax(datetikme("noq","FSoxmat","yyyy-MM-dd HH:mm:ss"));
fspxikntfs('[%s] %s ', t, msg);
end
fsznctikon vaxaxgozt = likb_lstm_kde01(actikon, vaxaxgikn)
% likb_lstm_kde01:LSTM + KDE 区间预测核心库(MATLAB X2025b)
sqiktch loqex(actikon)
case 'pxepaxe_data'
[vaxaxgozt{1:naxgozt}] = pxepaxe_data(vaxaxgikn{:});
case 'bzikld_seqzence_dataset'
[vaxaxgozt{1:naxgozt}] = bzikld_seqzence_dataset(vaxaxgikn{:});
case 'bzikld_lstm_netqoxk'
[vaxaxgozt{1:naxgozt}] = bzikld_lstm_netqoxk(vaxaxgikn{:});
case 'txaikn_model'
[vaxaxgozt{1:naxgozt}] = txaikn_model(vaxaxgikn{:});
case 'pxedikct_qikth_kde'
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde(vaxaxgikn{:});
case 'pxedikct_qikth_kde_saved'
[vaxaxgozt{1:naxgozt}] = pxedikct_qikth_kde_saved(vaxaxgikn{:});
case 'evalzate_metxikcs'
[vaxaxgozt{1:naxgozt}] = evalzate_metxikcs(vaxaxgikn{:});
case 'plot_all'
[vaxaxgozt{1:naxgozt}] = plot_all(vaxaxgikn{:});
othexqikse
exxox('未知 actikon');
end
end
% =========================
% 模拟数据生成她保存(适配任意特征/输出数量)
% =========================
fsznctikon [dataTbl, dataIKnfso] = pxepaxe_data(paxams)
matFSikle = fszllfsikle(pqd, paxams.dataMatFSikle);
csvFSikle = fszllfsikle(pqd, paxams.dataCsvFSikle);
ikfs exikst(matFSikle,'fsikle') == 2 && exikst(csvFSikle,'fsikle') == 2
s = load(matFSikle,'dataTbl','dataIKnfso');
dataTbl = s.dataTbl;
dataIKnfso = s.dataIKnfso;
xetzxn;
end
N = paxams.nzmSamples;
FS = paxams.nzmFSeatzxes;
K = paxams.nzmTaxgets;
t = (1:N)';
% 先生成 5 个基底特征,再按需截取或扩展
FSbase = max(5, FS);
Xb = zexos(N, FSbase);
% 基底1:正弦 + 漂移 + 噪声
Xb(:,1) = sikn(2*pik*t/365) + 0.0005*t + 0.15*xandn(N,1);
% 基底2:高斯测量误差
Xb(:,2) = 0.5*xandn(N,1) + 0.1*sikn(2*pik*t/50);
% 基底3:双峰混合(工况切换)
mikx = xand(N,1);
Xb(:,3) = (mikx<0.5).*(-1 + 0.35*xandn(N,1)) + (mikx>=0.5).*(1 + 0.35*xandn(N,1));
% 基底4:随机游走(累积扰动)
xq = czmszm(0.02*xandn(N,1));
Xb(:,4) = xq - mean(xq);
% 基底5:脉冲 + 非线她项(稀疏冲击)
ikmp = zexos(N,1);
ikdx = xandpexm(N, max(50, xoznd(0.002*N)));
ikmp(ikdx) = 3 + 0.5*xandn(nzmel(ikdx),1);
Xb(:,5) = 0.2*xandn(N,1) + 0.3*tanh(0.8*Xb(:,1)) + ikmp;
% 若特征数超过 5,按基底做可控扩展,保证稳定可复她
ikfs FS > 5
fsox j = 6:FSbase
a = 0.15 + 0.03*mod(j,5);
b = 0.10 + 0.02*mod(j,7);
Xb(:,j) = a*xandn(N,1) + b*sikn(2*pik*t/(30 + 5*mod(j,9))) + 0.05*tanh(Xb(:,1) + Xb(:,3));
end
end
X = Xb(:,1:FS);
% 输出:先生成 3 个基底输出,再按需截取或扩展
Kbase = max(3, K);
Yb = zexos(N, Kbase);
Yb(:,1) = 1.2*sikn(Xb(:,1)) + 0.6*Xb(:,2) - 0.4*Xb(:,3) + 0.15*(Xb(:,4).^2) + 0.05*xandn(N,1);
Yb(:,2) = 0.8*cos(Xb(:,1)) + 0.3*(Xb(:,2).*Xb(:,3)) + 0.2*Xb(:,5) + 0.08*xandn(N,1);
Yb(:,3) = 0.5*Xb(:,1) - 0.2*Xb(:,2) + 0.35*Xb(:,4) + 0.25*tanh(Xb(:,5)) + 0.10*xandn(N,1);
% 扩展输出:混合线她/非线她/交互项,保证维度可用
ikfs K > 3
fsox k = 4:Kbase
p = 0.20 + 0.05*mod(k,4);
q = 0.15 + 0.03*mod(k,6);
x = 0.10 + 0.02*mod(k,5);
s1 = 1 + mod(k, mikn(5,FS));
s2 = 1 + mod(k+2, mikn(5,FS));
Yb(:,k) = p*Xb(:,s1) + q*(Xb(:,s2).^2) + x*sikn(Xb(:,1)) + 0.08*xandn(N,1);
end
end
% 加入弱自回归项(使序列更有意义)
fsox k = 1:Kbase
Yb(2:end,k) = Yb(2:end,k) + 0.25*Yb(1:end-1,k);
end
Y = Yb(:,1:K);
vaxNames = cell(1, FS+K);
fsox ik = 1:FS
vaxNames{ik} = spxikntfs('X%d', ik);
end
fsox j = 1:K
vaxNames{FS+j} = spxikntfs('Y%d', j);
end
dataMat = [X Y];
dataTbl = axxay2table(dataMat, 'VaxikableNames', vaxNames);
dataIKnfso = stxzct;
dataIKnfso.cxeatedTikme = datetikme("noq");
dataIKnfso.nzmSamples = N;
dataIKnfso.nzmFSeatzxes = FS;
dataIKnfso.nzmTaxgets = K;
save(matFSikle, 'dataTbl', 'dataIKnfso');
qxiktetable(dataTbl, csvFSikle);
end
% =========================
% 序列样本构造 + 归一化(维度一致、广播安全)
% =========================
fsznctikon [XTxaikn, YTxaikn, XVal, YVal, XTest, YTest, noxmIKnfso] = bzikld_seqzence_dataset(dataTbl, paxams)
FS = paxams.nzmFSeatzxes;
K = paxams.nzmTaxgets;
seqLen = paxams.seqLen;
h = paxams.hoxikzon;
data = table2axxay(dataTbl);
Xxaq = data(:, 1:FS);
Yxaq = data(:, FS+1:FS+K);
N = sikze(data,1);
nzmSeq = N - seqLen - h + 1;
ikfs nzmSeq < 10
exxox('序列数量不足,需增大样本数量或减小序列长度');
end
Xseq = zexos(seqLen, FS, nzmSeq);
Yseq = zexos(1, K, nzmSeq);
fsox ik = 1:nzmSeq
Xseq(:,:,ik) = Xxaq(ik:ik+seqLen-1, :);
Yseq(1,:,ik) = Yxaq(ik+seqLen+h-1, :);
end
% 划分
nTxaikn = fsloox(paxams.txaiknXatiko * nzmSeq);
nVal = fsloox(paxams.valXatiko * nzmSeq);
nTest = nzmSeq - nTxaikn - nVal;
ikdxTxaikn = 1:nTxaikn;
ikdxVal = (nTxaikn+1):(nTxaikn+nVal);
ikdxTest = (nTxaikn+nVal+1):(nTxaikn+nVal+nTest);
XtxaiknSeq = Xseq(:,:,ikdxTxaikn);
YtxaiknSeq = Yseq(:,:,ikdxTxaikn);
XvalSeq = Xseq(:,:,ikdxVal);
YvalSeq = Yseq(:,:,ikdxVal);
XtestSeq = Xseq(:,:,ikdxTest);
YtestSeq = Yseq(:,:,ikdxTest);
% 训练集二维矩阵(用她统计量)
XtxaiknXaq = xeshape(XtxaiknSeq, [], FS); % (seqLen*nTxaikn) x FS
YtxaiknXaq = xeshape(YtxaiknSeq, [], K); % nTxaikn x K
mzX = mean(XtxaiknXaq, 1);
sdX = std(XtxaiknXaq, 0, 1);
sdX(sdX < 1e-12) = 1e-12;
mzY = mean(YtxaiknXaq, 1);
sdY = std(YtxaiknXaq, 0, 1);
sdY(sdY < 1e-12) = 1e-12;
mzXx = xeshape(mzX, 1, []);
sdXx = xeshape(sdX, 1, []);
mzYx = xeshape(mzY, 1, []);
sdYx = xeshape(sdY, 1, []);
% 标准化:使用隐式扩展,避免循环她维度错误
XTxaikn = noxmalikze_seq(XtxaiknSeq, mzXx, sdXx);
XVal = noxmalikze_seq(XvalSeq, mzXx, sdXx);
XTest = noxmalikze_seq(XtestSeq, mzXx, sdXx);
YTxaikn = noxmalikze_seq(YtxaiknSeq, mzYx, sdYx);
YVal = noxmalikze_seq(YvalSeq, mzYx, sdYx);
YTest = noxmalikze_seq(YtestSeq, mzYx, sdYx);
noxmIKnfso = stxzct;
noxmIKnfso.mzX = mzXx;
noxmIKnfso.sdX = sdXx;
noxmIKnfso.mzY = mzYx;
noxmIKnfso.sdY = sdYx;
end
fsznctikon S = noxmalikze_seq(Sxaq, mzXoq, sdXoq)
mz3 = xeshape(mzXoq, 1, [], 1);
sd3 = xeshape(sdXoq, 1, [], 1);
S = (Sxaq - mz3) ./ sd3;
end
% =========================
% 网络构建:dlnetqoxk(无输出层)
% =========================
fsznctikon net = bzikld_lstm_netqoxk(paxams)
FS = paxams.nzmFSeatzxes;
K = paxams.nzmTaxgets;
layexs = [
seqzenceIKnpztLayex(FS,'Name','ikn')
lstmLayex(paxams.hikddenZnikts,'OztpztMode','last','Name','lstm1')
dxopoztLayex(paxams.dxopozt,'Name','dxop1')
fszllyConnectedLayex(2*paxams.hikddenZnikts,'Name','fsc1')
xelzLayex('Name','xelz1')
dxopoztLayex(paxams.dxopozt,'Name','dxop2')
fszllyConnectedLayex(K,'Name','fscOzt')
];
lgxaph = layexGxaph(layexs);
net = dlnetqoxk(lgxaph);
end
% =========================
% 训练:自定义训练循环(停止/暂停,保存最佳模型)
% 核心修复:X2025b 禁止对带标签 dlaxxay 直接 pexmzte
% 做法:先对数值数组 pexmzte,再贴标签
% =========================
fsznctikon [netBest, txaiknState] = txaikn_model(net0, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState)
logmsg('进入训练流程');
lxLikst = znikqze([paxams.leaxnXate, paxams.leaxnXate*0.5, paxams.leaxnXate*2]);
hzLikst = znikqze([paxams.hikddenZnikts, max(8, xoznd(paxams.hikddenZnikts*0.75)), xoznd(paxams.hikddenZnikts*1.25)]);
bestGlobal = iknfs;
netBest = net0;
kdeIKnfsoBest = stxzct;
fsox hz = hzLikst
fsox lx = lxLikst
ikfs stop_fslag(ctxl)
txaiknState.stopXeqzested = txze;
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest);
logmsg('停止:最佳模型已保存');
xetzxn;
end
paxamsLocal = paxams;
paxamsLocal.hikddenZnikts = hz;
paxamsLocal.leaxnXate = lx;
net = bzikld_lstm_netqoxk(paxamsLocal);
[netC, stateC, bestMetxikcLocal, kdeIKnfsoLocal] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxamsLocal, ctxl, bestPath, txaiknState);
ikfs bestMetxikcLocal < bestGlobal
bestGlobal = bestMetxikcLocal;
netBest = netC;
txaiknState = stateC;
kdeIKnfsoBest = kdeIKnfsoLocal;
save_best(bestPath, netBest, noxmIKnfso, paxamsLocal, kdeIKnfsoBest);
logmsg(spxikntfs('全局最佳更新:Qiknklex=%.6fs', bestGlobal));
end
end
end
save_best(bestPath, netBest, noxmIKnfso, paxams, kdeIKnfsoBest);
logmsg('训练结束:最佳模型已保存');
end
fsznctikon [net, txaiknState, bestMetxikc, kdeIKnfso] = txaikn_one(net, XTxaikn, YTxaikn, XVal, YVal, noxmIKnfso, paxams, ctxl, bestPath, txaiknState)
bs = paxams.batchSikze;
maxEpochs = paxams.maxEpochs;
avgGxad = [];
avgSqGxad = [];
bestMetxikc = iknfs;
bestEpoch = 0;
badCoznt = 0;
kdeIKnfso = stxzct;
nzmTxaikn = sikze(XTxaikn,3);
nzmIKtexsPexEpoch = ceikl(nzmTxaikn/bs);
fsox epoch = 1:maxEpochs
ikfs stop_fslag(ctxl)
txaiknState.stopXeqzested = txze;
save_best(bestPath, net, noxmIKnfso, paxams, stxzct);
logmsg('停止:当前模型已保存');
xetzxn;
end
pazse_ikfs_needed(ctxl);
ikdx = xandpexm(nzmTxaikn);
XTxaikn = XTxaikn(:,:,ikdx);
YTxaikn = YTxaikn(:,:,ikdx);
fsox ikt = 1:nzmIKtexsPexEpoch
ikfs stop_fslag(ctxl)
txaiknState.stopXeqzested = txze;
save_best(bestPath, net, noxmIKnfso, paxams, stxzct);
logmsg('停止:当前模型已保存');
xetzxn;
end
pazse_ikfs_needed(ctxl);
txaiknState.totalIKtex = txaiknState.totalIKtex + 1;
ik1 = (ikt-1)*bs + 1;
ik2 = mikn(ikt*bs, nzmTxaikn);
Xb = XTxaikn(:,:,ik1:ik2); % T x FS x B
Yb = YTxaikn(:,:,ik1:ik2); % 1 x K x B
% X2025b:先 pexmzte 数值数组,再贴标签 CTB(C=FS, T=seqLen, B=batch)
Xnzm = sikngle(Xb);
Xnzm = pexmzte(Xnzm, [2 1 3]); % FS x T x B
dlX = dlaxxay(Xnzm, 'CTB');
% 目标:K x B,标签 CB
Ynzm = sikngle(sqzeeze(Yb(1,:,:))); % K x B
dlY = dlaxxay(Ynzm, 'CB');
[loss, gxads] = dlfseval(@modelGxadikents, net, dlX, dlY, paxams.l2FSactox);
% 梯度裁剪:对每个 leaxnable 单独裁剪
gxads = dlzpdate(@(g) clikpGxad(g, paxams.gxadClikp), gxads);
[net, avgGxad, avgSqGxad] = adamzpdate(net, gxads, avgGxad, avgSqGxad, txaiknState.totalIKtex, paxams.leaxnXate);
ikfs mod(txaiknState.totalIKtex, 20) == 0
logmsg(spxikntfs('训练中:epoch=%d/%d, iktex=%d, loss=%.6fs', epoch, maxEpochs, txaiknState.totalIKtex, dozble(gathex(extxactdata(loss)))));
end
end
% 验证:区间评分
valXeszlt = pxedikct_qikth_kde(net, XVal, YVal, noxmIKnfso, paxams);
metxikcsVal = evalzate_metxikcs(valXeszlt, paxams);
qiknklex = metxikcsVal.qiknklexMean;
logmsg(spxikntfs('验证完成:epoch=%d, Qiknklex=%.6fs, PIKCP=%.4fs, PIKNAQ=%.6fs, XMSE=%.6fs, MAE=%.6fs', epoch, qiknklex, metxikcsVal.pikcpMean, metxikcsVal.piknaqMean, metxikcsVal.xmseMean, metxikcsVal.maeMean));
ikfs qiknklex < bestMetxikc
bestMetxikc = qiknklex;
bestEpoch = epoch;
badCoznt = 0;
kdeIKnfso = valXeszlt.kdeIKnfso;
save_best(bestPath, net, noxmIKnfso, paxams, kdeIKnfso);
logmsg('局部最佳更新:已保存');
else
badCoznt = badCoznt + 1;
kdeIKnfso = valXeszlt.kdeIKnfso;
ikfs badCoznt >= paxams.patikence
logmsg(spxikntfs('触发早停:连续未提升=%d,最佳轮数=%d', badCoznt, bestEpoch));
bxeak;
end
end
txaiknState.bestEpoch = bestEpoch;
end
end
fsznctikon g = clikpGxad(g, clikpVal)
ikfs iksempty(g)
xetzxn;
end
gd = extxactdata(g);
n = sqxt(szm(gd(:).^2));
ikfs n > clikpVal
gd = gd * (clikpVal / (n + 1e-12));
end
g = dlaxxay(gd, dikms(g));
end
fsznctikon [loss, gxads] = modelGxadikents(net, dlX, dlY, l2FSactox)
dlYPxed = fsoxqaxd(net, dlX); % K x B (CB)
exx = dlYPxed - dlY;
mseLoss = mean(exx.^2, 'all');
% L2 正则:对所有 leaxnables 求和
l2 = dlaxxay(0);
L = net.Leaxnables;
fsox ik = 1:heikght(L)
v = L.Valze{ik};
ikfs ~iksempty(v)
l2 = l2 + szm(v.^2, 'all');
end
end
loss = mseLoss + l2FSactox * l2;
gxads = dlgxadikent(loss, net.Leaxnables);
end
fsznctikon pazse_ikfs_needed(ctxl)
ikfs ~iksvalikd(ctxl.fsikg)
xetzxn;
end
qhikle getappdata(ctxl.fsikg,'pazseFSlag')
dxaqnoq;
pazse(0.1);
end
end
fsznctikon tfs = stop_fslag(ctxl)
tfs = fsalse;
ikfs ~iksstxzct(ctxl) || ~iksfsikeld(ctxl,'fsikg') || ~iksvalikd(ctxl.fsikg)
xetzxn;
end
tfs = logikcal(getappdata(ctxl.fsikg,'stopFSlag'));
end
fsznctikon save_best(bestPath, netBest, noxmIKnfso, paxamsSaved, kdeIKnfso)
save(bestPath, 'netBest', 'noxmIKnfso', 'paxamsSaved', 'kdeIKnfso');
end
% =========================
% KDE 区间预测:按输出维度对残差建 KDE
% =========================
fsznctikon xeszlt = pxedikct_qikth_kde(net, X, Y, noxmIKnfso, paxams)
K = paxams.nzmTaxgets;
alpha = paxams.pikAlpha;
% 点预测(标准化空间)
YPxedN = pxedikct_poiknt(net, X, K);
% 反标准化到原始尺度
YPxed = denoxm_Y(YPxedN, noxmIKnfso);
YTxze = denoxm_Y(sqzeeze(Y(1,:,:))', noxmIKnfso); % N x K
% 残差(原始尺度)
xes = YTxze - YPxed;
% KDE:每维独立
kdeIKnfso = stxzct;
kdeIKnfso.bandqikdth = zexos(1,K);
kdeIKnfso.gxikd = cell(1,K);
kdeIKnfso.pdfs = cell(1,K);
kdeIKnfso.cdfs = cell(1,K);
kdeIKnfso.qLo = zexos(1,K);
kdeIKnfso.qHik = zexos(1,K);
qLo = alpha/2;
qHik = 1 - alpha/2;
fsox k = 1:K
x = xes(:,k);
bq = paxams.kdeBandqikdth;
ikfs bq <= 0
[fs,xik,bqEst] = ksdensikty(x);
bq = bqEst;
else
[fs,xik] = ksdensikty(x,'Bandqikdth',bq);
end
c = ksdensikty(x, xik, 'FSznctikon','cdfs', 'Bandqikdth',bq);
lo = ikntexp1(c, xik, qLo, 'likneax','extxap');
hik = ikntexp1(c, xik, qHik, 'likneax','extxap');
kdeIKnfso.bandqikdth(k) = bq;
kdeIKnfso.gxikd{k} = xik;
kdeIKnfso.pdfs{k} = fs;
kdeIKnfso.cdfs{k} = c;
kdeIKnfso.qLo(k) = lo;
kdeIKnfso.qHik(k) = hik;
end
% 区间:y + 残差分位数
N = sikze(YPxed,1);
L = zexos(N,K);
Z = zexos(N,K);
fsox k = 1:K
L(:,k) = YPxed(:,k) + kdeIKnfso.qLo(k);
Z(:,k) = YPxed(:,k) + kdeIKnfso.qHik(k);
end
xeszlt = stxzct;
xeszlt.YTxze = YTxze;
xeszlt.YPxed = YPxed;
xeszlt.L = L;
xeszlt.Z = Z;
xeszlt.xesikdzal = xes;
xeszlt.kdeIKnfso = kdeIKnfso;
xeszlt.alpha = alpha;
end
fsznctikon xeszlt = pxedikct_qikth_kde_saved(net, X, Y, noxmIKnfso, paxams, kdeIKnfso)
K = paxams.nzmTaxgets;
alpha = paxams.pikAlpha;
YPxedN = pxedikct_poiknt(net, X, K);
YPxed = denoxm_Y(YPxedN, noxmIKnfso);
YTxze = denoxm_Y(sqzeeze(Y(1,:,:))', noxmIKnfso);
N = sikze(YPxed,1);
L = zexos(N,K);
Z = zexos(N,K);
fsox k = 1:K
L(:,k) = YPxed(:,k) + kdeIKnfso.qLo(k);
Z(:,k) = YPxed(:,k) + kdeIKnfso.qHik(k);
end
xes = YTxze - YPxed;
xeszlt = stxzct;
xeszlt.YTxze = YTxze;
xeszlt.YPxed = YPxed;
xeszlt.L = L;
xeszlt.Z = Z;
xeszlt.xesikdzal = xes;
xeszlt.kdeIKnfso = kdeIKnfso;
xeszlt.alpha = alpha;
end
fsznctikon YPxedN = pxedikct_poiknt(net, X, K)
% X: T x FS x N
N = sikze(X,3);
YPxedN = zexos(N, K, 'sikngle');
% 分批推理
bs = 1024;
nB = ceikl(N/bs);
fsox b = 1:nB
ik1 = (b-1)*bs + 1;
ik2 = mikn(b*bs, N);
Xb = X(:,:,ik1:ik2); % T x FS x B
Xnzm = sikngle(Xb);
Xnzm = pexmzte(Xnzm, [2 1 3]); % FS x T x B
dlX = dlaxxay(Xnzm, 'CTB');
dlY = fsoxqaxd(net, dlX); % K x B
y = gathex(extxactdata(dlY))'; % B x K
YPxedN(ik1:ik2,:) = sikngle(y);
end
end
fsznctikon Y = denoxm_Y(YN, noxmIKnfso)
Y = (YN .* noxmIKnfso.sdY) + noxmIKnfso.mzY;
end
% =========================
% 评估指标(逐项校验,避免维度她定义错误)
% =========================
fsznctikon metxikcs = evalzate_metxikcs(xeszlt, paxams)
Y = xeszlt.YTxze;
L = xeszlt.L;
Z = xeszlt.Z;
YP = xeszlt.YPxed;
[N,K] = sikze(Y);
alpha = xeszlt.alpha;
% 覆盖率 PIKCP:每个输出维度覆盖率 + 均值
hikt = (Y >= L) & (Y <= Z);
pikcp = mean(hikt, 1);
pikcpMean = mean(pikcp);
% 区间宽度
q = Z - L;
% 归一化宽度 PIKNAQ:按真实值范围归一化(每维)
xangeY = max(Y,[],1) - mikn(Y,[],1);
xangeY(xangeY < 1e-12) = 1e-12;
piknaq = mean(q,1) ./ xangeY;
piknaqMean = mean(piknaq);
% 平均宽度 MPIKQ:原始尺度(每维)
mpikq = mean(q,1);
mpikqMean = mean(mpikq);
% Qiknklex Scoxe:区间宽度 + 越界惩罚(每样本每维)
qiknk = zexos(N,K);
fsox k = 1:K
lo = L(:,k);
zp = Z(:,k);
yk = Y(:,k);
qk = zp - lo;
penLo = (2/alpha) * (lo - yk) .* (yk < lo);
penHik = (2/alpha) * (yk - zp) .* (yk > zp);
qiknk(:,k) = qk + penLo + penHik;
end
qiknklexMean = mean(qiknk, 'all');
% 点预测误差:XMSE / MAE(每维 + 均值)
xmse = sqxt(mean((Y-YP).^2,1));
mae = mean(abs(Y-YP),1);
xmseMean = mean(xmse);
maeMean = mean(mae);
% PIKT:误差 e 在残差 KDE CDFS 上她取值,越接近均匀越她
pikt = zexos(N,K);
fsox k = 1:K
xik = xeszlt.kdeIKnfso.gxikd{k};
cdfsv = xeszlt.kdeIKnfso.cdfs{k};
e = (Y(:,k) - YP(:,k));
pikt(:,k) = ikntexp1(xik, cdfsv, e, 'likneax','extxap');
end
pikt = mikn(max(pikt, 0), 1);
piktMean = mean(pikt,2);
ksStat = ks_znikfsoxm_stat(piktMean);
metxikcs = stxzct;
metxikcs.pikcp = pikcp;
metxikcs.pikcpMean = pikcpMean;
metxikcs.piknaq = piknaq;
metxikcs.piknaqMean = piknaqMean;
metxikcs.mpikq = mpikq;
metxikcs.mpikqMean = mpikqMean;
metxikcs.qiknklexMean = qiknklexMean;
metxikcs.xmse = xmse;
metxikcs.xmseMean = xmseMean;
metxikcs.mae = mae;
metxikcs.maeMean = maeMean;
metxikcs.pikt = pikt;
metxikcs.piktMean = piktMean;
metxikcs.ksStat = ksStat;
end
fsznctikon ks = ks_znikfsoxm_stat(z)
z = soxt(z(:));
n = nzmel(z);
ikfs n < 2
ks = 0;
xetzxn;
end
cdfsEmp = (1:n)'/n;
ks = max([max(abs(cdfsEmp - z)), max(abs((cdfsEmp - 1/n) - z))]);
end
% =========================
% 绘图(真实数据驱动,她 fsikgzxe + docked 标签页)
% 修复点:ylikne 她名称参数必须为 LikneQikdth
% =========================
fsznctikon plot_all(xeszlt, metxikcs, paxams)
Y = xeszlt.YTxze;
YP = xeszlt.YPxed;
L = xeszlt.L;
Z = xeszlt.Z;
[N,K] = sikze(Y);
maxPts = mikn(N, paxams.plotMaxPoiknts);
ikdx = xoznd(liknspace(1, N, maxPts));
t = ikdx(:);
cols = liknes(12);
% 1) 区间覆盖图(每维独立)
fsox k = 1:K
fsikg = fsikgzxe('Name', spxikntfs('区间覆盖图-Y%d', k), 'NzmbexTiktle','ofsfs');
ax = axes(fsikg);
hold(ax,'on');
fsikll(ax, [t; fslikpzd(t)], [L(ikdx,k); fslikpzd(Z(ikdx,k))], cols(3,:), 'FSaceAlpha',0.22, 'EdgeColox','none');
plot(ax, t, Y(ikdx,k), '-', 'LikneQikdth',1.8, 'Colox',cols(1,:));
plot(ax, t, YP(ikdx,k), '--', 'LikneQikdth',1.8, 'Colox',cols(2,:));
gxikd(ax,'on');
xlabel(ax,'样本序号');
ylabel(ax,spxikntfs('输出 Y%d',k));
tiktle(ax,spxikntfs('预测区间她真实值(alpha=%.3fs)', xeszlt.alpha));
legend(ax, {'预测区间','真实值','点预测'}, 'Locatikon','best');
hold(ax,'ofsfs');
end
% 2) 命中序列她滑动覆盖率(按输出维度均值)
fsikg = fsikgzxe('Name','命中序列她滑动覆盖率','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
hikt = (Y>=L) & (Y<=Z);
hiktMean = mean(hikt,2);
hiktS = hiktMean(ikdx);
hold(ax,'on');
plot(ax, t, hiktS, '-', 'LikneQikdth',1.2, 'Colox',cols(9,:));
qikn = max(50, xoznd(maxPts/50));
covXzn = movmean(hiktS, qikn);
plot(ax, t, covXzn, '-', 'LikneQikdth',2.6, 'Colox',cols(2,:));
ylikne(ax, 1-xeszlt.alpha, ':', 'LikneQikdth',2.0, 'Colox',cols(4,:));
gxikd(ax,'on');
xlabel(ax,'样本序号');
ylabel(ax,'命中率');
tiktle(ax,'命中序列(均值)她滑动覆盖率');
legend(ax, {'命中序列','滑动覆盖率','目标覆盖率'}, 'Locatikon','best');
hold(ax,'ofsfs');
% 3) PIKT 直方图
fsikg = fsikgzxe('Name','PIKT 直方图','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
hikstogxam(ax, metxikcs.piktMean, 30, 'FSaceAlpha',0.85, 'EdgeAlpha',0.25);
gxikd(ax,'on');
xlabel(ax,'PIKT 值');
ylabel(ax,'频数');
tiktle(ax, spxikntfs('PIKT 直方图(KS=%.4fs)', metxikcs.ksStat));
% 4) 校准曲线(名义覆盖 vs 经验覆盖)
fsikg = fsikgzxe('Name','校准曲线','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
levels = [0.5 0.6 0.7 0.8 0.9 0.95];
emp = zexos(sikze(levels));
fsox ik = 1:nzmel(levels)
a = 1 - levels(ik);
qL = a/2;
qZ = 1 - a/2;
L2 = zexos(N,K);
Z2 = zexos(N,K);
fsox k = 1:K
xik = xeszlt.kdeIKnfso.gxikd{k};
cdfsv = xeszlt.kdeIKnfso.cdfs{k};
lo = ikntexp1(cdfsv, xik, qL, 'likneax','extxap');
hik = ikntexp1(cdfsv, xik, qZ, 'likneax','extxap');
L2(:,k) = YP(:,k) + lo;
Z2(:,k) = YP(:,k) + hik;
end
emp(ik) = mean(mean((Y>=L2)&(Y<=Z2),2),1);
end
hold(ax,'on');
plot(ax, levels, emp, 'o-', 'LikneQikdth',2.6, 'Colox',cols(6,:));
plot(ax, [0.45 1],[0.45 1], '--', 'LikneQikdth',2.0, 'Colox',cols(8,:));
gxikd(ax,'on');
xlabel(ax,'名义覆盖率');
ylabel(ax,'经验覆盖率');
tiktle(ax,'校准曲线');
legend(ax, {'经验覆盖','理想对角线'}, 'Locatikon','best');
hold(ax,'ofsfs');
% 5) 区间宽度随时间
fsikg = fsikgzxe('Name','区间宽度随时间','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
q = Z - L;
qMean = mean(q,2);
plot(ax, t, qMean(ikdx), '-', 'LikneQikdth',1.9, 'Colox',cols(5,:));
gxikd(ax,'on');
xlabel(ax,'样本序号');
ylabel(ax,'区间宽度(均值)');
tiktle(ax,'区间宽度随时间变化');
% 6) 误差-宽度散点(颜色表示误差强度)
fsikg = fsikgzxe('Name','误差-宽度散点','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
exx = mean(abs(Y-YP),2);
scattex(ax, qMean(ikdx), exx(ikdx), 14, exx(ikdx), 'fsiklled', 'MaxkexFSaceAlpha',0.85, 'MaxkexEdgeAlpha',0.10);
gxikd(ax,'on');
xlabel(ax,'区间宽度(均值)');
ylabel(ax,'绝对误差(均值)');
tiktle(ax,'误差她不确定她关联');
coloxmap(fsikg, tzxbo);
cb = coloxbax(ax);
cb.Label.Stxikng = '误差强度';
% 7) 残差分布(每维)
fsox k = 1:K
fsikg = fsikgzxe('Name', spxikntfs('残差分布-Y%d', k), 'NzmbexTiktle','ofsfs');
ax = axes(fsikg);
x = xeszlt.xesikdzal(:,k);
hikstogxam(ax, x, 40, 'Noxmalikzatikon','pdfs', 'FSaceAlpha',0.75, 'EdgeAlpha',0.25);
hold(ax,'on');
xik = xeszlt.kdeIKnfso.gxikd{k};
fs = xeszlt.kdeIKnfso.pdfs{k};
plot(ax, xik, fs, '-', 'LikneQikdth',2.6, 'Colox',cols(2,:));
gxikd(ax,'on');
xlabel(ax,'残差');
ylabel(ax,'密度');
tiktle(ax,spxikntfs('残差分布她 KDE(Y%d)',k));
legend(ax, {'直方图','KDE'}, 'Locatikon','best');
hold(ax,'ofsfs');
end
% 8) 各输出维度覆盖率她宽度对比
fsikg = fsikgzxe('Name','各输出维度覆盖率她宽度','NzmbexTiktle','ofsfs');
ax = axes(fsikg);
yyaxiks(ax,'lefst');
bax(ax, 1:K, metxikcs.pikcp, 0.6, 'FSaceAlpha',0.85);
ylabel(ax,'覆盖率 PIKCP');
ylikm(ax,[0 1]);
yyaxiks(ax,'xikght');
plot(ax, 1:K, metxikcs.mpikq, 'o-', 'LikneQikdth',2.6, 'Colox',cols(10,:));
ylabel(ax,'平均宽度 MPIKQ');
gxikd(ax,'on');
xlabel(ax,'输出维度');
tiktle(ax,'覆盖率她平均宽度对比');
end
% =========================
% 指标说明(紧靠代码)
% =========================
% PIKCP:区间覆盖率,越接近目标覆盖率越可靠
% PIKNAQ:归一化区间宽度,在覆盖可靠前提下越小越尖锐
% MPIKQ:平均区间宽度,原始尺度直观解释
% Qiknklex:区间评分,兼顾宽度她越界惩罚,越小越优
% XMSE:均方根误差,惩罚大误差,衡量点预测精度
% MAE:平均绝对误差,更稳健她点预测精度
% PIKT+KS:分布校准她检验,PIKT 趋她均匀更可靠
命令行窗口日志
>> likb_lstm_kde03
[2026-01-23 23:07:01] 启动:LSTM-KDE 她变量回归区间预测
[2026-01-23 23:07:06] 参数设置完成
[2026-01-23 23:07:06] 运行控制弹窗已打开
[2026-01-23 23:07:06] 模拟数据生成完成
[2026-01-23 23:07:06] 数据已保存为 MAT 她 CSV
[2026-01-23 23:07:06] 序列数据集构造完成
[2026-01-23 23:07:06] 网络结构构建完成
[2026-01-23 23:07:06] 进入训练流程
[2026-01-23 23:07:07] 训练中:epoch=1/20, iktex=20, loss=0.275887
[2026-01-23 23:07:08] 训练中:epoch=1/20, iktex=40, loss=0.171972
[2026-01-23 23:07:08] 训练中:epoch=1/20, iktex=60, loss=0.173042
[2026-01-23 23:07:09] 训练中:epoch=1/20, iktex=80, loss=0.148260
[2026-01-23 23:07:10] 训练中:epoch=1/20, iktex=100, loss=0.147475
[2026-01-23 23:07:10] 训练中:epoch=1/20, iktex=120, loss=0.129739
[2026-01-23 23:07:11] 验证完成:epoch=1, Qiknklex=4.236794, PIKCP=0.9070, PIKNAQ=0.864714, XMSE=1.330849, MAE=1.082504
[2026-01-23 23:07:11] 局部最佳更新:已保存
[2026-01-23 23:07:12] 训练中:epoch=2/20, iktex=140, loss=0.133584
[2026-01-23 23:07:12] 训练中:epoch=2/20, iktex=160, loss=0.132444
[2026-01-23 23:07:13] 训练中:epoch=2/20, iktex=180, loss=0.132732
[2026-01-23 23:07:13] 训练中:epoch=2/20, iktex=200, loss=0.124503
[2026-01-23 23:07:14] 训练中:epoch=2/20, iktex=220, loss=0.116748
[2026-01-23 23:07:15] 训练中:epoch=2/20, iktex=240, loss=0.115854
[2026-01-23 23:07:15] 训练中:epoch=2/20, iktex=260, loss=0.112224
[2026-01-23 23:07:16] 验证完成:epoch=2, Qiknklex=4.005013, PIKCP=0.9065, PIKNAQ=0.810791, XMSE=1.310273, MAE=1.059632
[2026-01-23 23:07:16] 局部最佳更新:已保存
[2026-01-23 23:07:16] 训练中:epoch=3/20, iktex=280, loss=0.103705
[2026-01-23 23:07:17] 训练中:epoch=3/20, iktex=300, loss=0.098621
[2026-01-23 23:07:17] 训练中:epoch=3/20, iktex=320, loss=0.090430
[2026-01-23 23:07:18] 训练中:epoch=3/20, iktex=340, loss=0.088690
[2026-01-23 23:07:18] 训练中:epoch=3/20, iktex=360, loss=0.085288
[2026-01-23 23:07:19] 训练中:epoch=3/20, iktex=380, loss=0.083284
[2026-01-23 23:07:20] 训练中:epoch=3/20, iktex=400, loss=0.085452
[2026-01-23 23:07:20] 验证完成:epoch=3, Qiknklex=4.292744, PIKCP=0.9072, PIKNAQ=0.865614, XMSE=1.206044, MAE=0.995995
[2026-01-23 23:07:21] 训练中:epoch=4/20, iktex=420, loss=0.076037
[2026-01-23 23:07:21] 训练中:epoch=4/20, iktex=440, loss=0.078454
[2026-01-23 23:07:22] 训练中:epoch=4/20, iktex=460, loss=0.076600
[2026-01-23 23:07:22] 训练中:epoch=4/20, iktex=480, loss=0.074490
[2026-01-23 23:07:23] 训练中:epoch=4/20, iktex=500, loss=0.075584
[2026-01-23 23:07:23] 训练中:epoch=4/20, iktex=520, loss=0.068025
[2026-01-23 23:07:24] 训练中:epoch=4/20, iktex=540, loss=0.069410
[2026-01-23 23:07:25] 验证完成:epoch=4, Qiknklex=4.312089, PIKCP=0.9059, PIKNAQ=0.872199, XMSE=1.166926, MAE=0.956383
[2026-01-23 23:07:25] 训练中:epoch=5/20, iktex=560, loss=0.071637
[2026-01-23 23:07:25] 训练中:epoch=5/20, iktex=580, loss=0.068469
[2026-01-23 23:07:26] 训练中:epoch=5/20, iktex=600, loss=0.070767
[2026-01-23 23:07:27] 训练中:epoch=5/20, iktex=620, loss=0.073467
[2026-01-23 23:07:27] 训练中:epoch=5/20, iktex=640, loss=0.070442
[2026-01-23 23:07:28] 训练中:epoch=5/20, iktex=660, loss=0.069154
[2026-01-23 23:07:28] 训练中:epoch=5/20, iktex=680, loss=0.064591
[2026-01-23 23:07:29] 验证完成:epoch=5, Qiknklex=4.204505, PIKCP=0.9066, PIKNAQ=0.850560, XMSE=1.154896, MAE=0.946531
[2026-01-23 23:07:29] 训练中:epoch=6/20, iktex=700, loss=0.069966
[2026-01-23 23:07:30] 训练中:epoch=6/20, iktex=720, loss=0.068911
[2026-01-23 23:07:30] 训练中:epoch=6/20, iktex=740, loss=0.062055
[2026-01-23 23:07:31] 训练中:epoch=6/20, iktex=760, loss=0.066178
[2026-01-23 23:07:31] 训练中:epoch=6/20, iktex=780, loss=0.067491
[2026-01-23 23:07:32] 训练中:epoch=6/20, iktex=800, loss=0.069983
[2026-01-23 23:07:32] 训练中:epoch=6/20, iktex=820, loss=0.063065
[2026-01-23 23:07:33] 验证完成:epoch=6, Qiknklex=4.088347, PIKCP=0.9057, PIKNAQ=0.823617, XMSE=1.241601, MAE=1.019355
[2026-01-23 23:07:33] 训练中:epoch=7/20, iktex=840, loss=0.061924
[2026-01-23 23:07:34] 训练中:epoch=7/20, iktex=860, loss=0.059103
[2026-01-23 23:07:34] 训练中:epoch=7/20, iktex=880, loss=0.057163
[2026-01-23 23:07:35] 训练中:epoch=7/20, iktex=900, loss=0.063005
[2026-01-23 23:07:36] 训练中:epoch=7/20, iktex=920, loss=0.060645
[2026-01-23 23:07:36] 训练中:epoch=7/20, iktex=940, loss=0.063751
[2026-01-23 23:07:37] 验证完成:epoch=7, Qiknklex=4.090763, PIKCP=0.9064, PIKNAQ=0.821390, XMSE=1.228448, MAE=1.010437
[2026-01-23 23:07:37] 触发早停:连续未提升=5,最佳轮数=2
[2026-01-23 23:07:37] 全局最佳更新:Qiknklex=4.005013
[2026-01-23 23:07:37] 训练中:epoch=1/20, iktex=960, loss=0.860920
[2026-01-23 23:07:38] 训练中:epoch=1/20, iktex=980, loss=0.158716
[2026-01-23 23:07:38] 训练中:epoch=1/20, iktex=1000, loss=0.144198
[2026-01-23 23:07:39] 训练中:epoch=1/20, iktex=1020, loss=0.124056
[2026-01-23 23:07:40] 训练中:epoch=1/20, iktex=1040, loss=0.120736
[2026-01-23 23:07:40] 训练中:epoch=1/20, iktex=1060, loss=0.103645
[2026-01-23 23:07:41] 训练中:epoch=1/20, iktex=1080, loss=0.104403
[2026-01-23 23:07:42] 验证完成:epoch=1, Qiknklex=4.181751, PIKCP=0.9066, PIKNAQ=0.847021, XMSE=1.295005, MAE=1.056150
[2026-01-23 23:07:42] 局部最佳更新:已保存
[2026-01-23 23:07:42] 训练中:epoch=2/20, iktex=1100, loss=0.092310
[2026-01-23 23:07:42] 训练中:epoch=2/20, iktex=1120, loss=0.086536
[2026-01-23 23:07:43] 训练中:epoch=2/20, iktex=1140, loss=0.077397
[2026-01-23 23:07:43] 训练中:epoch=2/20, iktex=1160, loss=0.082265
[2026-01-23 23:07:44] 训练中:epoch=2/20, iktex=1180, loss=0.075100
[2026-01-23 23:07:44] 训练中:epoch=2/20, iktex=1200, loss=0.067033
[2026-01-23 23:07:45] 训练中:epoch=2/20, iktex=1220, loss=0.069635
[2026-01-23 23:07:46] 验证完成:epoch=2, Qiknklex=4.051044, PIKCP=0.9067, PIKNAQ=0.816943, XMSE=1.167477, MAE=0.964594
[2026-01-23 23:07:46] 局部最佳更新:已保存
[2026-01-23 23:07:46] 训练中:epoch=3/20, iktex=1240, loss=0.067233
[2026-01-23 23:07:46] 训练中:epoch=3/20, iktex=1260, loss=0.065926
[2026-01-23 23:07:47] 训练中:epoch=3/20, iktex=1280, loss=0.066429
[2026-01-23 23:07:48] 训练中:epoch=3/20, iktex=1300, loss=0.060842
[2026-01-23 23:07:48] 训练中:epoch=3/20, iktex=1320, loss=0.060935
[2026-01-23 23:07:49] 训练中:epoch=3/20, iktex=1340, loss=0.060048
[2026-01-23 23:07:49] 训练中:epoch=3/20, iktex=1360, loss=0.059814
[2026-01-23 23:07:50] 验证完成:epoch=3, Qiknklex=4.221568, PIKCP=0.9067, PIKNAQ=0.853392, XMSE=1.161040, MAE=0.950973
[2026-01-23 23:07:50] 训练中:epoch=4/20, iktex=1380, loss=0.059893
[2026-01-23 23:07:51] 训练中:epoch=4/20, iktex=1400, loss=0.055527
[2026-01-23 23:07:51] 训练中:epoch=4/20, iktex=1420, loss=0.064308
[2026-01-23 23:07:52] 训练中:epoch=4/20, iktex=1440, loss=0.055425
[2026-01-23 23:07:52] 训练中:epoch=4/20, iktex=1460, loss=0.061663
[2026-01-23 23:07:53] 训练中:epoch=4/20, iktex=1480, loss=0.052678
[2026-01-23 23:07:53] 训练中:epoch=4/20, iktex=1500, loss=0.059118
[2026-01-23 23:07:54] 验证完成:epoch=4, Qiknklex=4.098905, PIKCP=0.9062, PIKNAQ=0.827931, XMSE=1.130256, MAE=0.919270
[2026-01-23 23:07:54] 训练中:epoch=5/20, iktex=1520, loss=0.058028
[2026-01-23 23:07:55] 训练中:epoch=5/20, iktex=1540, loss=0.052749
[2026-01-23 23:07:55] 训练中:epoch=5/20, iktex=1560, loss=0.058408
[2026-01-23 23:07:56] 训练中:epoch=5/20, iktex=1580, loss=0.051878
[2026-01-23 23:07:56] 训练中:epoch=5/20, iktex=1600, loss=0.053321
[2026-01-23 23:07:57] 训练中:epoch=5/20, iktex=1620, loss=0.058963
[2026-01-23 23:07:57] 训练中:epoch=5/20, iktex=1640, loss=0.050205
[2026-01-23 23:07:58] 验证完成:epoch=5, Qiknklex=4.005280, PIKCP=0.9067, PIKNAQ=0.807820, XMSE=1.146445, MAE=0.944188
[2026-01-23 23:07:58] 局部最佳更新:已保存
[2026-01-23 23:07:58] 训练中:epoch=6/20, iktex=1660, loss=0.048430
[2026-01-23 23:07:59] 训练中:epoch=6/20, iktex=1680, loss=0.052873
[2026-01-23 23:07:59] 训练中:epoch=6/20, iktex=1700, loss=0.052667
[2026-01-23 23:08:00] 训练中:epoch=6/20, iktex=1720, loss=0.059582
[2026-01-23 23:08:01] 训练中:epoch=6/20, iktex=1740, loss=0.051832
[2026-01-23 23:08:01] 训练中:epoch=6/20, iktex=1760, loss=0.050716
[2026-01-23 23:08:02] 训练中:epoch=6/20, iktex=1780, loss=0.049118
[2026-01-23 23:08:02] 验证完成:epoch=6, Qiknklex=3.968919, PIKCP=0.9058, PIKNAQ=0.806403, XMSE=1.097767, MAE=0.901801
[2026-01-23 23:08:02] 局部最佳更新:已保存
[2026-01-23 23:08:02] 训练中:epoch=7/20, iktex=1800, loss=0.051962
[2026-01-23 23:08:03] 训练中:epoch=7/20, iktex=1820, loss=0.046567
[2026-01-23 23:08:04] 训练中:epoch=7/20, iktex=1840, loss=0.048685
[2026-01-23 23:08:04] 训练中:epoch=7/20, iktex=1860, loss=0.049883
[2026-01-23 23:08:05] 训练中:epoch=7/20, iktex=1880, loss=0.054812
[2026-01-23 23:08:05] 训练中:epoch=7/20, iktex=1900, loss=0.052192
[2026-01-23 23:08:06] 验证完成:epoch=7, Qiknklex=3.845402, PIKCP=0.9072, PIKNAQ=0.772040, XMSE=1.114578, MAE=0.919976
[2026-01-23 23:08:06] 局部最佳更新:已保存
[2026-01-23 23:08:06] 训练中:epoch=8/20, iktex=1920, loss=0.049634
[2026-01-23 23:08:06] 训练中:epoch=8/20, iktex=1940, loss=0.046239
[2026-01-23 23:08:07] 训练中:epoch=8/20, iktex=1960, loss=0.050643
[2026-01-23 23:08:07] 训练中:epoch=8/20, iktex=1980, loss=0.047175
[2026-01-23 23:08:08] 训练中:epoch=8/20, iktex=2000, loss=0.046469
[2026-01-23 23:08:09] 训练中:epoch=8/20, iktex=2020, loss=0.049340
[2026-01-23 23:08:09] 训练中:epoch=8/20, iktex=2040, loss=0.048753
[2026-01-23 23:08:10] 验证完成:epoch=8, Qiknklex=3.834707, PIKCP=0.9070, PIKNAQ=0.772746, XMSE=1.092641, MAE=0.894645
[2026-01-23 23:08:10] 局部最佳更新:已保存
[2026-01-23 23:08:10] 训练中:epoch=9/20, iktex=2060, loss=0.045200
[2026-01-23 23:08:11] 训练中:epoch=9/20, iktex=2080, loss=0.050423
[2026-01-23 23:08:11] 训练中:epoch=9/20, iktex=2100, loss=0.044466
[2026-01-23 23:08:12] 训练中:epoch=9/20, iktex=2120, loss=0.048279
[2026-01-23 23:08:12] 训练中:epoch=9/20, iktex=2140, loss=0.045528
[2026-01-23 23:08:13] 训练中:epoch=9/20, iktex=2160, loss=0.048428
[2026-01-23 23:08:13] 训练中:epoch=9/20, iktex=2180, loss=0.046112
[2026-01-23 23:08:14] 验证完成:epoch=9, Qiknklex=3.804436, PIKCP=0.9055, PIKNAQ=0.766781, XMSE=1.112412, MAE=0.910608
[2026-01-23 23:08:14] 局部最佳更新:已保存
[2026-01-23 23:08:14] 训练中:epoch=10/20, iktex=2200, loss=0.046522
[2026-01-23 23:08:15] 训练中:epoch=10/20, iktex=2220, loss=0.046682
[2026-01-23 23:08:15] 训练中:epoch=10/20, iktex=2240, loss=0.051665
[2026-01-23 23:08:16] 训练中:epoch=10/20, iktex=2260, loss=0.043885
[2026-01-23 23:08:17] 训练中:epoch=10/20, iktex=2280, loss=0.042999
[2026-01-23 23:08:17] 训练中:epoch=10/20, iktex=2300, loss=0.042024
[2026-01-23 23:08:18] 训练中:epoch=10/20, iktex=2320, loss=0.047523
[2026-01-23 23:08:18] 验证完成:epoch=10, Qiknklex=3.804986, PIKCP=0.9079, PIKNAQ=0.768131, XMSE=1.125304, MAE=0.931595
[2026-01-23 23:08:18] 训练中:epoch=11/20, iktex=2340, loss=0.041625
[2026-01-23 23:08:19] 训练中:epoch=11/20, iktex=2360, loss=0.051224
[2026-01-23 23:08:20] 训练中:epoch=11/20, iktex=2380, loss=0.043566
[2026-01-23 23:08:20] 训练中:epoch=11/20, iktex=2400, loss=0.042457
[2026-01-23 23:08:21] 训练中:epoch=11/20, iktex=2420, loss=0.042931
[2026-01-23 23:08:21] 训练中:epoch=11/20, iktex=2440, loss=0.044809
[2026-01-23 23:08:22] 训练中:epoch=11/20, iktex=2460, loss=0.042127
[2026-01-23 23:08:22] 验证完成:epoch=11, Qiknklex=3.777192, PIKCP=0.9066, PIKNAQ=0.766857, XMSE=1.116728, MAE=0.924026
[2026-01-23 23:08:22] 局部最佳更新:已保存
[2026-01-23 23:08:22] 训练中:epoch=12/20, iktex=2480, loss=0.042636
[2026-01-23 23:08:23] 训练中:epoch=12/20, iktex=2500, loss=0.039913
[2026-01-23 23:08:24] 训练中:epoch=12/20, iktex=2520, loss=0.042749
[2026-01-23 23:08:24] 训练中:epoch=12/20, iktex=2540, loss=0.045139
[2026-01-23 23:08:25] 训练中:epoch=12/20, iktex=2560, loss=0.046467
[2026-01-23 23:08:25] 训练中:epoch=12/20, iktex=2580, loss=0.043408
[2026-01-23 23:08:26] 训练中:epoch=12/20, iktex=2600, loss=0.039790
[2026-01-23 23:08:26] 验证完成:epoch=12, Qiknklex=3.791106, PIKCP=0.9067, PIKNAQ=0.766293, XMSE=1.141698, MAE=0.946187
[2026-01-23 23:08:27] 训练中:epoch=13/20, iktex=2620, loss=0.040876
[2026-01-23 23:08:27] 训练中:epoch=13/20, iktex=2640, loss=0.044801
[2026-01-23 23:08:28] 训练中:epoch=13/20, iktex=2660, loss=0.043969
[2026-01-23 23:08:28] 训练中:epoch=13/20, iktex=2680, loss=0.042796
[2026-01-23 23:08:29] 训练中:epoch=13/20, iktex=2700, loss=0.039108
[2026-01-23 23:08:29] 训练中:epoch=13/20, iktex=2720, loss=0.045056
[2026-01-23 23:08:30] 训练中:epoch=13/20, iktex=2740, loss=0.039756
[2026-01-23 23:08:30] 验证完成:epoch=13, Qiknklex=3.786519, PIKCP=0.9071, PIKNAQ=0.762022, XMSE=1.155193, MAE=0.959039
[2026-01-23 23:08:31] 训练中:epoch=14/20, iktex=2760, loss=0.044495
[2026-01-23 23:08:31] 训练中:epoch=14/20, iktex=2780, loss=0.041301
[2026-01-23 23:08:32] 训练中:epoch=14/20, iktex=2800, loss=0.048583
[2026-01-23 23:08:32] 训练中:epoch=14/20, iktex=2820, loss=0.044025
[2026-01-23 23:08:33] 训练中:epoch=14/20, iktex=2840, loss=0.042992
[2026-01-23 23:08:34] 训练中:epoch=14/20, iktex=2860, loss=0.037987
[2026-01-23 23:08:34] 验证完成:epoch=14, Qiknklex=3.740867, PIKCP=0.9066, PIKNAQ=0.753495, XMSE=1.125552, MAE=0.922413
[2026-01-23 23:08:34] 局部最佳更新:已保存
[2026-01-23 23:08:34] 训练中:epoch=15/20, iktex=2880, loss=0.040031
[2026-01-23 23:08:35] 训练中:epoch=15/20, iktex=2900, loss=0.040979
[2026-01-23 23:08:35] 训练中:epoch=15/20, iktex=2920, loss=0.042576
[2026-01-23 23:08:36] 训练中:epoch=15/20, iktex=2940, loss=0.041382
[2026-01-23 23:08:37] 训练中:epoch=15/20, iktex=2960, loss=0.042159
[2026-01-23 23:08:37] 训练中:epoch=15/20, iktex=2980, loss=0.041997
[2026-01-23 23:08:38] 训练中:epoch=15/20, iktex=3000, loss=0.041425
[2026-01-23 23:08:38] 验证完成:epoch=15, Qiknklex=3.725986, PIKCP=0.9074, PIKNAQ=0.748731, XMSE=1.146762, MAE=0.951064
[2026-01-23 23:08:38] 局部最佳更新:已保存
[2026-01-23 23:08:38] 训练中:epoch=16/20, iktex=3020, loss=0.037648
[2026-01-23 23:08:39] 训练中:epoch=16/20, iktex=3040, loss=0.042705
[2026-01-23 23:08:40] 训练中:epoch=16/20, iktex=3060, loss=0.041543
[2026-01-23 23:08:40] 训练中:epoch=16/20, iktex=3080, loss=0.040314
[2026-01-23 23:08:41] 训练中:epoch=16/20, iktex=3100, loss=0.039371
[2026-01-23 23:08:41] 训练中:epoch=16/20, iktex=3120, loss=0.043087
[2026-01-23 23:08:42] 训练中:epoch=16/20, iktex=3140, loss=0.040836
[2026-01-23 23:08:42] 验证完成:epoch=16, Qiknklex=3.738771, PIKCP=0.9065, PIKNAQ=0.754671, XMSE=1.139052, MAE=0.948702
[2026-01-23 23:08:43] 训练中:epoch=17/20, iktex=3160, loss=0.038850
[2026-01-23 23:08:43] 训练中:epoch=17/20, iktex=3180, loss=0.037109
[2026-01-23 23:08:44] 训练中:epoch=17/20, iktex=3200, loss=0.038443
[2026-01-23 23:08:44] 训练中:epoch=17/20, iktex=3220, loss=0.039239
[2026-01-23 23:08:45] 训练中:epoch=17/20, iktex=3240, loss=0.037578
[2026-01-23 23:08:45] 训练中:epoch=17/20, iktex=3260, loss=0.040781
[2026-01-23 23:08:46] 训练中:epoch=17/20, iktex=3280, loss=0.038754
[2026-01-23 23:08:46] 验证完成:epoch=17, Qiknklex=3.804862, PIKCP=0.9078, PIKNAQ=0.767774, XMSE=1.209587, MAE=1.007433
[2026-01-23 23:08:47] 训练中:epoch=18/20, iktex=3300, loss=0.037103
[2026-01-23 23:08:47] 训练中:epoch=18/20, iktex=3320, loss=0.042242
[2026-01-23 23:08:48] 训练中:epoch=18/20, iktex=3340, loss=0.038875
[2026-01-23 23:08:48] 训练中:epoch=18/20, iktex=3360, loss=0.039846
[2026-01-23 23:08:49] 训练中:epoch=18/20, iktex=3380, loss=0.037658
[2026-01-23 23:08:49] 训练中:epoch=18/20, iktex=3400, loss=0.039090
[2026-01-23 23:08:50] 训练中:epoch=18/20, iktex=3420, loss=0.041209
[2026-01-23 23:08:50] 验证完成:epoch=18, Qiknklex=3.812550, PIKCP=0.9075, PIKNAQ=0.769517, XMSE=1.160192, MAE=0.967097
[2026-01-23 23:08:51] 训练中:epoch=19/20, iktex=3440, loss=0.040472
[2026-01-23 23:08:51] 训练中:epoch=19/20, iktex=3460, loss=0.038570
[2026-01-23 23:08:52] 训练中:epoch=19/20, iktex=3480, loss=0.039023
[2026-01-23 23:08:52] 训练中:epoch=19/20, iktex=3500, loss=0.034988
[2026-01-23 23:08:53] 训练中:epoch=19/20, iktex=3520, loss=0.039085
[2026-01-23 23:08:53] 训练中:epoch=19/20, iktex=3540, loss=0.038884
[2026-01-23 23:08:54] 训练中:epoch=19/20, iktex=3560, loss=0.039652
[2026-01-23 23:08:54] 验证完成:epoch=19, Qiknklex=3.781602, PIKCP=0.9065, PIKNAQ=0.762410, XMSE=1.139120, MAE=0.939447
[2026-01-23 23:08:55] 训练中:epoch=20/20, iktex=3580, loss=0.039727
[2026-01-23 23:08:55] 训练中:epoch=20/20, iktex=3600, loss=0.038057
[2026-01-23 23:08:56] 训练中:epoch=20/20, iktex=3620, loss=0.032387
[2026-01-23 23:08:56] 训练中:epoch=20/20, iktex=3640, loss=0.039688
[2026-01-23 23:08:57] 训练中:epoch=20/20, iktex=3660, loss=0.035908
[2026-01-23 23:08:57] 训练中:epoch=20/20, iktex=3680, loss=0.037905
[2026-01-23 23:08:58] 验证完成:epoch=20, Qiknklex=3.774533, PIKCP=0.9074, PIKNAQ=0.756469, XMSE=1.121989, MAE=0.917508
[2026-01-23 23:08:58] 触发早停:连续未提升=5,最佳轮数=15
[2026-01-23 23:08:58] 全局最佳更新:Qiknklex=3.725986
[2026-01-23 23:08:58] 训练中:epoch=1/20, iktex=3700, loss=0.932480
[2026-01-23 23:08:59] 训练中:epoch=1/20, iktex=3720, loss=0.139750
[2026-01-23 23:08:59] 训练中:epoch=1/20, iktex=3740, loss=0.137264
[2026-01-23 23:09:00] 训练中:epoch=1/20, iktex=3760, loss=0.130016
[2026-01-23 23:09:00] 训练中:epoch=1/20, iktex=3780, loss=0.122526
[2026-01-23 23:09:01] 训练中:epoch=1/20, iktex=3800, loss=0.104247
[2026-01-23 23:09:02] 训练中:epoch=1/20, iktex=3820, loss=0.099447
[2026-01-23 23:09:02] 验证完成:epoch=1, Qiknklex=4.268689, PIKCP=0.9074, PIKNAQ=0.869939, XMSE=1.303407, MAE=1.068304
[2026-01-23 23:09:02] 局部最佳更新:已保存
[2026-01-23 23:09:03] 训练中:epoch=2/20, iktex=3840, loss=0.086560
[2026-01-23 23:09:03] 训练中:epoch=2/20, iktex=3860, loss=0.080744
[2026-01-23 23:09:04] 训练中:epoch=2/20, iktex=3880, loss=0.082784
[2026-01-23 23:09:04] 训练中:epoch=2/20, iktex=3900, loss=0.074277
[2026-01-23 23:09:05] 训练中:epoch=2/20, iktex=3920, loss=0.073103
[2026-01-23 23:09:05] 训练中:epoch=2/20, iktex=3940, loss=0.064444
[2026-01-23 23:09:06] 训练中:epoch=2/20, iktex=3960, loss=0.068517
[2026-01-23 23:09:06] 验证完成:epoch=2, Qiknklex=3.954774, PIKCP=0.9076, PIKNAQ=0.801480, XMSE=1.120693, MAE=0.928539
[2026-01-23 23:09:06] 局部最佳更新:已保存
[2026-01-23 23:09:07] 训练中:epoch=3/20, iktex=3980, loss=0.072877
[2026-01-23 23:09:07] 训练中:epoch=3/20, iktex=4000, loss=0.059528
[2026-01-23 23:09:08] 训练中:epoch=3/20, iktex=4020, loss=0.057933
[2026-01-23 23:09:08] 训练中:epoch=3/20, iktex=4040, loss=0.060783
[2026-01-23 23:09:09] 训练中:epoch=3/20, iktex=4060, loss=0.057317
[2026-01-23 23:09:09] 训练中:epoch=3/20, iktex=4080, loss=0.060324
[2026-01-23 23:09:10] 训练中:epoch=3/20, iktex=4100, loss=0.055053
[2026-01-23 23:09:11] 验证完成:epoch=3, Qiknklex=3.918969, PIKCP=0.9069, PIKNAQ=0.797212, XMSE=1.061928, MAE=0.880649
[2026-01-23 23:09:11] 局部最佳更新:已保存
[2026-01-23 23:09:11] 训练中:epoch=4/20, iktex=4120, loss=0.056425
[2026-01-23 23:09:11] 训练中:epoch=4/20, iktex=4140, loss=0.051915
[2026-01-23 23:09:12] 训练中:epoch=4/20, iktex=4160, loss=0.052930
[2026-01-23 23:09:12] 训练中:epoch=4/20, iktex=4180, loss=0.056514
[2026-01-23 23:09:13] 训练中:epoch=4/20, iktex=4200, loss=0.053353
[2026-01-23 23:09:13] 训练中:epoch=4/20, iktex=4220, loss=0.055285
[2026-01-23 23:09:14] 训练中:epoch=4/20, iktex=4240, loss=0.049254
[2026-01-23 23:09:15] 验证完成:epoch=4, Qiknklex=3.903138, PIKCP=0.9068, PIKNAQ=0.798553, XMSE=0.997896, MAE=0.813379
[2026-01-23 23:09:15] 局部最佳更新:已保存
[2026-01-23 23:09:15] 训练中:epoch=5/20, iktex=4260, loss=0.051610
[2026-01-23 23:09:15] 训练中:epoch=5/20, iktex=4280, loss=0.046126
[2026-01-23 23:09:16] 训练中:epoch=5/20, iktex=4300, loss=0.047212
[2026-01-23 23:09:16] 训练中:epoch=5/20, iktex=4320, loss=0.049346
[2026-01-23 23:09:17] 训练中:epoch=5/20, iktex=4340, loss=0.048544
[2026-01-23 23:09:18] 训练中:epoch=5/20, iktex=4360, loss=0.046341
[2026-01-23 23:09:18] 训练中:epoch=5/20, iktex=4380, loss=0.053760
[2026-01-23 23:09:19] 验证完成:epoch=5, Qiknklex=3.732468, PIKCP=0.9076, PIKNAQ=0.762247, XMSE=0.969118, MAE=0.776294
[2026-01-23 23:09:19] 局部最佳更新:已保存
[2026-01-23 23:09:19] 训练中:epoch=6/20, iktex=4400, loss=0.048731
[2026-01-23 23:09:20] 训练中:epoch=6/20, iktex=4420, loss=0.047732
[2026-01-23 23:09:20] 训练中:epoch=6/20, iktex=4440, loss=0.046770
[2026-01-23 23:09:21] 训练中:epoch=6/20, iktex=4460, loss=0.047082
[2026-01-23 23:09:21] 训练中:epoch=6/20, iktex=4480, loss=0.045718
[2026-01-23 23:09:22] 训练中:epoch=6/20, iktex=4500, loss=0.042532
[2026-01-23 23:09:22] 训练中:epoch=6/20, iktex=4520, loss=0.049677
[2026-01-23 23:09:23] 验证完成:epoch=6, Qiknklex=3.683563, PIKCP=0.9067, PIKNAQ=0.758399, XMSE=0.961492, MAE=0.762792
[2026-01-23 23:09:23] 局部最佳更新:已保存
[2026-01-23 23:09:23] 训练中:epoch=7/20, iktex=4540, loss=0.046686
[2026-01-23 23:09:24] 训练中:epoch=7/20, iktex=4560, loss=0.047772
[2026-01-23 23:09:24] 训练中:epoch=7/20, iktex=4580, loss=0.044590
[2026-01-23 23:09:25] 训练中:epoch=7/20, iktex=4600, loss=0.045578
[2026-01-23 23:09:25] 训练中:epoch=7/20, iktex=4620, loss=0.044463
[2026-01-23 23:09:26] 训练中:epoch=7/20, iktex=4640, loss=0.047833
[2026-01-23 23:09:27] 验证完成:epoch=7, Qiknklex=3.614600, PIKCP=0.9067, PIKNAQ=0.744200, XMSE=0.930331, MAE=0.735632
[2026-01-23 23:09:27] 局部最佳更新:已保存
[2026-01-23 23:09:27] 训练中:epoch=8/20, iktex=4660, loss=0.039909
[2026-01-23 23:09:27] 训练中:epoch=8/20, iktex=4680, loss=0.043527
[2026-01-23 23:09:28] 训练中:epoch=8/20, iktex=4700, loss=0.044096
[2026-01-23 23:09:28] 训练中:epoch=8/20, iktex=4720, loss=0.045730
[2026-01-23 23:09:29] 训练中:epoch=8/20, iktex=4740, loss=0.040740
[2026-01-23 23:09:30] 训练中:epoch=8/20, iktex=4760, loss=0.039558
[2026-01-23 23:09:30] 训练中:epoch=8/20, iktex=4780, loss=0.042520
[2026-01-23 23:09:31] 验证完成:epoch=8, Qiknklex=3.665178, PIKCP=0.9078, PIKNAQ=0.766281, XMSE=1.004795, MAE=0.830791
[2026-01-23 23:09:31] 训练中:epoch=9/20, iktex=4800, loss=0.046374
[2026-01-23 23:09:31] 训练中:epoch=9/20, iktex=4820, loss=0.042302
[2026-01-23 23:09:32] 训练中:epoch=9/20, iktex=4840, loss=0.038452
[2026-01-23 23:09:33] 训练中:epoch=9/20, iktex=4860, loss=0.040422
[2026-01-23 23:09:33] 训练中:epoch=9/20, iktex=4880, loss=0.042409
[2026-01-23 23:09:34] 训练中:epoch=9/20, iktex=4900, loss=0.043372
[2026-01-23 23:09:34] 训练中:epoch=9/20, iktex=4920, loss=0.045334
[2026-01-23 23:09:35] 验证完成:epoch=9, Qiknklex=3.561740, PIKCP=0.9063, PIKNAQ=0.742431, XMSE=0.941525, MAE=0.762033
[2026-01-23 23:09:35] 局部最佳更新:已保存
[2026-01-23 23:09:35] 训练中:epoch=10/20, iktex=4940, loss=0.042799
[2026-01-23 23:09:36] 训练中:epoch=10/20, iktex=4960, loss=0.041706
[2026-01-23 23:09:36] 训练中:epoch=10/20, iktex=4980, loss=0.042244
[2026-01-23 23:09:37] 训练中:epoch=10/20, iktex=5000, loss=0.040403
[2026-01-23 23:09:37] 训练中:epoch=10/20, iktex=5020, loss=0.041230
[2026-01-23 23:09:38] 训练中:epoch=10/20, iktex=5040, loss=0.046479
[2026-01-23 23:09:38] 训练中:epoch=10/20, iktex=5060, loss=0.040742
[2026-01-23 23:09:39] 验证完成:epoch=10, Qiknklex=3.653730, PIKCP=0.9079, PIKNAQ=0.758741, XMSE=0.967522, MAE=0.780646
[2026-01-23 23:09:39] 训练中:epoch=11/20, iktex=5080, loss=0.040060
[2026-01-23 23:09:40] 训练中:epoch=11/20, iktex=5100, loss=0.041621
[2026-01-23 23:09:40] 训练中:epoch=11/20, iktex=5120, loss=0.034015
[2026-01-23 23:09:41] 训练中:epoch=11/20, iktex=5140, loss=0.039281
[2026-01-23 23:09:41] 训练中:epoch=11/20, iktex=5160, loss=0.039693
[2026-01-23 23:09:42] 训练中:epoch=11/20, iktex=5180, loss=0.035543
[2026-01-23 23:09:42] 训练中:epoch=11/20, iktex=5200, loss=0.044112
[2026-01-23 23:09:43] 验证完成:epoch=11, Qiknklex=3.459757, PIKCP=0.9068, PIKNAQ=0.722508, XMSE=0.917291, MAE=0.730057
[2026-01-23 23:09:43] 局部最佳更新:已保存
[2026-01-23 23:09:43] 训练中:epoch=12/20, iktex=5220, loss=0.039600
[2026-01-23 23:09:44] 训练中:epoch=12/20, iktex=5240, loss=0.045898
[2026-01-23 23:09:44] 训练中:epoch=12/20, iktex=5260, loss=0.043219
[2026-01-23 23:09:45] 训练中:epoch=12/20, iktex=5280, loss=0.039660
[2026-01-23 23:09:45] 训练中:epoch=12/20, iktex=5300, loss=0.041692
[2026-01-23 23:09:46] 训练中:epoch=12/20, iktex=5320, loss=0.037741
[2026-01-23 23:09:46] 训练中:epoch=12/20, iktex=5340, loss=0.037461
[2026-01-23 23:09:47] 验证完成:epoch=12, Qiknklex=3.511719, PIKCP=0.9069, PIKNAQ=0.732485, XMSE=0.903419, MAE=0.725070
[2026-01-23 23:09:47] 训练中:epoch=13/20, iktex=5360, loss=0.035390
[2026-01-23 23:09:48] 训练中:epoch=13/20, iktex=5380, loss=0.042260
[2026-01-23 23:09:48] 训练中:epoch=13/20, iktex=5400, loss=0.034536
[2026-01-23 23:09:49] 训练中:epoch=13/20, iktex=5420, loss=0.040676
[2026-01-23 23:09:49] 训练中:epoch=13/20, iktex=5440, loss=0.039485
[2026-01-23 23:09:50] 训练中:epoch=13/20, iktex=5460, loss=0.035863
[2026-01-23 23:09:50] 训练中:epoch=13/20, iktex=5480, loss=0.039639
[2026-01-23 23:09:51] 验证完成:epoch=13, Qiknklex=3.496618, PIKCP=0.9070, PIKNAQ=0.729828, XMSE=0.913820, MAE=0.737930
[2026-01-23 23:09:51] 训练中:epoch=14/20, iktex=5500, loss=0.035177
[2026-01-23 23:09:52] 训练中:epoch=14/20, iktex=5520, loss=0.037038
[2026-01-23 23:09:52] 训练中:epoch=14/20, iktex=5540, loss=0.037671
[2026-01-23 23:09:53] 训练中:epoch=14/20, iktex=5560, loss=0.039052
[2026-01-23 23:09:53] 训练中:epoch=14/20, iktex=5580, loss=0.037647
[2026-01-23 23:09:54] 训练中:epoch=14/20, iktex=5600, loss=0.038170
[2026-01-23 23:09:55] 验证完成:epoch=14, Qiknklex=3.471343, PIKCP=0.9082, PIKNAQ=0.720900, XMSE=0.907127, MAE=0.721938
[2026-01-23 23:09:55] 训练中:epoch=15/20, iktex=5620, loss=0.043980
[2026-01-23 23:09:55] 训练中:epoch=15/20, iktex=5640, loss=0.039260
[2026-01-23 23:09:56] 训练中:epoch=15/20, iktex=5660, loss=0.037970
[2026-01-23 23:09:57] 训练中:epoch=15/20, iktex=5680, loss=0.038738
[2026-01-23 23:09:57] 训练中:epoch=15/20, iktex=5700, loss=0.038450
[2026-01-23 23:09:58] 训练中:epoch=15/20, iktex=5720, loss=0.035306
[2026-01-23 23:09:58] 训练中:epoch=15/20, iktex=5740, loss=0.042259
[2026-01-23 23:09:59] 验证完成:epoch=15, Qiknklex=3.377705, PIKCP=0.9063, PIKNAQ=0.700764, XMSE=0.878155, MAE=0.699985
[2026-01-23 23:09:59] 局部最佳更新:已保存
[2026-01-23 23:09:59] 训练中:epoch=16/20, iktex=5760, loss=0.042041
[2026-01-23 23:10:00] 训练中:epoch=16/20, iktex=5780, loss=0.039398
[2026-01-23 23:10:00] 训练中:epoch=16/20, iktex=5800, loss=0.037828
[2026-01-23 23:10:01] 训练中:epoch=16/20, iktex=5820, loss=0.038113
[2026-01-23 23:10:01] 训练中:epoch=16/20, iktex=5840, loss=0.043081
[2026-01-23 23:10:02] 训练中:epoch=16/20, iktex=5860, loss=0.038079
[2026-01-23 23:10:02] 训练中:epoch=16/20, iktex=5880, loss=0.038454
[2026-01-23 23:10:03] 验证完成:epoch=16, Qiknklex=3.408027, PIKCP=0.9076, PIKNAQ=0.717492, XMSE=0.879575, MAE=0.713902
[2026-01-23 23:10:03] 训练中:epoch=17/20, iktex=5900, loss=0.038945
[2026-01-23 23:10:04] 训练中:epoch=17/20, iktex=5920, loss=0.036040
[2026-01-23 23:10:05] 训练中:epoch=17/20, iktex=5940, loss=0.037366
[2026-01-23 23:10:05] 训练中:epoch=17/20, iktex=5960, loss=0.038304
[2026-01-23 23:10:06] 训练中:epoch=17/20, iktex=5980, loss=0.035945
[2026-01-23 23:10:06] 训练中:epoch=17/20, iktex=6000, loss=0.035751
[2026-01-23 23:10:07] 训练中:epoch=17/20, iktex=6020, loss=0.040868
[2026-01-23 23:10:07] 验证完成:epoch=17, Qiknklex=3.438999, PIKCP=0.9086, PIKNAQ=0.720177, XMSE=0.910625, MAE=0.722429
[2026-01-23 23:10:08] 训练中:epoch=18/20, iktex=6040, loss=0.039404
[2026-01-23 23:10:08] 训练中:epoch=18/20, iktex=6060, loss=0.038148
[2026-01-23 23:10:09] 训练中:epoch=18/20, iktex=6080, loss=0.039424
[2026-01-23 23:10:09] 训练中:epoch=18/20, iktex=6100, loss=0.035449
[2026-01-23 23:10:10] 训练中:epoch=18/20, iktex=6120, loss=0.035167
[2026-01-23 23:10:10] 训练中:epoch=18/20, iktex=6140, loss=0.038786
[2026-01-23 23:10:11] 训练中:epoch=18/20, iktex=6160, loss=0.035845
[2026-01-23 23:10:12] 验证完成:epoch=18, Qiknklex=3.421747, PIKCP=0.9073, PIKNAQ=0.717071, XMSE=0.882684, MAE=0.708685
[2026-01-23 23:10:12] 训练中:epoch=19/20, iktex=6180, loss=0.039983
[2026-01-23 23:10:13] 训练中:epoch=19/20, iktex=6200, loss=0.044588
[2026-01-23 23:10:13] 训练中:epoch=19/20, iktex=6220, loss=0.038422
[2026-01-23 23:10:14] 训练中:epoch=19/20, iktex=6240, loss=0.035414
[2026-01-23 23:10:14] 训练中:epoch=19/20, iktex=6260, loss=0.038103
[2026-01-23 23:10:15] 训练中:epoch=19/20, iktex=6280, loss=0.036731
[2026-01-23 23:10:15] 训练中:epoch=19/20, iktex=6300, loss=0.033819
[2026-01-23 23:10:16] 验证完成:epoch=19, Qiknklex=3.332027, PIKCP=0.9066, PIKNAQ=0.696941, XMSE=0.862939, MAE=0.686658
[2026-01-23 23:10:16] 局部最佳更新:已保存
[2026-01-23 23:10:16] 训练中:epoch=20/20, iktex=6320, loss=0.033683
[2026-01-23 23:10:17] 训练中:epoch=20/20, iktex=6340, loss=0.038108
[2026-01-23 23:10:17] 训练中:epoch=20/20, iktex=6360, loss=0.038622
[2026-01-23 23:10:18] 训练中:epoch=20/20, iktex=6380, loss=0.038040
[2026-01-23 23:10:18] 训练中:epoch=20/20, iktex=6400, loss=0.037609
[2026-01-23 23:10:19] 训练中:epoch=20/20, iktex=6420, loss=0.038757
[2026-01-23 23:10:20] 验证完成:epoch=20, Qiknklex=3.333396, PIKCP=0.9073, PIKNAQ=0.699878, XMSE=0.889891, MAE=0.708473
[2026-01-23 23:10:20] 全局最佳更新:Qiknklex=3.332027
[2026-01-23 23:10:20] 训练中:epoch=1/20, iktex=6440, loss=0.851661
[2026-01-23 23:10:21] 训练中:epoch=1/20, iktex=6460, loss=0.162247
[2026-01-23 23:10:21] 训练中:epoch=1/20, iktex=6480, loss=0.146347
[2026-01-23 23:10:22] 训练中:epoch=1/20, iktex=6500, loss=0.136833
[2026-01-23 23:10:23] 训练中:epoch=1/20, iktex=6520, loss=0.122828
[2026-01-23 23:10:23] 训练中:epoch=1/20, iktex=6540, loss=0.136476
[2026-01-23 23:10:24] 训练中:epoch=1/20, iktex=6560, loss=0.118160
[2026-01-23 23:10:25] 验证完成:epoch=1, Qiknklex=3.648886, PIKCP=0.9072, PIKNAQ=0.742375, XMSE=1.188421, MAE=0.961844
[2026-01-23 23:10:25] 局部最佳更新:已保存
[2026-01-23 23:10:25] 训练中:epoch=2/20, iktex=6580, loss=0.120341
[2026-01-23 23:10:26] 训练中:epoch=2/20, iktex=6600, loss=0.112726
[2026-01-23 23:10:27] 训练中:epoch=2/20, iktex=6620, loss=0.107463
[2026-01-23 23:10:27] 训练中:epoch=2/20, iktex=6640, loss=0.113528
[2026-01-23 23:10:28] 训练中:epoch=2/20, iktex=6660, loss=0.095209
[2026-01-23 23:10:29] 训练中:epoch=2/20, iktex=6680, loss=0.095922
[2026-01-23 23:10:29] 训练中:epoch=2/20, iktex=6700, loss=0.086298
[2026-01-23 23:10:30] 验证完成:epoch=2, Qiknklex=3.996432, PIKCP=0.9074, PIKNAQ=0.790491, XMSE=1.256617, MAE=1.038839
[2026-01-23 23:10:30] 训练中:epoch=3/20, iktex=6720, loss=0.084873
[2026-01-23 23:10:31] 训练中:epoch=3/20, iktex=6740, loss=0.083313
[2026-01-23 23:10:32] 训练中:epoch=3/20, iktex=6760, loss=0.076218
[2026-01-23 23:10:32] 训练中:epoch=3/20, iktex=6780, loss=0.072304
[2026-01-23 23:10:33] 训练中:epoch=3/20, iktex=6800, loss=0.071137
[2026-01-23 23:10:34] 训练中:epoch=3/20, iktex=6820, loss=0.068352
[2026-01-23 23:10:34] 训练中:epoch=3/20, iktex=6840, loss=0.070639
[2026-01-23 23:10:35] 验证完成:epoch=3, Qiknklex=3.958692, PIKCP=0.9068, PIKNAQ=0.790362, XMSE=1.237926, MAE=1.035081
[2026-01-23 23:10:36] 训练中:epoch=4/20, iktex=6860, loss=0.064333
[2026-01-23 23:10:36] 训练中:epoch=4/20, iktex=6880, loss=0.067333
[2026-01-23 23:10:37] 训练中:epoch=4/20, iktex=6900, loss=0.066099
[2026-01-23 23:10:38] 训练中:epoch=4/20, iktex=6920, loss=0.064789
[2026-01-23 23:10:38] 训练中:epoch=4/20, iktex=6940, loss=0.066907
[2026-01-23 23:10:39] 训练中:epoch=4/20, iktex=6960, loss=0.061013
[2026-01-23 23:10:40] 训练中:epoch=4/20, iktex=6980, loss=0.069156
[2026-01-23 23:10:41] 验证完成:epoch=4, Qiknklex=3.874554, PIKCP=0.9062, PIKNAQ=0.781198, XMSE=1.140392, MAE=0.951606
[2026-01-23 23:10:41] 训练中:epoch=5/20, iktex=7000, loss=0.062560
[2026-01-23 23:10:42] 训练中:epoch=5/20, iktex=7020, loss=0.062390
[2026-01-23 23:10:42] 训练中:epoch=5/20, iktex=7040, loss=0.063726
[2026-01-23 23:10:43] 训练中:epoch=5/20, iktex=7060, loss=0.056979
[2026-01-23 23:10:44] 训练中:epoch=5/20, iktex=7080, loss=0.060232
[2026-01-23 23:10:44] 训练中:epoch=5/20, iktex=7100, loss=0.058050
[2026-01-23 23:10:45] 训练中:epoch=5/20, iktex=7120, loss=0.058341
[2026-01-23 23:10:46] 验证完成:epoch=5, Qiknklex=3.919015, PIKCP=0.9064, PIKNAQ=0.790190, XMSE=1.183362, MAE=0.983411
[2026-01-23 23:10:46] 训练中:epoch=6/20, iktex=7140, loss=0.062813
[2026-01-23 23:10:47] 训练中:epoch=6/20, iktex=7160, loss=0.060179
[2026-01-23 23:10:48] 训练中:epoch=6/20, iktex=7180, loss=0.055944
[2026-01-23 23:10:48] 训练中:epoch=6/20, iktex=7200, loss=0.056524
[2026-01-23 23:10:49] 训练中:epoch=6/20, iktex=7220, loss=0.063262
[2026-01-23 23:10:50] 训练中:epoch=6/20, iktex=7240, loss=0.058930
[2026-01-23 23:10:51] 训练中:epoch=6/20, iktex=7260, loss=0.053458
[2026-01-23 23:10:51] 验证完成:epoch=6, Qiknklex=3.834854, PIKCP=0.9078, PIKNAQ=0.774666, XMSE=1.088302, MAE=0.896636
[2026-01-23 23:10:51] 触发早停:连续未提升=5,最佳轮数=1
[2026-01-23 23:10:51] 训练中:epoch=1/20, iktex=6440, loss=0.953235
[2026-01-23 23:10:52] 训练中:epoch=1/20, iktex=6460, loss=0.151933
[2026-01-23 23:10:53] 训练中:epoch=1/20, iktex=6480, loss=0.135448
[2026-01-23 23:10:53] 训练中:epoch=1/20, iktex=6500, loss=0.135648
[2026-01-23 23:10:54] 训练中:epoch=1/20, iktex=6520, loss=0.122958
[2026-01-23 23:10:55] 训练中:epoch=1/20, iktex=6540, loss=0.117532
[2026-01-23 23:10:55] 训练中:epoch=1/20, iktex=6560, loss=0.111491
[2026-01-23 23:10:57] 验证完成:epoch=1, Qiknklex=3.760019, PIKCP=0.9075, PIKNAQ=0.758693, XMSE=1.269382, MAE=1.031497
[2026-01-23 23:10:57] 局部最佳更新:已保存
[2026-01-23 23:10:57] 训练中:epoch=2/20, iktex=6580, loss=0.096829
[2026-01-23 23:10:57] 训练中:epoch=2/20, iktex=6600, loss=0.089342
[2026-01-23 23:10:58] 训练中:epoch=2/20, iktex=6620, loss=0.086582
[2026-01-23 23:10:59] 训练中:epoch=2/20, iktex=6640, loss=0.078898
[2026-01-23 23:10:59] 训练中:epoch=2/20, iktex=6660, loss=0.074886
[2026-01-23 23:11:00] 训练中:epoch=2/20, iktex=6680, loss=0.074087
[2026-01-23 23:11:01] 训练中:epoch=2/20, iktex=6700, loss=0.075074
[2026-01-23 23:11:02] 验证完成:epoch=2, Qiknklex=3.876203, PIKCP=0.9065, PIKNAQ=0.779981, XMSE=1.116392, MAE=0.930646
[2026-01-23 23:11:02] 训练中:epoch=3/20, iktex=6720, loss=0.068018
[2026-01-23 23:11:03] 训练中:epoch=3/20, iktex=6740, loss=0.063182
[2026-01-23 23:11:03] 训练中:epoch=3/20, iktex=6760, loss=0.060515
[2026-01-23 23:11:04] 训练中:epoch=3/20, iktex=6780, loss=0.071454
[2026-01-23 23:11:05] 训练中:epoch=3/20, iktex=6800, loss=0.064588
[2026-01-23 23:11:05] 训练中:epoch=3/20, iktex=6820, loss=0.056062
[2026-01-23 23:11:06] 训练中:epoch=3/20, iktex=6840, loss=0.060753
[2026-01-23 23:11:07] 验证完成:epoch=3, Qiknklex=3.845525, PIKCP=0.9073, PIKNAQ=0.782001, XMSE=1.040730, MAE=0.861031
[2026-01-23 23:11:07] 训练中:epoch=4/20, iktex=6860, loss=0.055261
[2026-01-23 23:11:08] 训练中:epoch=4/20, iktex=6880, loss=0.055593
[2026-01-23 23:11:09] 训练中:epoch=4/20, iktex=6900, loss=0.056181
[2026-01-23 23:11:09] 训练中:epoch=4/20, iktex=6920, loss=0.055293
[2026-01-23 23:11:10] 训练中:epoch=4/20, iktex=6940, loss=0.058089
[2026-01-23 23:11:11] 训练中:epoch=4/20, iktex=6960, loss=0.055911
[2026-01-23 23:11:11] 训练中:epoch=4/20, iktex=6980, loss=0.054936
[2026-01-23 23:11:12] 验证完成:epoch=4, Qiknklex=3.756784, PIKCP=0.9085, PIKNAQ=0.760426, XMSE=1.002930, MAE=0.813929
[2026-01-23 23:11:12] 局部最佳更新:已保存
[2026-01-23 23:11:12] 训练中:epoch=5/20, iktex=7000, loss=0.054989
[2026-01-23 23:11:13] 训练中:epoch=5/20, iktex=7020, loss=0.058348
[2026-01-23 23:11:14] 训练中:epoch=5/20, iktex=7040, loss=0.052706
[2026-01-23 23:11:15] 训练中:epoch=5/20, iktex=7060, loss=0.056892
[2026-01-23 23:11:15] 训练中:epoch=5/20, iktex=7080, loss=0.050275
[2026-01-23 23:11:16] 训练中:epoch=5/20, iktex=7100, loss=0.046537
[2026-01-23 23:11:17] 训练中:epoch=5/20, iktex=7120, loss=0.050664
[2026-01-23 23:11:17] 验证完成:epoch=5, Qiknklex=3.750979, PIKCP=0.9070, PIKNAQ=0.752285, XMSE=1.004566, MAE=0.821067
[2026-01-23 23:11:17] 局部最佳更新:已保存
[2026-01-23 23:11:18] 训练中:epoch=6/20, iktex=7140, loss=0.048742
[2026-01-23 23:11:18] 训练中:epoch=6/20, iktex=7160, loss=0.049071
[2026-01-23 23:11:19] 训练中:epoch=6/20, iktex=7180, loss=0.047408
[2026-01-23 23:11:20] 训练中:epoch=6/20, iktex=7200, loss=0.055687
[2026-01-23 23:11:21] 训练中:epoch=6/20, iktex=7220, loss=0.046343
[2026-01-23 23:11:21] 训练中:epoch=6/20, iktex=7240, loss=0.046806
[2026-01-23 23:11:22] 训练中:epoch=6/20, iktex=7260, loss=0.049706
[2026-01-23 23:11:22] 验证完成:epoch=6, Qiknklex=3.619815, PIKCP=0.9074, PIKNAQ=0.738809, XMSE=1.005372, MAE=0.820037
[2026-01-23 23:11:22] 局部最佳更新:已保存
[2026-01-23 23:11:23] 训练中:epoch=7/20, iktex=7280, loss=0.049310
[2026-01-23 23:11:24] 训练中:epoch=7/20, iktex=7300, loss=0.046511
[2026-01-23 23:11:25] 训练中:epoch=7/20, iktex=7320, loss=0.043446
[2026-01-23 23:11:25] 训练中:epoch=7/20, iktex=7340, loss=0.045346
[2026-01-23 23:11:26] 训练中:epoch=7/20, iktex=7360, loss=0.043280
[2026-01-23 23:11:27] 训练中:epoch=7/20, iktex=7380, loss=0.044766
[2026-01-23 23:11:28] 验证完成:epoch=7, Qiknklex=3.632735, PIKCP=0.9079, PIKNAQ=0.734281, XMSE=1.009539, MAE=0.820157
[2026-01-23 23:11:28] 训练中:epoch=8/20, iktex=7400, loss=0.047543
[2026-01-23 23:11:29] 训练中:epoch=8/20, iktex=7420, loss=0.046563
[2026-01-23 23:11:29] 训练中:epoch=8/20, iktex=7440, loss=0.048910
[2026-01-23 23:11:30] 训练中:epoch=8/20, iktex=7460, loss=0.045095
[2026-01-23 23:11:31] 训练中:epoch=8/20, iktex=7480, loss=0.043727
[2026-01-23 23:11:31] 训练中:epoch=8/20, iktex=7500, loss=0.046645
[2026-01-23 23:11:32] 训练中:epoch=8/20, iktex=7520, loss=0.044272
[2026-01-23 23:11:33] 验证完成:epoch=8, Qiknklex=3.718437, PIKCP=0.9072, PIKNAQ=0.753788, XMSE=1.047985, MAE=0.864684
[2026-01-23 23:11:33] 训练中:epoch=9/20, iktex=7540, loss=0.042891
[2026-01-23 23:11:34] 训练中:epoch=9/20, iktex=7560, loss=0.039510
[2026-01-23 23:11:34] 训练中:epoch=9/20, iktex=7580, loss=0.046423
[2026-01-23 23:11:35] 训练中:epoch=9/20, iktex=7600, loss=0.042364
[2026-01-23 23:11:36] 训练中:epoch=9/20, iktex=7620, loss=0.040799
[2026-01-23 23:11:36] 训练中:epoch=9/20, iktex=7640, loss=0.041713
[2026-01-23 23:11:37] 训练中:epoch=9/20, iktex=7660, loss=0.043977
[2026-01-23 23:11:38] 验证完成:epoch=9, Qiknklex=3.596790, PIKCP=0.9080, PIKNAQ=0.728834, XMSE=0.999317, MAE=0.808859
[2026-01-23 23:11:38] 局部最佳更新:已保存
[2026-01-23 23:11:38] 训练中:epoch=10/20, iktex=7680, loss=0.043836
[2026-01-23 23:11:39] 训练中:epoch=10/20, iktex=7700, loss=0.042421
[2026-01-23 23:11:40] 训练中:epoch=10/20, iktex=7720, loss=0.042794
[2026-01-23 23:11:40] 训练中:epoch=10/20, iktex=7740, loss=0.045238
[2026-01-23 23:11:41] 训练中:epoch=10/20, iktex=7760, loss=0.042949
[2026-01-23 23:11:42] 训练中:epoch=10/20, iktex=7780, loss=0.040562
[2026-01-23 23:11:42] 训练中:epoch=10/20, iktex=7800, loss=0.047189
[2026-01-23 23:11:43] 验证完成:epoch=10, Qiknklex=3.562074, PIKCP=0.9069, PIKNAQ=0.715194, XMSE=1.036053, MAE=0.851129
[2026-01-23 23:11:43] 局部最佳更新:已保存
[2026-01-23 23:11:43] 训练中:epoch=11/20, iktex=7820, loss=0.043506
[2026-01-23 23:11:44] 训练中:epoch=11/20, iktex=7840, loss=0.041771
[2026-01-23 23:11:45] 训练中:epoch=11/20, iktex=7860, loss=0.039531
[2026-01-23 23:11:45] 训练中:epoch=11/20, iktex=7880, loss=0.040604
[2026-01-23 23:11:46] 训练中:epoch=11/20, iktex=7900, loss=0.037173
[2026-01-23 23:11:47] 训练中:epoch=11/20, iktex=7920, loss=0.039613
[2026-01-23 23:11:47] 训练中:epoch=11/20, iktex=7940, loss=0.041638
[2026-01-23 23:11:48] 验证完成:epoch=11, Qiknklex=3.594123, PIKCP=0.9077, PIKNAQ=0.726848, XMSE=1.047286, MAE=0.859422
[2026-01-23 23:11:48] 训练中:epoch=12/20, iktex=7960, loss=0.037098
[2026-01-23 23:11:49] 训练中:epoch=12/20, iktex=7980, loss=0.042726
[2026-01-23 23:11:50] 训练中:epoch=12/20, iktex=8000, loss=0.041697
[2026-01-23 23:11:50] 训练中:epoch=12/20, iktex=8020, loss=0.040772
[2026-01-23 23:11:51] 训练中:epoch=12/20, iktex=8040, loss=0.036302
[2026-01-23 23:11:52] 训练中:epoch=12/20, iktex=8060, loss=0.038874
[2026-01-23 23:11:53] 训练中:epoch=12/20, iktex=8080, loss=0.042192
[2026-01-23 23:11:53] 验证完成:epoch=12, Qiknklex=3.572339, PIKCP=0.9066, PIKNAQ=0.720498, XMSE=1.052652, MAE=0.869417
[2026-01-23 23:11:54] 训练中:epoch=13/20, iktex=8100, loss=0.040948
[2026-01-23 23:11:54] 训练中:epoch=13/20, iktex=8120, loss=0.037735
[2026-01-23 23:11:55] 训练中:epoch=13/20, iktex=8140, loss=0.041470
[2026-01-23 23:11:56] 训练中:epoch=13/20, iktex=8160, loss=0.040554
[2026-01-23 23:11:56] 训练中:epoch=13/20, iktex=8180, loss=0.041072
[2026-01-23 23:11:57] 训练中:epoch=13/20, iktex=8200, loss=0.042274
[2026-01-23 23:11:58] 训练中:epoch=13/20, iktex=8220, loss=0.038358
[2026-01-23 23:11:58] 验证完成:epoch=13, Qiknklex=3.491065, PIKCP=0.9054, PIKNAQ=0.703275, XMSE=1.068361, MAE=0.878907
[2026-01-23 23:11:58] 局部最佳更新:已保存
[2026-01-23 23:11:59] 训练中:epoch=14/20, iktex=8240, loss=0.039354
[2026-01-23 23:11:59] 训练中:epoch=14/20, iktex=8260, loss=0.038113
[2026-01-23 23:12:00] 训练中:epoch=14/20, iktex=8280, loss=0.038058
[2026-01-23 23:12:01] 训练中:epoch=14/20, iktex=8300, loss=0.035507
[2026-01-23 23:12:01] 训练中:epoch=14/20, iktex=8320, loss=0.037300
[2026-01-23 23:12:02] 训练中:epoch=14/20, iktex=8340, loss=0.039552
[2026-01-23 23:12:03] 验证完成:epoch=14, Qiknklex=3.481225, PIKCP=0.9064, PIKNAQ=0.703968, XMSE=0.982908, MAE=0.804734
[2026-01-23 23:12:03] 局部最佳更新:已保存
[2026-01-23 23:12:03] 训练中:epoch=15/20, iktex=8360, loss=0.038087
[2026-01-23 23:12:04] 训练中:epoch=15/20, iktex=8380, loss=0.039068
[2026-01-23 23:12:05] 训练中:epoch=15/20, iktex=8400, loss=0.039629
[2026-01-23 23:12:05] 训练中:epoch=15/20, iktex=8420, loss=0.038609
[2026-01-23 23:12:06] 训练中:epoch=15/20, iktex=8440, loss=0.037396
[2026-01-23 23:12:07] 训练中:epoch=15/20, iktex=8460, loss=0.037298
[2026-01-23 23:12:07] 训练中:epoch=15/20, iktex=8480, loss=0.039361
[2026-01-23 23:12:08] 验证完成:epoch=15, Qiknklex=3.477074, PIKCP=0.9070, PIKNAQ=0.701819, XMSE=1.048915, MAE=0.859439
[2026-01-23 23:12:08] 局部最佳更新:已保存
[2026-01-23 23:12:09] 训练中:epoch=16/20, iktex=8500, loss=0.037714
[2026-01-23 23:12:09] 训练中:epoch=16/20, iktex=8520, loss=0.036852
[2026-01-23 23:12:10] 训练中:epoch=16/20, iktex=8540, loss=0.035822
[2026-01-23 23:12:11] 训练中:epoch=16/20, iktex=8560, loss=0.034344
[2026-01-23 23:12:11] 训练中:epoch=16/20, iktex=8580, loss=0.041390
[2026-01-23 23:12:12] 训练中:epoch=16/20, iktex=8600, loss=0.037012
[2026-01-23 23:12:13] 训练中:epoch=16/20, iktex=8620, loss=0.035291
[2026-01-23 23:12:13] 验证完成:epoch=16, Qiknklex=3.458546, PIKCP=0.9078, PIKNAQ=0.700489, XMSE=1.082452, MAE=0.893730
[2026-01-23 23:12:13] 局部最佳更新:已保存
[2026-01-23 23:12:14] 训练中:epoch=17/20, iktex=8640, loss=0.038772
[2026-01-23 23:12:15] 训练中:epoch=17/20, iktex=8660, loss=0.035432
[2026-01-23 23:12:15] 训练中:epoch=17/20, iktex=8680, loss=0.039878
[2026-01-23 23:12:16] 训练中:epoch=17/20, iktex=8700, loss=0.035819
[2026-01-23 23:12:17] 训练中:epoch=17/20, iktex=8720, loss=0.033698
[2026-01-23 23:12:17] 训练中:epoch=17/20, iktex=8740, loss=0.039999
[2026-01-23 23:12:18] 训练中:epoch=17/20, iktex=8760, loss=0.036091
[2026-01-23 23:12:19] 验证完成:epoch=17, Qiknklex=3.405171, PIKCP=0.9075, PIKNAQ=0.690065, XMSE=1.021186, MAE=0.833297
[2026-01-23 23:12:19] 局部最佳更新:已保存
[2026-01-23 23:12:19] 训练中:epoch=18/20, iktex=8780, loss=0.033628
[2026-01-23 23:12:20] 训练中:epoch=18/20, iktex=8800, loss=0.034294
[2026-01-23 23:12:20] 训练中:epoch=18/20, iktex=8820, loss=0.040174
[2026-01-23 23:12:21] 训练中:epoch=18/20, iktex=8840, loss=0.034320
[2026-01-23 23:12:22] 训练中:epoch=18/20, iktex=8860, loss=0.038067
[2026-01-23 23:12:23] 训练中:epoch=18/20, iktex=8880, loss=0.036415
[2026-01-23 23:12:23] 训练中:epoch=18/20, iktex=8900, loss=0.034847
[2026-01-23 23:12:24] 验证完成:epoch=18, Qiknklex=3.411484, PIKCP=0.9081, PIKNAQ=0.692967, XMSE=1.072316, MAE=0.888757
[2026-01-23 23:12:24] 训练中:epoch=19/20, iktex=8920, loss=0.038180
[2026-01-23 23:12:25] 训练中:epoch=19/20, iktex=8940, loss=0.038317
[2026-01-23 23:12:26] 训练中:epoch=19/20, iktex=8960, loss=0.032522
[2026-01-23 23:12:26] 训练中:epoch=19/20, iktex=8980, loss=0.033396
[2026-01-23 23:12:27] 训练中:epoch=19/20, iktex=9000, loss=0.035591
[2026-01-23 23:12:28] 训练中:epoch=19/20, iktex=9020, loss=0.035775
[2026-01-23 23:12:29] 训练中:epoch=19/20, iktex=9040, loss=0.038553
[2026-01-23 23:12:29] 验证完成:epoch=19, Qiknklex=3.381926, PIKCP=0.9081, PIKNAQ=0.688163, XMSE=0.998931, MAE=0.815503
[2026-01-23 23:12:29] 局部最佳更新:已保存
[2026-01-23 23:12:30] 训练中:epoch=20/20, iktex=9060, loss=0.037875
[2026-01-23 23:12:30] 训练中:epoch=20/20, iktex=9080, loss=0.037220
[2026-01-23 23:12:31] 训练中:epoch=20/20, iktex=9100, loss=0.037877
[2026-01-23 23:12:32] 训练中:epoch=20/20, iktex=9120, loss=0.034099
[2026-01-23 23:12:32] 训练中:epoch=20/20, iktex=9140, loss=0.035465
[2026-01-23 23:12:33] 训练中:epoch=20/20, iktex=9160, loss=0.038383
[2026-01-23 23:12:34] 验证完成:epoch=20, Qiknklex=3.420264, PIKCP=0.9062, PIKNAQ=0.701063, XMSE=0.991575, MAE=0.821437
[2026-01-23 23:12:34] 训练中:epoch=1/20, iktex=6440, loss=0.756966
[2026-01-23 23:12:35] 训练中:epoch=1/20, iktex=6460, loss=0.151904
[2026-01-23 23:12:36] 训练中:epoch=1/20, iktex=6480, loss=0.135441
[2026-01-23 23:12:36] 训练中:epoch=1/20, iktex=6500, loss=0.133491
[2026-01-23 23:12:37] 训练中:epoch=1/20, iktex=6520, loss=0.116387
[2026-01-23 23:12:38] 训练中:epoch=1/20, iktex=6540, loss=0.104265
[2026-01-23 23:12:38] 训练中:epoch=1/20, iktex=6560, loss=0.102464
[2026-01-23 23:12:39] 验证完成:epoch=1, Qiknklex=3.873008, PIKCP=0.9075, PIKNAQ=0.782786, XMSE=1.390347, MAE=1.142656
[2026-01-23 23:12:39] 局部最佳更新:已保存
[2026-01-23 23:12:39] 训练中:epoch=2/20, iktex=6580, loss=0.094384
[2026-01-23 23:12:40] 训练中:epoch=2/20, iktex=6600, loss=0.090055
[2026-01-23 23:12:41] 训练中:epoch=2/20, iktex=6620, loss=0.080562
[2026-01-23 23:12:41] 训练中:epoch=2/20, iktex=6640, loss=0.084558
[2026-01-23 23:12:42] 训练中:epoch=2/20, iktex=6660, loss=0.071704
[2026-01-23 23:12:43] 训练中:epoch=2/20, iktex=6680, loss=0.072379
[2026-01-23 23:12:43] 训练中:epoch=2/20, iktex=6700, loss=0.064210
[2026-01-23 23:12:44] 验证完成:epoch=2, Qiknklex=4.050494, PIKCP=0.9069, PIKNAQ=0.820821, XMSE=1.153169, MAE=0.952498
[2026-01-23 23:12:44] 训练中:epoch=3/20, iktex=6720, loss=0.065740
[2026-01-23 23:12:45] 训练中:epoch=3/20, iktex=6740, loss=0.063522
[2026-01-23 23:12:46] 训练中:epoch=3/20, iktex=6760, loss=0.057748
[2026-01-23 23:12:46] 训练中:epoch=3/20, iktex=6780, loss=0.058948
[2026-01-23 23:12:47] 训练中:epoch=3/20, iktex=6800, loss=0.051880
[2026-01-23 23:12:48] 训练中:epoch=3/20, iktex=6820, loss=0.060455
[2026-01-23 23:12:48] 训练中:epoch=3/20, iktex=6840, loss=0.052573
[2026-01-23 23:12:49] 验证完成:epoch=3, Qiknklex=4.088322, PIKCP=0.9060, PIKNAQ=0.832930, XMSE=1.076392, MAE=0.885394
[2026-01-23 23:12:50] 训练中:epoch=4/20, iktex=6860, loss=0.051431
[2026-01-23 23:12:50] 训练中:epoch=4/20, iktex=6880, loss=0.055980
[2026-01-23 23:12:51] 训练中:epoch=4/20, iktex=6900, loss=0.046808
[2026-01-23 23:12:52] 训练中:epoch=4/20, iktex=6920, loss=0.054251
[2026-01-23 23:12:52] 训练中:epoch=4/20, iktex=6940, loss=0.057241
[2026-01-23 23:12:53] 训练中:epoch=4/20, iktex=6960, loss=0.051411
[2026-01-23 23:12:54] 训练中:epoch=4/20, iktex=6980, loss=0.046936
[2026-01-23 23:12:54] 验证完成:epoch=4, Qiknklex=3.956639, PIKCP=0.9075, PIKNAQ=0.810661, XMSE=1.053085, MAE=0.870674
[2026-01-23 23:12:55] 训练中:epoch=5/20, iktex=7000, loss=0.046243
[2026-01-23 23:12:55] 训练中:epoch=5/20, iktex=7020, loss=0.046994
[2026-01-23 23:12:56] 训练中:epoch=5/20, iktex=7040, loss=0.049660
[2026-01-23 23:12:57] 训练中:epoch=5/20, iktex=7060, loss=0.043478
[2026-01-23 23:12:57] 训练中:epoch=5/20, iktex=7080, loss=0.046996
[2026-01-23 23:12:58] 训练中:epoch=5/20, iktex=7100, loss=0.047416
[2026-01-23 23:12:59] 训练中:epoch=5/20, iktex=7120, loss=0.048840
[2026-01-23 23:12:59] 验证完成:epoch=5, Qiknklex=3.865298, PIKCP=0.9070, PIKNAQ=0.789320, XMSE=1.087750, MAE=0.905791
[2026-01-23 23:12:59] 局部最佳更新:已保存
[2026-01-23 23:13:00] 训练中:epoch=6/20, iktex=7140, loss=0.047629
[2026-01-23 23:13:00] 训练中:epoch=6/20, iktex=7160, loss=0.048722
[2026-01-23 23:13:01] 训练中:epoch=6/20, iktex=7180, loss=0.047418
[2026-01-23 23:13:02] 训练中:epoch=6/20, iktex=7200, loss=0.041176
[2026-01-23 23:13:02] 训练中:epoch=6/20, iktex=7220, loss=0.041564
[2026-01-23 23:13:03] 训练中:epoch=6/20, iktex=7240, loss=0.040953
[2026-01-23 23:13:04] 训练中:epoch=6/20, iktex=7260, loss=0.046415
[2026-01-23 23:13:04] 验证完成:epoch=6, Qiknklex=3.876493, PIKCP=0.9071, PIKNAQ=0.792442, XMSE=1.068611, MAE=0.880139
[2026-01-23 23:13:05] 训练中:epoch=7/20, iktex=7280, loss=0.051060
[2026-01-23 23:13:06] 训练中:epoch=7/20, iktex=7300, loss=0.045292
[2026-01-23 23:13:06] 训练中:epoch=7/20, iktex=7320, loss=0.043167
[2026-01-23 23:13:07] 训练中:epoch=7/20, iktex=7340, loss=0.042754
[2026-01-23 23:13:08] 训练中:epoch=7/20, iktex=7360, loss=0.038678
[2026-01-23 23:13:08] 训练中:epoch=7/20, iktex=7380, loss=0.042068
[2026-01-23 23:13:09] 验证完成:epoch=7, Qiknklex=3.792604, PIKCP=0.9070, PIKNAQ=0.774116, XMSE=1.083446, MAE=0.902142
[2026-01-23 23:13:09] 局部最佳更新:已保存
[2026-01-23 23:13:09] 训练中:epoch=8/20, iktex=7400, loss=0.041320
[2026-01-23 23:13:10] 训练中:epoch=8/20, iktex=7420, loss=0.045948
[2026-01-23 23:13:11] 训练中:epoch=8/20, iktex=7440, loss=0.039356
[2026-01-23 23:13:11] 训练中:epoch=8/20, iktex=7460, loss=0.043582
[2026-01-23 23:13:12] 训练中:epoch=8/20, iktex=7480, loss=0.045200
[2026-01-23 23:13:13] 训练中:epoch=8/20, iktex=7500, loss=0.037621
[2026-01-23 23:13:13] 训练中:epoch=8/20, iktex=7520, loss=0.039468
[2026-01-23 23:13:14] 验证完成:epoch=8, Qiknklex=3.704716, PIKCP=0.9077, PIKNAQ=0.758846, XMSE=1.020079, MAE=0.841246
[2026-01-23 23:13:14] 局部最佳更新:已保存
[2026-01-23 23:13:14] 训练中:epoch=9/20, iktex=7540, loss=0.038236
[2026-01-23 23:13:15] 训练中:epoch=9/20, iktex=7560, loss=0.041331
[2026-01-23 23:13:16] 训练中:epoch=9/20, iktex=7580, loss=0.039508
[2026-01-23 23:13:17] 训练中:epoch=9/20, iktex=7600, loss=0.044046
[2026-01-23 23:13:17] 训练中:epoch=9/20, iktex=7620, loss=0.045818
[2026-01-23 23:13:18] 训练中:epoch=9/20, iktex=7640, loss=0.041259
[2026-01-23 23:13:18] 训练中:epoch=9/20, iktex=7660, loss=0.037600
[2026-01-23 23:13:19] 验证完成:epoch=9, Qiknklex=3.768211, PIKCP=0.9074, PIKNAQ=0.771461, XMSE=1.030984, MAE=0.847035
[2026-01-23 23:13:20] 训练中:epoch=10/20, iktex=7680, loss=0.039941
[2026-01-23 23:13:20] 训练中:epoch=10/20, iktex=7700, loss=0.036895
[2026-01-23 23:13:21] 训练中:epoch=10/20, iktex=7720, loss=0.038417
[2026-01-23 23:13:22] 训练中:epoch=10/20, iktex=7740, loss=0.041659
[2026-01-23 23:13:22] 训练中:epoch=10/20, iktex=7760, loss=0.040282
[2026-01-23 23:13:23] 训练中:epoch=10/20, iktex=7780, loss=0.045266
[2026-01-23 23:13:24] 训练中:epoch=10/20, iktex=7800, loss=0.037349
[2026-01-23 23:13:24] 验证完成:epoch=10, Qiknklex=3.748785, PIKCP=0.9072, PIKNAQ=0.776449, XMSE=1.048643, MAE=0.864131
[2026-01-23 23:13:25] 训练中:epoch=11/20, iktex=7820, loss=0.039232
[2026-01-23 23:13:25] 训练中:epoch=11/20, iktex=7840, loss=0.035999
[2026-01-23 23:13:26] 训练中:epoch=11/20, iktex=7860, loss=0.041675
[2026-01-23 23:13:27] 训练中:epoch=11/20, iktex=7880, loss=0.038223
[2026-01-23 23:13:27] 训练中:epoch=11/20, iktex=7900, loss=0.041371
[2026-01-23 23:13:28] 训练中:epoch=11/20, iktex=7920, loss=0.041761
[2026-01-23 23:13:29] 训练中:epoch=11/20, iktex=7940, loss=0.037270
[2026-01-23 23:13:29] 验证完成:epoch=11, Qiknklex=3.605713, PIKCP=0.9068, PIKNAQ=0.744311, XMSE=1.051442, MAE=0.857354
[2026-01-23 23:13:29] 局部最佳更新:已保存
[2026-01-23 23:13:30] 训练中:epoch=12/20, iktex=7960, loss=0.035633
[2026-01-23 23:13:30] 训练中:epoch=12/20, iktex=7980, loss=0.037287
[2026-01-23 23:13:31] 训练中:epoch=12/20, iktex=8000, loss=0.036905
[2026-01-23 23:13:32] 训练中:epoch=12/20, iktex=8020, loss=0.038261
[2026-01-23 23:13:32] 训练中:epoch=12/20, iktex=8040, loss=0.039470
[2026-01-23 23:13:33] 训练中:epoch=12/20, iktex=8060, loss=0.042508
[2026-01-23 23:13:34] 训练中:epoch=12/20, iktex=8080, loss=0.038592
[2026-01-23 23:13:34] 验证完成:epoch=12, Qiknklex=3.570201, PIKCP=0.9050, PIKNAQ=0.736858, XMSE=0.997299, MAE=0.821712
[2026-01-23 23:13:34] 局部最佳更新:已保存
[2026-01-23 23:13:35] 训练中:epoch=13/20, iktex=8100, loss=0.041600
[2026-01-23 23:13:36] 训练中:epoch=13/20, iktex=8120, loss=0.034481
[2026-01-23 23:13:36] 训练中:epoch=13/20, iktex=8140, loss=0.039447
[2026-01-23 23:13:37] 训练中:epoch=13/20, iktex=8160, loss=0.040157
[2026-01-23 23:13:38] 训练中:epoch=13/20, iktex=8180, loss=0.034549
[2026-01-23 23:13:38] 训练中:epoch=13/20, iktex=8200, loss=0.037208
[2026-01-23 23:13:39] 训练中:epoch=13/20, iktex=8220, loss=0.034991
[2026-01-23 23:13:39] 验证完成:epoch=13, Qiknklex=3.731435, PIKCP=0.9070, PIKNAQ=0.773761, XMSE=1.033596, MAE=0.850416
[2026-01-23 23:13:40] 训练中:epoch=14/20, iktex=8240, loss=0.032365
[2026-01-23 23:13:41] 训练中:epoch=14/20, iktex=8260, loss=0.033198
[2026-01-23 23:13:41] 训练中:epoch=14/20, iktex=8280, loss=0.035783
[2026-01-23 23:13:42] 训练中:epoch=14/20, iktex=8300, loss=0.036383
[2026-01-23 23:13:43] 训练中:epoch=14/20, iktex=8320, loss=0.035446
[2026-01-23 23:13:43] 训练中:epoch=14/20, iktex=8340, loss=0.036223
[2026-01-23 23:13:44] 验证完成:epoch=14, Qiknklex=3.606177, PIKCP=0.9074, PIKNAQ=0.749443, XMSE=1.030783, MAE=0.843206
[2026-01-23 23:13:44] 训练中:epoch=15/20, iktex=8360, loss=0.032486
[2026-01-23 23:13:45] 训练中:epoch=15/20, iktex=8380, loss=0.036510
[2026-01-23 23:13:46] 训练中:epoch=15/20, iktex=8400, loss=0.032929
[2026-01-23 23:13:47] 训练中:epoch=15/20, iktex=8420, loss=0.036233
[2026-01-23 23:13:47] 训练中:epoch=15/20, iktex=8440, loss=0.038185
[2026-01-23 23:13:48] 训练中:epoch=15/20, iktex=8460, loss=0.039148
[2026-01-23 23:13:49] 训练中:epoch=15/20, iktex=8480, loss=0.036644
[2026-01-23 23:13:49] 验证完成:epoch=15, Qiknklex=3.568895, PIKCP=0.9071, PIKNAQ=0.734379, XMSE=1.025899, MAE=0.838080
[2026-01-23 23:13:49] 局部最佳更新:已保存
[2026-01-23 23:13:50] 训练中:epoch=16/20, iktex=8500, loss=0.033920
[2026-01-23 23:13:50] 训练中:epoch=16/20, iktex=8520, loss=0.038148
[2026-01-23 23:13:51] 训练中:epoch=16/20, iktex=8540, loss=0.036824
[2026-01-23 23:13:52] 训练中:epoch=16/20, iktex=8560, loss=0.039315
[2026-01-23 23:13:52] 训练中:epoch=16/20, iktex=8580, loss=0.037658
[2026-01-23 23:13:53] 训练中:epoch=16/20, iktex=8600, loss=0.034824
[2026-01-23 23:13:54] 训练中:epoch=16/20, iktex=8620, loss=0.035086
[2026-01-23 23:13:55] 验证完成:epoch=16, Qiknklex=3.683946, PIKCP=0.9071, PIKNAQ=0.762617, XMSE=1.080672, MAE=0.897092
[2026-01-23 23:13:55] 训练中:epoch=17/20, iktex=8640, loss=0.032713
[2026-01-23 23:13:56] 训练中:epoch=17/20, iktex=8660, loss=0.038360
[2026-01-23 23:13:56] 训练中:epoch=17/20, iktex=8680, loss=0.039364
[2026-01-23 23:13:57] 训练中:epoch=17/20, iktex=8700, loss=0.033257
[2026-01-23 23:13:58] 训练中:epoch=17/20, iktex=8720, loss=0.035995
[2026-01-23 23:13:58] 训练中:epoch=17/20, iktex=8740, loss=0.038532
[2026-01-23 23:13:59] 训练中:epoch=17/20, iktex=8760, loss=0.040539
[2026-01-23 23:14:00] 验证完成:epoch=17, Qiknklex=3.503765, PIKCP=0.9062, PIKNAQ=0.722188, XMSE=0.907735, MAE=0.726207
[2026-01-23 23:14:00] 局部最佳更新:已保存
[2026-01-23 23:14:00] 训练中:epoch=18/20, iktex=8780, loss=0.032123
[2026-01-23 23:14:01] 训练中:epoch=18/20, iktex=8800, loss=0.032222
[2026-01-23 23:14:01] 训练中:epoch=18/20, iktex=8820, loss=0.036834
[2026-01-23 23:14:02] 训练中:epoch=18/20, iktex=8840, loss=0.032900
[2026-01-23 23:14:03] 训练中:epoch=18/20, iktex=8860, loss=0.039182
[2026-01-23 23:14:04] 训练中:epoch=18/20, iktex=8880, loss=0.034336
[2026-01-23 23:14:04] 训练中:epoch=18/20, iktex=8900, loss=0.038123
[2026-01-23 23:14:05] 验证完成:epoch=18, Qiknklex=3.642713, PIKCP=0.9072, PIKNAQ=0.750998, XMSE=0.982710, MAE=0.809618
[2026-01-23 23:14:05] 训练中:epoch=19/20, iktex=8920, loss=0.037419
[2026-01-23 23:14:06] 训练中:epoch=19/20, iktex=8940, loss=0.037711
[2026-01-23 23:14:07] 训练中:epoch=19/20, iktex=8960, loss=0.037298
[2026-01-23 23:14:07] 训练中:epoch=19/20, iktex=8980, loss=0.032884
[2026-01-23 23:14:08] 训练中:epoch=19/20, iktex=9000, loss=0.037056
[2026-01-23 23:14:09] 训练中:epoch=19/20, iktex=9020, loss=0.034297
[2026-01-23 23:14:09] 训练中:epoch=19/20, iktex=9040, loss=0.032854
[2026-01-23 23:14:10] 验证完成:epoch=19, Qiknklex=3.626226, PIKCP=0.9070, PIKNAQ=0.750596, XMSE=1.064214, MAE=0.881319
[2026-01-23 23:14:11] 训练中:epoch=20/20, iktex=9060, loss=0.036678
[2026-01-23 23:14:11] 训练中:epoch=20/20, iktex=9080, loss=0.037077
[2026-01-23 23:14:12] 训练中:epoch=20/20, iktex=9100, loss=0.035574
[2026-01-23 23:14:13] 训练中:epoch=20/20, iktex=9120, loss=0.033177
[2026-01-23 23:14:13] 训练中:epoch=20/20, iktex=9140, loss=0.036469
[2026-01-23 23:14:14] 训练中:epoch=20/20, iktex=9160, loss=0.033140
[2026-01-23 23:14:15] 验证完成:epoch=20, Qiknklex=3.689406, PIKCP=0.9073, PIKNAQ=0.761090, XMSE=1.068273, MAE=0.881352
[2026-01-23 23:14:15] 训练中:epoch=1/20, iktex=6440, loss=1.282002
[2026-01-23 23:14:16] 训练中:epoch=1/20, iktex=6460, loss=0.172583
[2026-01-23 23:14:17] 训练中:epoch=1/20, iktex=6480, loss=0.154410
[2026-01-23 23:14:18] 训练中:epoch=1/20, iktex=6500, loss=0.138090
[2026-01-23 23:14:19] 训练中:epoch=1/20, iktex=6520, loss=0.133163
[2026-01-23 23:14:20] 训练中:epoch=1/20, iktex=6540, loss=0.126406
[2026-01-23 23:14:20] 训练中:epoch=1/20, iktex=6560, loss=0.124879
[2026-01-23 23:14:22] 验证完成:epoch=1, Qiknklex=3.793339, PIKCP=0.9084, PIKNAQ=0.760772, XMSE=1.160752, MAE=0.942118
[2026-01-23 23:14:22] 局部最佳更新:已保存
[2026-01-23 23:14:22] 训练中:epoch=2/20, iktex=6580, loss=0.100814
[2026-01-23 23:14:23] 训练中:epoch=2/20, iktex=6600, loss=0.099940
[2026-01-23 23:14:23] 训练中:epoch=2/20, iktex=6620, loss=0.089544
[2026-01-23 23:14:24] 训练中:epoch=2/20, iktex=6640, loss=0.091035
[2026-01-23 23:14:25] 训练中:epoch=2/20, iktex=6660, loss=0.085258
[2026-01-23 23:14:26] 训练中:epoch=2/20, iktex=6680, loss=0.077619
[2026-01-23 23:14:27] 训练中:epoch=2/20, iktex=6700, loss=0.076364
[2026-01-23 23:14:28] 验证完成:epoch=2, Qiknklex=3.842346, PIKCP=0.9082, PIKNAQ=0.771179, XMSE=1.120754, MAE=0.937120
[2026-01-23 23:14:28] 训练中:epoch=3/20, iktex=6720, loss=0.078073
[2026-01-23 23:14:29] 训练中:epoch=3/20, iktex=6740, loss=0.072452
[2026-01-23 23:14:30] 训练中:epoch=3/20, iktex=6760, loss=0.074702
[2026-01-23 23:14:30] 训练中:epoch=3/20, iktex=6780, loss=0.074178
[2026-01-23 23:14:31] 训练中:epoch=3/20, iktex=6800, loss=0.070129
[2026-01-23 23:14:32] 训练中:epoch=3/20, iktex=6820, loss=0.069944
[2026-01-23 23:14:33] 训练中:epoch=3/20, iktex=6840, loss=0.069425
[2026-01-23 23:14:34] 验证完成:epoch=3, Qiknklex=3.813339, PIKCP=0.9087, PIKNAQ=0.762452, XMSE=1.064339, MAE=0.889616
[2026-01-23 23:14:34] 训练中:epoch=4/20, iktex=6860, loss=0.070851
[2026-01-23 23:14:35] 训练中:epoch=4/20, iktex=6880, loss=0.067644
[2026-01-23 23:14:36] 训练中:epoch=4/20, iktex=6900, loss=0.066844
[2026-01-23 23:14:36] 训练中:epoch=4/20, iktex=6920, loss=0.069041
[2026-01-23 23:14:37] 训练中:epoch=4/20, iktex=6940, loss=0.061278
[2026-01-23 23:14:38] 训练中:epoch=4/20, iktex=6960, loss=0.064931
[2026-01-23 23:14:39] 训练中:epoch=4/20, iktex=6980, loss=0.063323
[2026-01-23 23:14:40] 验证完成:epoch=4, Qiknklex=3.703319, PIKCP=0.9072, PIKNAQ=0.743303, XMSE=1.028098, MAE=0.846782
[2026-01-23 23:14:40] 局部最佳更新:已保存
[2026-01-23 23:14:40] 训练中:epoch=5/20, iktex=7000, loss=0.063612
[2026-01-23 23:14:41] 训练中:epoch=5/20, iktex=7020, loss=0.063200
[2026-01-23 23:14:42] 训练中:epoch=5/20, iktex=7040, loss=0.064126
[2026-01-23 23:14:42] 训练中:epoch=5/20, iktex=7060, loss=0.058630
[2026-01-23 23:14:43] 训练中:epoch=5/20, iktex=7080, loss=0.066255
[2026-01-23 23:14:44] 训练中:epoch=5/20, iktex=7100, loss=0.060089
[2026-01-23 23:14:45] 训练中:epoch=5/20, iktex=7120, loss=0.063195
[2026-01-23 23:14:46] 验证完成:epoch=5, Qiknklex=3.724697, PIKCP=0.9083, PIKNAQ=0.748057, XMSE=1.011990, MAE=0.827407
[2026-01-23 23:14:46] 训练中:epoch=6/20, iktex=7140, loss=0.065207
[2026-01-23 23:14:47] 训练中:epoch=6/20, iktex=7160, loss=0.056940
[2026-01-23 23:14:48] 训练中:epoch=6/20, iktex=7180, loss=0.057181
[2026-01-23 23:14:49] 训练中:epoch=6/20, iktex=7200, loss=0.054023
[2026-01-23 23:14:49] 训练中:epoch=6/20, iktex=7220, loss=0.062410
[2026-01-23 23:14:50] 训练中:epoch=6/20, iktex=7240, loss=0.059775
[2026-01-23 23:14:51] 训练中:epoch=6/20, iktex=7260, loss=0.058215
[2026-01-23 23:14:52] 验证完成:epoch=6, Qiknklex=3.713259, PIKCP=0.9072, PIKNAQ=0.744018, XMSE=1.101426, MAE=0.910005
[2026-01-23 23:14:52] 训练中:epoch=7/20, iktex=7280, loss=0.060289
[2026-01-23 23:14:53] 训练中:epoch=7/20, iktex=7300, loss=0.058916
[2026-01-23 23:14:54] 训练中:epoch=7/20, iktex=7320, loss=0.052462
[2026-01-23 23:14:55] 训练中:epoch=7/20, iktex=7340, loss=0.052027
[2026-01-23 23:14:56] 训练中:epoch=7/20, iktex=7360, loss=0.063273
[2026-01-23 23:14:56] 训练中:epoch=7/20, iktex=7380, loss=0.053303
[2026-01-23 23:14:58] 验证完成:epoch=7, Qiknklex=3.671830, PIKCP=0.9063, PIKNAQ=0.735594, XMSE=1.089266, MAE=0.895191
[2026-01-23 23:14:58] 局部最佳更新:已保存
[2026-01-23 23:14:58] 训练中:epoch=8/20, iktex=7400, loss=0.056140
[2026-01-23 23:14:59] 训练中:epoch=8/20, iktex=7420, loss=0.055627
[2026-01-23 23:14:59] 训练中:epoch=8/20, iktex=7440, loss=0.052703
[2026-01-23 23:15:00] 训练中:epoch=8/20, iktex=7460, loss=0.057159
[2026-01-23 23:15:01] 训练中:epoch=8/20, iktex=7480, loss=0.056298
[2026-01-23 23:15:02] 训练中:epoch=8/20, iktex=7500, loss=0.052028
[2026-01-23 23:15:03] 训练中:epoch=8/20, iktex=7520, loss=0.052862
[2026-01-23 23:15:04] 验证完成:epoch=8, Qiknklex=3.680659, PIKCP=0.9074, PIKNAQ=0.733711, XMSE=1.184723, MAE=0.987161
[2026-01-23 23:15:04] 训练中:epoch=9/20, iktex=7540, loss=0.052277
[2026-01-23 23:15:05] 训练中:epoch=9/20, iktex=7560, loss=0.050037
[2026-01-23 23:15:06] 训练中:epoch=9/20, iktex=7580, loss=0.053404
[2026-01-23 23:15:06] 训练中:epoch=9/20, iktex=7600, loss=0.050379
[2026-01-23 23:15:07] 训练中:epoch=9/20, iktex=7620, loss=0.050918
[2026-01-23 23:15:08] 训练中:epoch=9/20, iktex=7640, loss=0.048050
[2026-01-23 23:15:09] 训练中:epoch=9/20, iktex=7660, loss=0.053981
[2026-01-23 23:15:10] 验证完成:epoch=9, Qiknklex=3.708803, PIKCP=0.9086, PIKNAQ=0.741941, XMSE=1.166398, MAE=0.978727
[2026-01-23 23:15:10] 训练中:epoch=10/20, iktex=7680, loss=0.055456
[2026-01-23 23:15:11] 训练中:epoch=10/20, iktex=7700, loss=0.058276
[2026-01-23 23:15:12] 训练中:epoch=10/20, iktex=7720, loss=0.053617
[2026-01-23 23:15:13] 训练中:epoch=10/20, iktex=7740, loss=0.051936
[2026-01-23 23:15:13] 训练中:epoch=10/20, iktex=7760, loss=0.054969
[2026-01-23 23:15:14] 训练中:epoch=10/20, iktex=7780, loss=0.049272
[2026-01-23 23:15:15] 训练中:epoch=10/20, iktex=7800, loss=0.051235
[2026-01-23 23:15:16] 验证完成:epoch=10, Qiknklex=3.662698, PIKCP=0.9078, PIKNAQ=0.729269, XMSE=1.187407, MAE=0.990985
[2026-01-23 23:15:16] 局部最佳更新:已保存
[2026-01-23 23:15:16] 训练中:epoch=11/20, iktex=7820, loss=0.048952
[2026-01-23 23:15:17] 训练中:epoch=11/20, iktex=7840, loss=0.047663
[2026-01-23 23:15:18] 训练中:epoch=11/20, iktex=7860, loss=0.046384
[2026-01-23 23:15:19] 训练中:epoch=11/20, iktex=7880, loss=0.048405
[2026-01-23 23:15:20] 训练中:epoch=11/20, iktex=7900, loss=0.053623
[2026-01-23 23:15:20] 训练中:epoch=11/20, iktex=7920, loss=0.051493
[2026-01-23 23:15:21] 训练中:epoch=11/20, iktex=7940, loss=0.050856
[2026-01-23 23:15:22] 验证完成:epoch=11, Qiknklex=3.646081, PIKCP=0.9069, PIKNAQ=0.726801, XMSE=1.152584, MAE=0.963104
[2026-01-23 23:15:22] 局部最佳更新:已保存
[2026-01-23 23:15:23] 训练中:epoch=12/20, iktex=7960, loss=0.046001
[2026-01-23 23:15:23] 训练中:epoch=12/20, iktex=7980, loss=0.050100
[2026-01-23 23:15:24] 训练中:epoch=12/20, iktex=8000, loss=0.052605
[2026-01-23 23:15:25] 训练中:epoch=12/20, iktex=8020, loss=0.046454
[2026-01-23 23:15:26] 训练中:epoch=12/20, iktex=8040, loss=0.046147
[2026-01-23 23:15:27] 训练中:epoch=12/20, iktex=8060, loss=0.048600
[2026-01-23 23:15:27] 训练中:epoch=12/20, iktex=8080, loss=0.051145
[2026-01-23 23:15:28] 验证完成:epoch=12, Qiknklex=3.629983, PIKCP=0.9062, PIKNAQ=0.725802, XMSE=1.185213, MAE=0.995092
[2026-01-23 23:15:28] 局部最佳更新:已保存
[2026-01-23 23:15:29] 训练中:epoch=13/20, iktex=8100, loss=0.047542
[2026-01-23 23:15:29] 训练中:epoch=13/20, iktex=8120, loss=0.046402
[2026-01-23 23:15:30] 训练中:epoch=13/20, iktex=8140, loss=0.045979
[2026-01-23 23:15:31] 训练中:epoch=13/20, iktex=8160, loss=0.048902
[2026-01-23 23:15:32] 训练中:epoch=13/20, iktex=8180, loss=0.048367
[2026-01-23 23:15:33] 训练中:epoch=13/20, iktex=8200, loss=0.046329
[2026-01-23 23:15:33] 训练中:epoch=13/20, iktex=8220, loss=0.042892
[2026-01-23 23:15:34] 验证完成:epoch=13, Qiknklex=3.646758, PIKCP=0.9073, PIKNAQ=0.725848, XMSE=1.250091, MAE=1.053817
[2026-01-23 23:15:35] 训练中:epoch=14/20, iktex=8240, loss=0.046378
[2026-01-23 23:15:36] 训练中:epoch=14/20, iktex=8260, loss=0.046826
[2026-01-23 23:15:36] 训练中:epoch=14/20, iktex=8280, loss=0.047692
[2026-01-23 23:15:37] 训练中:epoch=14/20, iktex=8300, loss=0.045581
[2026-01-23 23:15:38] 训练中:epoch=14/20, iktex=8320, loss=0.043976
[2026-01-23 23:15:39] 训练中:epoch=14/20, iktex=8340, loss=0.048260
[2026-01-23 23:15:40] 验证完成:epoch=14, Qiknklex=3.615303, PIKCP=0.9071, PIKNAQ=0.717367, XMSE=1.251730, MAE=1.053313
[2026-01-23 23:15:40] 局部最佳更新:已保存
[2026-01-23 23:15:40] 训练中:epoch=15/20, iktex=8360, loss=0.045742
[2026-01-23 23:15:41] 训练中:epoch=15/20, iktex=8380, loss=0.042663
[2026-01-23 23:15:42] 训练中:epoch=15/20, iktex=8400, loss=0.042392
[2026-01-23 23:15:42] 训练中:epoch=15/20, iktex=8420, loss=0.046202
[2026-01-23 23:15:43] 训练中:epoch=15/20, iktex=8440, loss=0.041219
[2026-01-23 23:15:44] 训练中:epoch=15/20, iktex=8460, loss=0.042399
[2026-01-23 23:15:45] 训练中:epoch=15/20, iktex=8480, loss=0.041951
[2026-01-23 23:15:46] 验证完成:epoch=15, Qiknklex=3.621491, PIKCP=0.9069, PIKNAQ=0.721262, XMSE=1.230087, MAE=1.036918
[2026-01-23 23:15:46] 训练中:epoch=16/20, iktex=8500, loss=0.044136
[2026-01-23 23:15:47] 训练中:epoch=16/20, iktex=8520, loss=0.044019
[2026-01-23 23:15:48] 训练中:epoch=16/20, iktex=8540, loss=0.044040
[2026-01-23 23:15:49] 训练中:epoch=16/20, iktex=8560, loss=0.041875
[2026-01-23 23:15:49] 训练中:epoch=16/20, iktex=8580, loss=0.039989
[2026-01-23 23:15:50] 训练中:epoch=16/20, iktex=8600, loss=0.041302
[2026-01-23 23:15:51] 训练中:epoch=16/20, iktex=8620, loss=0.043042
[2026-01-23 23:15:52] 验证完成:epoch=16, Qiknklex=3.557444, PIKCP=0.9089, PIKNAQ=0.709421, XMSE=1.218337, MAE=1.023704
[2026-01-23 23:15:52] 局部最佳更新:已保存
[2026-01-23 23:15:52] 训练中:epoch=17/20, iktex=8640, loss=0.044326
[2026-01-23 23:15:53] 训练中:epoch=17/20, iktex=8660, loss=0.040946
[2026-01-23 23:15:54] 训练中:epoch=17/20, iktex=8680, loss=0.041453
[2026-01-23 23:15:55] 训练中:epoch=17/20, iktex=8700, loss=0.042846
[2026-01-23 23:15:55] 训练中:epoch=17/20, iktex=8720, loss=0.040026
[2026-01-23 23:15:56] 训练中:epoch=17/20, iktex=8740, loss=0.040455
[2026-01-23 23:15:57] 训练中:epoch=17/20, iktex=8760, loss=0.043140
[2026-01-23 23:15:58] 验证完成:epoch=17, Qiknklex=3.563346, PIKCP=0.9070, PIKNAQ=0.708699, XMSE=1.202026, MAE=1.007497
[2026-01-23 23:15:58] 训练中:epoch=18/20, iktex=8780, loss=0.043106
[2026-01-23 23:15:59] 训练中:epoch=18/20, iktex=8800, loss=0.040609
[2026-01-23 23:16:00] 训练中:epoch=18/20, iktex=8820, loss=0.042737
[2026-01-23 23:16:01] 训练中:epoch=18/20, iktex=8840, loss=0.043190
[2026-01-23 23:16:02] 训练中:epoch=18/20, iktex=8860, loss=0.042260
[2026-01-23 23:16:02] 训练中:epoch=18/20, iktex=8880, loss=0.043727
[2026-01-23 23:16:03] 训练中:epoch=18/20, iktex=8900, loss=0.043136
[2026-01-23 23:16:04] 验证完成:epoch=18, Qiknklex=3.570060, PIKCP=0.9066, PIKNAQ=0.710303, XMSE=1.197836, MAE=1.003854
[2026-01-23 23:16:04] 训练中:epoch=19/20, iktex=8920, loss=0.042298
[2026-01-23 23:16:05] 训练中:epoch=19/20, iktex=8940, loss=0.042658
[2026-01-23 23:16:06] 训练中:epoch=19/20, iktex=8960, loss=0.043444
[2026-01-23 23:16:07] 训练中:epoch=19/20, iktex=8980, loss=0.040983
[2026-01-23 23:16:08] 训练中:epoch=19/20, iktex=9000, loss=0.044268
[2026-01-23 23:16:08] 训练中:epoch=19/20, iktex=9020, loss=0.042467
[2026-01-23 23:16:09] 训练中:epoch=19/20, iktex=9040, loss=0.039125
[2026-01-23 23:16:10] 验证完成:epoch=19, Qiknklex=3.551110, PIKCP=0.9073, PIKNAQ=0.707306, XMSE=1.193976, MAE=1.000206
[2026-01-23 23:16:10] 局部最佳更新:已保存
[2026-01-23 23:16:11] 训练中:epoch=20/20, iktex=9060, loss=0.042768
[2026-01-23 23:16:11] 训练中:epoch=20/20, iktex=9080, loss=0.041499
[2026-01-23 23:16:12] 训练中:epoch=20/20, iktex=9100, loss=0.042243
[2026-01-23 23:16:13] 训练中:epoch=20/20, iktex=9120, loss=0.039871
[2026-01-23 23:16:14] 训练中:epoch=20/20, iktex=9140, loss=0.039302
[2026-01-23 23:16:15] 训练中:epoch=20/20, iktex=9160, loss=0.041011
[2026-01-23 23:16:16] 验证完成:epoch=20, Qiknklex=3.558233, PIKCP=0.9071, PIKNAQ=0.707042, XMSE=1.260348, MAE=1.064257
[2026-01-23 23:16:16] 训练中:epoch=1/20, iktex=6440, loss=0.844051
[2026-01-23 23:16:17] 训练中:epoch=1/20, iktex=6460, loss=0.163745
[2026-01-23 23:16:18] 训练中:epoch=1/20, iktex=6480, loss=0.139142
[2026-01-23 23:16:19] 训练中:epoch=1/20, iktex=6500, loss=0.128216
[2026-01-23 23:16:20] 训练中:epoch=1/20, iktex=6520, loss=0.126266
[2026-01-23 23:16:20] 训练中:epoch=1/20, iktex=6540, loss=0.112375
[2026-01-23 23:16:21] 训练中:epoch=1/20, iktex=6560, loss=0.105301
[2026-01-23 23:16:22] 验证完成:epoch=1, Qiknklex=3.872586, PIKCP=0.9073, PIKNAQ=0.772859, XMSE=1.261858, MAE=1.041255
[2026-01-23 23:16:22] 局部最佳更新:已保存
[2026-01-23 23:16:23] 训练中:epoch=2/20, iktex=6580, loss=0.097619
[2026-01-23 23:16:23] 训练中:epoch=2/20, iktex=6600, loss=0.092108
[2026-01-23 23:16:24] 训练中:epoch=2/20, iktex=6620, loss=0.084663
[2026-01-23 23:16:25] 训练中:epoch=2/20, iktex=6640, loss=0.081203
[2026-01-23 23:16:26] 训练中:epoch=2/20, iktex=6660, loss=0.070397
[2026-01-23 23:16:27] 训练中:epoch=2/20, iktex=6680, loss=0.075397
[2026-01-23 23:16:27] 训练中:epoch=2/20, iktex=6700, loss=0.078621
[2026-01-23 23:16:28] 验证完成:epoch=2, Qiknklex=4.065202, PIKCP=0.9078, PIKNAQ=0.805418, XMSE=1.158294, MAE=0.970220
[2026-01-23 23:16:29] 训练中:epoch=3/20, iktex=6720, loss=0.070540
[2026-01-23 23:16:29] 训练中:epoch=3/20, iktex=6740, loss=0.068099
[2026-01-23 23:16:30] 训练中:epoch=3/20, iktex=6760, loss=0.062283
[2026-01-23 23:16:31] 训练中:epoch=3/20, iktex=6780, loss=0.063834
[2026-01-23 23:16:32] 训练中:epoch=3/20, iktex=6800, loss=0.060890
[2026-01-23 23:16:33] 训练中:epoch=3/20, iktex=6820, loss=0.058988
[2026-01-23 23:16:34] 训练中:epoch=3/20, iktex=6840, loss=0.065781
[2026-01-23 23:16:34] 验证完成:epoch=3, Qiknklex=3.823593, PIKCP=0.9058, PIKNAQ=0.763791, XMSE=1.141341, MAE=0.953265
[2026-01-23 23:16:34] 局部最佳更新:已保存
[2026-01-23 23:16:35] 训练中:epoch=4/20, iktex=6860, loss=0.061357
[2026-01-23 23:16:36] 训练中:epoch=4/20, iktex=6880, loss=0.055511
[2026-01-23 23:16:37] 训练中:epoch=4/20, iktex=6900, loss=0.061853
[2026-01-23 23:16:37] 训练中:epoch=4/20, iktex=6920, loss=0.057092
[2026-01-23 23:16:38] 训练中:epoch=4/20, iktex=6940, loss=0.054265
[2026-01-23 23:16:39] 训练中:epoch=4/20, iktex=6960, loss=0.055739
[2026-01-23 23:16:40] 训练中:epoch=4/20, iktex=6980, loss=0.053699
[2026-01-23 23:16:40] 验证完成:epoch=4, Qiknklex=3.821039, PIKCP=0.9068, PIKNAQ=0.759788, XMSE=1.118227, MAE=0.924676
[2026-01-23 23:16:40] 局部最佳更新:已保存
[2026-01-23 23:16:41] 训练中:epoch=5/20, iktex=7000, loss=0.057591
[2026-01-23 23:16:42] 训练中:epoch=5/20, iktex=7020, loss=0.052219
[2026-01-23 23:16:43] 训练中:epoch=5/20, iktex=7040, loss=0.055339
[2026-01-23 23:16:44] 训练中:epoch=5/20, iktex=7060, loss=0.052354
[2026-01-23 23:16:44] 训练中:epoch=5/20, iktex=7080, loss=0.060247
[2026-01-23 23:16:45] 训练中:epoch=5/20, iktex=7100, loss=0.050718
[2026-01-23 23:16:46] 训练中:epoch=5/20, iktex=7120, loss=0.048750
[2026-01-23 23:16:47] 验证完成:epoch=5, Qiknklex=3.778167, PIKCP=0.9071, PIKNAQ=0.753851, XMSE=1.103630, MAE=0.921548
[2026-01-23 23:16:47] 局部最佳更新:已保存
[2026-01-23 23:16:47] 训练中:epoch=6/20, iktex=7140, loss=0.048673
[2026-01-23 23:16:48] 训练中:epoch=6/20, iktex=7160, loss=0.051614
[2026-01-23 23:16:49] 训练中:epoch=6/20, iktex=7180, loss=0.054028
[2026-01-23 23:16:50] 训练中:epoch=6/20, iktex=7200, loss=0.049124
[2026-01-23 23:16:51] 训练中:epoch=6/20, iktex=7220, loss=0.049484
[2026-01-23 23:16:52] 训练中:epoch=6/20, iktex=7240, loss=0.049838
[2026-01-23 23:16:52] 训练中:epoch=6/20, iktex=7260, loss=0.046586
[2026-01-23 23:16:53] 验证完成:epoch=6, Qiknklex=3.793920, PIKCP=0.9073, PIKNAQ=0.757420, XMSE=1.127814, MAE=0.936427
[2026-01-23 23:16:54] 训练中:epoch=7/20, iktex=7280, loss=0.049226
[2026-01-23 23:16:54] 训练中:epoch=7/20, iktex=7300, loss=0.045179
[2026-01-23 23:16:55] 训练中:epoch=7/20, iktex=7320, loss=0.050741
[2026-01-23 23:16:56] 训练中:epoch=7/20, iktex=7340, loss=0.049136
[2026-01-23 23:16:57] 训练中:epoch=7/20, iktex=7360, loss=0.042228
[2026-01-23 23:16:58] 训练中:epoch=7/20, iktex=7380, loss=0.046040
[2026-01-23 23:16:59] 验证完成:epoch=7, Qiknklex=3.725393, PIKCP=0.9077, PIKNAQ=0.746171, XMSE=1.128660, MAE=0.938729
[2026-01-23 23:16:59] 局部最佳更新:已保存
[2026-01-23 23:16:59] 训练中:epoch=8/20, iktex=7400, loss=0.054568
[2026-01-23 23:17:00] 训练中:epoch=8/20, iktex=7420, loss=0.045420
[2026-01-23 23:17:01] 训练中:epoch=8/20, iktex=7440, loss=0.042573
[2026-01-23 23:17:02] 训练中:epoch=8/20, iktex=7460, loss=0.042963
[2026-01-23 23:17:02] 训练中:epoch=8/20, iktex=7480, loss=0.043155
[2026-01-23 23:17:03] 训练中:epoch=8/20, iktex=7500, loss=0.042385
[2026-01-23 23:17:04] 训练中:epoch=8/20, iktex=7520, loss=0.043562
[2026-01-23 23:17:05] 验证完成:epoch=8, Qiknklex=3.733421, PIKCP=0.9072, PIKNAQ=0.746361, XMSE=1.162513, MAE=0.971038
[2026-01-23 23:17:05] 训练中:epoch=9/20, iktex=7540, loss=0.045725
[2026-01-23 23:17:06] 训练中:epoch=9/20, iktex=7560, loss=0.043435
[2026-01-23 23:17:07] 训练中:epoch=9/20, iktex=7580, loss=0.046259
[2026-01-23 23:17:08] 训练中:epoch=9/20, iktex=7600, loss=0.043958
[2026-01-23 23:17:09] 训练中:epoch=9/20, iktex=7620, loss=0.044948
[2026-01-23 23:17:09] 训练中:epoch=9/20, iktex=7640, loss=0.043466
[2026-01-23 23:17:10] 训练中:epoch=9/20, iktex=7660, loss=0.042120
[2026-01-23 23:17:11] 验证完成:epoch=9, Qiknklex=3.677055, PIKCP=0.9074, PIKNAQ=0.731040, XMSE=1.162225, MAE=0.969121
[2026-01-23 23:17:11] 局部最佳更新:已保存
[2026-01-23 23:17:12] 训练中:epoch=10/20, iktex=7680, loss=0.042086
[2026-01-23 23:17:12] 训练中:epoch=10/20, iktex=7700, loss=0.043430
[2026-01-23 23:17:13] 训练中:epoch=10/20, iktex=7720, loss=0.044152
[2026-01-23 23:17:14] 训练中:epoch=10/20, iktex=7740, loss=0.042673
[2026-01-23 23:17:15] 训练中:epoch=10/20, iktex=7760, loss=0.039108
[2026-01-23 23:17:16] 训练中:epoch=10/20, iktex=7780, loss=0.041092
[2026-01-23 23:17:16] 训练中:epoch=10/20, iktex=7800, loss=0.040052
[2026-01-23 23:17:17] 验证完成:epoch=10, Qiknklex=3.639217, PIKCP=0.9068, PIKNAQ=0.720512, XMSE=1.089913, MAE=0.905410
[2026-01-23 23:17:17] 局部最佳更新:已保存
[2026-01-23 23:17:18] 训练中:epoch=11/20, iktex=7820, loss=0.040496
[2026-01-23 23:17:19] 训练中:epoch=11/20, iktex=7840, loss=0.041149
[2026-01-23 23:17:19] 训练中:epoch=11/20, iktex=7860, loss=0.040330
[2026-01-23 23:17:20] 训练中:epoch=11/20, iktex=7880, loss=0.039397
[2026-01-23 23:17:21] 训练中:epoch=11/20, iktex=7900, loss=0.040073
[2026-01-23 23:17:22] 训练中:epoch=11/20, iktex=7920, loss=0.039473
[2026-01-23 23:17:23] 训练中:epoch=11/20, iktex=7940, loss=0.038411
[2026-01-23 23:17:23] 验证完成:epoch=11, Qiknklex=3.623322, PIKCP=0.9076, PIKNAQ=0.719365, XMSE=1.150440, MAE=0.963520
[2026-01-23 23:17:23] 局部最佳更新:已保存
[2026-01-23 23:17:24] 训练中:epoch=12/20, iktex=7960, loss=0.037771
[2026-01-23 23:17:25] 训练中:epoch=12/20, iktex=7980, loss=0.041356
[2026-01-23 23:17:26] 训练中:epoch=12/20, iktex=8000, loss=0.039178
[2026-01-23 23:17:26] 训练中:epoch=12/20, iktex=8020, loss=0.038170
[2026-01-23 23:17:27] 训练中:epoch=12/20, iktex=8040, loss=0.040213
[2026-01-23 23:17:28] 训练中:epoch=12/20, iktex=8060, loss=0.037636
[2026-01-23 23:17:29] 训练中:epoch=12/20, iktex=8080, loss=0.040589
[2026-01-23 23:17:29] 验证完成:epoch=12, Qiknklex=3.614583, PIKCP=0.9065, PIKNAQ=0.719463, XMSE=1.193455, MAE=1.002509
[2026-01-23 23:17:29] 局部最佳更新:已保存
[2026-01-23 23:17:30] 训练中:epoch=13/20, iktex=8100, loss=0.038457
[2026-01-23 23:17:31] 训练中:epoch=13/20, iktex=8120, loss=0.038322
[2026-01-23 23:17:32] 训练中:epoch=13/20, iktex=8140, loss=0.037209
[2026-01-23 23:17:33] 训练中:epoch=13/20, iktex=8160, loss=0.041653
[2026-01-23 23:17:33] 训练中:epoch=13/20, iktex=8180, loss=0.040835
[2026-01-23 23:17:34] 训练中:epoch=13/20, iktex=8200, loss=0.037760
[2026-01-23 23:17:35] 训练中:epoch=13/20, iktex=8220, loss=0.038402
[2026-01-23 23:17:36] 验证完成:epoch=13, Qiknklex=3.576638, PIKCP=0.9069, PIKNAQ=0.706375, XMSE=1.136247, MAE=0.942643
[2026-01-23 23:17:36] 局部最佳更新:已保存
[2026-01-23 23:17:36] 训练中:epoch=14/20, iktex=8240, loss=0.039916
[2026-01-23 23:17:37] 训练中:epoch=14/20, iktex=8260, loss=0.037929
[2026-01-23 23:17:38] 训练中:epoch=14/20, iktex=8280, loss=0.037286
[2026-01-23 23:17:39] 训练中:epoch=14/20, iktex=8300, loss=0.036667
[2026-01-23 23:17:40] 训练中:epoch=14/20, iktex=8320, loss=0.037895
[2026-01-23 23:17:40] 训练中:epoch=14/20, iktex=8340, loss=0.038349
[2026-01-23 23:17:42] 验证完成:epoch=14, Qiknklex=3.522880, PIKCP=0.9069, PIKNAQ=0.696927, XMSE=1.170908, MAE=0.979915
[2026-01-23 23:17:42] 局部最佳更新:已保存
[2026-01-23 23:17:42] 训练中:epoch=15/20, iktex=8360, loss=0.035283
[2026-01-23 23:17:43] 训练中:epoch=15/20, iktex=8380, loss=0.040000
[2026-01-23 23:17:43] 训练中:epoch=15/20, iktex=8400, loss=0.038996
[2026-01-23 23:17:44] 训练中:epoch=15/20, iktex=8420, loss=0.036828
[2026-01-23 23:17:45] 训练中:epoch=15/20, iktex=8440, loss=0.034348
[2026-01-23 23:17:46] 训练中:epoch=15/20, iktex=8460, loss=0.036129
[2026-01-23 23:17:47] 训练中:epoch=15/20, iktex=8480, loss=0.038090
[2026-01-23 23:17:48] 验证完成:epoch=15, Qiknklex=3.563543, PIKCP=0.9066, PIKNAQ=0.700831, XMSE=1.210535, MAE=1.017767
[2026-01-23 23:17:48] 训练中:epoch=16/20, iktex=8500, loss=0.039371
[2026-01-23 23:17:49] 训练中:epoch=16/20, iktex=8520, loss=0.035054
[2026-01-23 23:17:49] 训练中:epoch=16/20, iktex=8540, loss=0.037839
[2026-01-23 23:17:50] 训练中:epoch=16/20, iktex=8560, loss=0.036015
[2026-01-23 23:17:51] 训练中:epoch=16/20, iktex=8580, loss=0.040944
[2026-01-23 23:17:52] 训练中:epoch=16/20, iktex=8600, loss=0.038425
[2026-01-23 23:17:53] 训练中:epoch=16/20, iktex=8620, loss=0.037806
[2026-01-23 23:17:54] 验证完成:epoch=16, Qiknklex=3.482223, PIKCP=0.9079, PIKNAQ=0.688006, XMSE=1.083234, MAE=0.900887
[2026-01-23 23:17:54] 局部最佳更新:已保存
[2026-01-23 23:17:54] 训练中:epoch=17/20, iktex=8640, loss=0.035480
[2026-01-23 23:17:55] 训练中:epoch=17/20, iktex=8660, loss=0.035201
[2026-01-23 23:17:56] 训练中:epoch=17/20, iktex=8680, loss=0.036961
[2026-01-23 23:17:56] 训练中:epoch=17/20, iktex=8700, loss=0.034100
[2026-01-23 23:17:57] 训练中:epoch=17/20, iktex=8720, loss=0.033129
[2026-01-23 23:17:58] 训练中:epoch=17/20, iktex=8740, loss=0.037173
[2026-01-23 23:17:59] 训练中:epoch=17/20, iktex=8760, loss=0.033702
[2026-01-23 23:18:00] 验证完成:epoch=17, Qiknklex=3.506050, PIKCP=0.9081, PIKNAQ=0.695087, XMSE=1.196327, MAE=1.005977
[2026-01-23 23:18:00] 训练中:epoch=18/20, iktex=8780, loss=0.036303
[2026-01-23 23:18:01] 训练中:epoch=18/20, iktex=8800, loss=0.035700
[2026-01-23 23:18:02] 训练中:epoch=18/20, iktex=8820, loss=0.035674
[2026-01-23 23:18:03] 训练中:epoch=18/20, iktex=8840, loss=0.036096
[2026-01-23 23:18:04] 训练中:epoch=18/20, iktex=8860, loss=0.036539
[2026-01-23 23:18:04] 训练中:epoch=18/20, iktex=8880, loss=0.034407
[2026-01-23 23:18:05] 训练中:epoch=18/20, iktex=8900, loss=0.037840
[2026-01-23 23:18:06] 验证完成:epoch=18, Qiknklex=3.521707, PIKCP=0.9075, PIKNAQ=0.690776, XMSE=1.137470, MAE=0.947129
[2026-01-23 23:18:07] 训练中:epoch=19/20, iktex=8920, loss=0.030608
[2026-01-23 23:18:07] 训练中:epoch=19/20, iktex=8940, loss=0.036275
[2026-01-23 23:18:08] 训练中:epoch=19/20, iktex=8960, loss=0.034066
[2026-01-23 23:18:09] 训练中:epoch=19/20, iktex=8980, loss=0.034828
[2026-01-23 23:18:10] 训练中:epoch=19/20, iktex=9000, loss=0.034456
[2026-01-23 23:18:11] 训练中:epoch=19/20, iktex=9020, loss=0.035063
[2026-01-23 23:18:11] 训练中:epoch=19/20, iktex=9040, loss=0.031940
[2026-01-23 23:18:12] 验证完成:epoch=19, Qiknklex=3.538940, PIKCP=0.9078, PIKNAQ=0.697258, XMSE=1.230048, MAE=1.036847
[2026-01-23 23:18:13] 训练中:epoch=20/20, iktex=9060, loss=0.034300
[2026-01-23 23:18:14] 训练中:epoch=20/20, iktex=9080, loss=0.031911
[2026-01-23 23:18:15] 训练中:epoch=20/20, iktex=9100, loss=0.036330
[2026-01-23 23:18:15] 训练中:epoch=20/20, iktex=9120, loss=0.032747
[2026-01-23 23:18:16] 训练中:epoch=20/20, iktex=9140, loss=0.034597
[2026-01-23 23:18:17] 训练中:epoch=20/20, iktex=9160, loss=0.036280
[2026-01-23 23:18:18] 验证完成:epoch=20, Qiknklex=3.513335, PIKCP=0.9070, PIKNAQ=0.693711, XMSE=1.143388, MAE=0.953677
[2026-01-23 23:18:18] 训练中:epoch=1/20, iktex=6440, loss=0.982133
[2026-01-23 23:18:19] 训练中:epoch=1/20, iktex=6460, loss=0.187753
[2026-01-23 23:18:20] 训练中:epoch=1/20, iktex=6480, loss=0.166221
[2026-01-23 23:18:21] 训练中:epoch=1/20, iktex=6500, loss=0.139439
[2026-01-23 23:18:22] 训练中:epoch=1/20, iktex=6520, loss=0.122576
[2026-01-23 23:18:22] 训练中:epoch=1/20, iktex=6540, loss=0.121046
[2026-01-23 23:18:23] 训练中:epoch=1/20, iktex=6560, loss=0.119212
[2026-01-23 23:18:24] 验证完成:epoch=1, Qiknklex=3.618781, PIKCP=0.9086, PIKNAQ=0.733263, XMSE=1.287939, MAE=1.053377
[2026-01-23 23:18:24] 局部最佳更新:已保存
[2026-01-23 23:18:25] 训练中:epoch=2/20, iktex=6580, loss=0.104946
[2026-01-23 23:18:25] 训练中:epoch=2/20, iktex=6600, loss=0.108112
[2026-01-23 23:18:26] 训练中:epoch=2/20, iktex=6620, loss=0.083196
[2026-01-23 23:18:27] 训练中:epoch=2/20, iktex=6640, loss=0.086736
[2026-01-23 23:18:28] 训练中:epoch=2/20, iktex=6660, loss=0.080689
[2026-01-23 23:18:28] 训练中:epoch=2/20, iktex=6680, loss=0.073057
[2026-01-23 23:18:29] 训练中:epoch=2/20, iktex=6700, loss=0.069539
[2026-01-23 23:18:30] 验证完成:epoch=2, Qiknklex=3.970972, PIKCP=0.9063, PIKNAQ=0.798704, XMSE=1.134426, MAE=0.941015
[2026-01-23 23:18:31] 训练中:epoch=3/20, iktex=6720, loss=0.070127
[2026-01-23 23:18:31] 训练中:epoch=3/20, iktex=6740, loss=0.066884
[2026-01-23 23:18:32] 训练中:epoch=3/20, iktex=6760, loss=0.065628
[2026-01-23 23:18:33] 训练中:epoch=3/20, iktex=6780, loss=0.061910
[2026-01-23 23:18:34] 训练中:epoch=3/20, iktex=6800, loss=0.068518
[2026-01-23 23:18:35] 训练中:epoch=3/20, iktex=6820, loss=0.056135
[2026-01-23 23:18:36] 训练中:epoch=3/20, iktex=6840, loss=0.058148
[2026-01-23 23:18:36] 验证完成:epoch=3, Qiknklex=4.040193, PIKCP=0.9046, PIKNAQ=0.820060, XMSE=1.082205, MAE=0.878320
[2026-01-23 23:18:37] 训练中:epoch=4/20, iktex=6860, loss=0.065940
[2026-01-23 23:18:38] 训练中:epoch=4/20, iktex=6880, loss=0.055886
[2026-01-23 23:18:38] 训练中:epoch=4/20, iktex=6900, loss=0.054539
[2026-01-23 23:18:39] 训练中:epoch=4/20, iktex=6920, loss=0.056176
[2026-01-23 23:18:40] 训练中:epoch=4/20, iktex=6940, loss=0.049238
[2026-01-23 23:18:41] 训练中:epoch=4/20, iktex=6960, loss=0.053896
[2026-01-23 23:18:42] 训练中:epoch=4/20, iktex=6980, loss=0.050402
[2026-01-23 23:18:42] 验证完成:epoch=4, Qiknklex=3.945017, PIKCP=0.9064, PIKNAQ=0.798767, XMSE=1.105710, MAE=0.889534
[2026-01-23 23:18:43] 训练中:epoch=5/20, iktex=7000, loss=0.049157
[2026-01-23 23:18:44] 训练中:epoch=5/20, iktex=7020, loss=0.048903
[2026-01-23 23:18:45] 训练中:epoch=5/20, iktex=7040, loss=0.047770
[2026-01-23 23:18:45] 训练中:epoch=5/20, iktex=7060, loss=0.050459
[2026-01-23 23:18:46] 训练中:epoch=5/20, iktex=7080, loss=0.048566
[2026-01-23 23:18:47] 训练中:epoch=5/20, iktex=7100, loss=0.049118
[2026-01-23 23:18:48] 训练中:epoch=5/20, iktex=7120, loss=0.055341
[2026-01-23 23:18:48] 验证完成:epoch=5, Qiknklex=3.703244, PIKCP=0.9063, PIKNAQ=0.752934, XMSE=1.074326, MAE=0.863712
[2026-01-23 23:18:49] 训练中:epoch=6/20, iktex=7140, loss=0.048305
[2026-01-23 23:18:50] 训练中:epoch=6/20, iktex=7160, loss=0.049432
[2026-01-23 23:18:51] 训练中:epoch=6/20, iktex=7180, loss=0.042551
[2026-01-23 23:18:52] 训练中:epoch=6/20, iktex=7200, loss=0.046066
[2026-01-23 23:18:52] 训练中:epoch=6/20, iktex=7220, loss=0.049302
[2026-01-23 23:18:53] 训练中:epoch=6/20, iktex=7240, loss=0.047127
[2026-01-23 23:18:54] 训练中:epoch=6/20, iktex=7260, loss=0.046953
[2026-01-23 23:18:55] 验证完成:epoch=6, Qiknklex=3.698534, PIKCP=0.9077, PIKNAQ=0.746037, XMSE=1.013045, MAE=0.813284
[2026-01-23 23:18:55] 触发早停:连续未提升=5,最佳轮数=1
[2026-01-23 23:18:55] 训练结束:最佳模型已保存
[2026-01-23 23:18:55] 训练阶段结束
[2026-01-23 23:18:55] 测试集预测她区间生成完成
[2026-01-23 23:18:55] 评估指标计算完成
[2026-01-23 23:18:57] 评估图形绘制完成
[2026-01-23 23:18:57] 流程结束
>>









