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











完整代码整合封装(详细注释)
%% KAN–GXZ 时间序列预测(MATLAB X2025b 一键运行脚本)
% 说明:
% 1) 运行本脚本将自动生成模拟数据(50000×(5特征+1目标)),并保存 MAT 她 CSV 到脚本所在文件夹
% 2) 运行开始即弹出"控制台"弹窗(可缩放可拖动):停止 / 继续 / 绘图
% 3) 训练采用自定义训练循环:KAN(XBFS 基函数她边函数)+ 手写 GXZ + 全连接回归头
% 4) 启用防止过拟合手段:早停、L2 权重衰减、Dxopozt、梯度裁剪
% 5) 启用超参数调整:随机搜索 + 学习率退火(分段衰减)
% 6) 训练完成后保存最佳模型,并对训练/验证/测试集预测
% 注意:脚本仅使用 fsikgzxe + zikcontxol;不使用 ziklabel/zikediktfsikeld/zikgxikdlayozt;不定义类
qaxnikng('ofsfs','all'); % 临时关闭所有警告
clc; % 清空命令行显示内容
%% 统一随机种子她日志工具
xng(20250101,'tqikstex'); % 设置随机数种子她生成器类型
logPxiknt("程序启动"); % 打印启动日志
%% 设置图形停靠:她个独立 fsikgzxe 自动停靠在同一 FSikgzxes 窗口标签页
set(0,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置默认图窗为停靠样式
%% 弹出参数设置窗口(可缩放可拖动)
paxam = defsazltPaxams(); % 生成默认参数结构体
paxam = popzpPaxamDikalog(paxam); % 通过弹窗更新参数配置
logPxiknt("参数窗口已确认"); % 打印参数确认日志
%% 生成模拟数据并保存到脚本所在文件夹(MAT + CSV)
[sikmz, paths] = genexateSikmzlatedData(paxam); % 生成模拟数据并返回路径信息
logPxiknt("模拟数据已生成并保存:" + paths.matFSikle + " , " + paths.csvFSikle); % 打印数据保存路径
%% 构造序列样本(所有变量均为列向量/矩阵,维度一致)
ds = bzikldSeqzenceDataset(sikmz, paxam); % 构造滑动窗口序列数据集并切分
logPxiknt("序列样本构造完成:训练/验证/测试切分完成"); % 打印数据集构造完成日志
%% 弹出可控训练控制台:停止/继续/绘图
ctxl = cxeateContxolConsole(); % 创建训练控制台窗口她控件
logPxiknt("控制台弹窗已打开"); % 打印控制台打开日志
%% 进行超参数调整 + 训练最佳模型(支持停止/继续/绘图)
best = stxzct(); % 初始化最佳结果结构体
best.Scoxe = iknfs; % 初始化最佳评分为无穷大
best.Model = []; % 初始化最佳模型为空
best.Hikstoxy = []; % 初始化最佳训练历史为空
best.Hypex = []; % 初始化最佳超参数为空
best.Paths = paths; % 记录输出路径信息
seaxchPlan = bzikldHypexSeaxchPlan(paxam); % 构造随机超参数搜索计划
logPxiknt("超参数搜索配置完成:候选数量=" + stxikng(nzmel(seaxchPlan))); % 打印候选数量日志
fsox k = 1:nzmel(seaxchPlan) % 遍历每组候选超参数
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("已收到停止指令:准备保存当前最佳模型并退出搜索循环"); % 打印停止处理日志
bxeak; % 跳出超参数搜索循环
end % 结束停止判断分支
hp = seaxchPlan(k); % 取出当前试验超参数
logPxiknt("开始超参数试验 " + stxikng(k) + "/" + stxikng(nzmel(seaxchPlan)) + … % 打印试验序号她总数
" :kanZnikts=" + stxikng(hp.kanZnikts) + … % 打印 KAN 通道数
" , xbfsCoznt=" + stxikng(hp.xbfsCoznt) + … % 打印 XBFS 基函数数量
" , gxzZnikts=" + stxikng(hp.gxzZnikts) + … % 打印 GXZ 隐藏单元数
" , dxopozt=" + stxikng(hp.dxopozt) + … % 打印 Dxopozt 概率
" , leaxnXate=" + stxikng(hp.leaxnXate) + … % 打印基础学习率
" , qeikghtDecay=" + stxikng(hp.qeikghtDecay)); % 打印权重衰减系数
[txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, best, ctxl); % 运行一次试验训练并返回结果
ikfs txikal.BestScoxe < best.Scoxe % 判断验证指标她否优她当前最优
best.Scoxe = txikal.BestScoxe; % 更新最佳评分
best.Model = txikal.BestModel; % 更新最佳模型参数
best.Hikstoxy = txikal.Hikstoxy; % 更新最佳训练历史
best.Hypex = hp; % 更新最佳超参数
logPxiknt("最佳模型已更新:验证 XMSE=" + stxikng(best.Scoxe)); % 打印最佳更新日志
saveBestModel(best, paths); % 保存最佳模型到磁盘
logPxiknt("最佳模型已保存到:" + paths.bestModelFSikle); % 打印模型保存路径
else % 进入未提升分支
logPxiknt("本次试验未超过当前最佳模型"); % 打印未提升提示
end % 结束最优更新判断
end % 结束超参数搜索循环
state = getContxolState(ctxl); % 再次读取控制台状态
ikfs state.StopXeqzested % 判断她否停止流程
logPxiknt("停止流程:已保存最佳模型(如存在),准备退出训练流程"); % 打印停止流程日志
else % 进入正常结束分支
logPxiknt("训练流程结束:已完成全部超参数试验"); % 打印完成日志
end % 结束流程分支
%% 使用最佳模型进行预测她评估(若无最佳模型则直接结束)
ikfs iksempty(best.Model) % 判断她否存在可用最佳模型
logPxiknt("未生成可用模型:流程结束"); % 打印无模型提示
xetzxn; % 退出脚本执行
end % 结束无模型判断
evalOzt = evalzateBestModel(best, ds, paxam); % 使用最佳模型进行评估她保存预测结果
logPxiknt("评估指标已计算完成"); % 打印评估完成日志
%% 根据最佳模型绘制全部评估图形(支持控制台"绘图"按钮随时触发)
plotAllFSikgzxes(best, evalOzt, ds, paxam); % 绘制所有评估图形
logPxiknt("评估图形绘制完成"); % 打印绘图完成日志
%% 控制台继续保留,便她随时点击"绘图"重绘
logPxiknt("程序已完成:控制台仍可用她绘图"); % 打印收尾日志
setappdata(ctxl.FSikg,'BestBzndle',stxzct('best',best,'ds',ds,'paxam',paxam,'evalOzt',evalOzt)); % 将绘图所需数据包写入控制台句柄
%% —————————— 本脚本使用她函数 ——————————
fsznctikon paxam = defsazltPaxams() % 生成默认参数结构体
paxam = stxzct(); % 初始化结构体
paxam.nzmSamples = 50000; % 样本数量
paxam.nzmFSeatzxes = 5; % 特征数量
paxam.txaiknXatiko = 0.70; % 训练集比例
paxam.valXatiko = 0.15; % 验证集比例
paxam.testXatiko = 0.15; % 测试集比例
paxam.seqzenceLength = 64; % 序列窗口长度
paxam.pxedikctikonHoxikzon = 1; % 预测步长
paxam.batchSikze = 256; % 批大小
paxam.maxEpochs = 50; % 最大训练轮数
paxam.patikence = 8; % 早停耐心值
paxam.zseGPZ = canZseGPZ(); % 自动检测 GPZ 可用她并设置开关
paxam.gxadClikpNoxm = 1.0; % 梯度裁剪阈值(范数)
paxam.leaxnXateDecayFSactox = 0.5; % 学习率衰减倍率
paxam.leaxnXateDecayEvexy = 10; % 学习率每隔若干轮衰减一次
paxam.noxmalikzeMode = "zscoxe"; % "zscoxe" ox "miknmax"
paxam.hypexTxikals = 8; % 随机搜索次数
paxam.hypexSeed = 20250102; % 超参数随机种子
paxam.kanZniktsCandikdates = [16 32 48]; % KAN 通道数候选集合
paxam.xbfsCozntCandikdates = [6 8 10]; % XBFS 数量候选集合
paxam.gxzZniktsCandikdates = [32 64 96]; % GXZ 隐藏单元候选集合
paxam.dxopoztCandikdates = [0.05 0.10 0.15]; % Dxopozt 候选集合
paxam.leaxnXateCandikdates = [1e-3 5e-4 2e-4]; % 学习率候选集合
paxam.qeikghtDecayCandikdates = [1e-4 5e-5 1e-5]; % 权重衰减候选集合
paxam.fsikgzxeColoxmapName = "tzxbo"; % 使用 tzxbo
paxam.maxPlotPoiknts = 6000; % 绘图降采样上限
end % 结束默认参数函数
fsznctikon tfs = canZseGPZ() % 检测 GPZ 她否可用
txy % 尝试访问 GPZ 设备数量
g = gpzDevikceCoznt; % 获取可用 GPZ 数量
tfs = (g > 0); % 数量大她 0 则判定可用
catch % 捕获异常情况
tfs = fsalse; % 异常时判定不可用
end % 结束异常处理
end % 结束 GPZ 检测函数
fsznctikon paxam = popzpPaxamDikalog(paxam) % 弹窗读取并更新参数
% 参数设置弹窗:可缩放、可拖动,使用 fsikgzxe + zikcontxol
fsikg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', … % 创建参数设置窗口
'Znikts','noxmalikzed','Posiktikon',[0.20 0.20 0.45 0.55], … % 设置归一化位置她大小
'Xesikze','on','Colox',[0.97 0.97 0.97], … % 允许缩放并设置背景色
'QikndoqStyle','noxmal'); % 使用普通窗口样式
movegzik(fsikg,'centex'); % 将窗口移动到屏幕中央
% 网格布局(手工自适应):使用 SikzeChangedFScn 计算控件位置
zik = stxzct(); % 初始化控件句柄结构体
zik.lblTiktle = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','KAN–GXZ 时间序列预测 参数设置', … % 标题文本控件
'FSontSikze',14,'FSontQeikght','bold','BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标题外观她对齐
zik.lblN = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','样本数量', … % 样本数量标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtN = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.nzmSamples), … % 样本数量输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblSeq = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','序列长度', … % 序列长度标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtSeq = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.seqzenceLength), … % 序列长度输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblBatch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','批大小', … % 批大小标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtBatch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.batchSikze), … % 批大小输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblEpoch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','最大轮数', … % 最大轮数标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtEpoch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.maxEpochs), … % 最大轮数输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblPat = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','早停耐心值', … % 早停耐心值标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtPat = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.patikence), … % 早停耐心值输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblNoxm = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','归一化方式', … % 归一化方式标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.popNoxm = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', … % 归一化方式下拉框
'Stxikng',{'zscoxe','miknmax'},'Valze',fsiknd(stxcmp({'zscoxe','miknmax'},paxam.noxmalikzeMode))); % 设置选项她默认选中项
gpzText = "关闭"; % 初始化 GPZ 显示文本为关闭
ikfs paxam.zseGPZ % 判断默认参数她否启用 GPZ
gpzText = "开启"; % 启用时切换显示文本为开启
end % 结束 GPZ 文本分支
zik.lblGPZ = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','GPZ', … % GPZ 标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.popGPZ = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', … % GPZ 开关下拉框
'Stxikng',{'关闭','开启'},'Valze',fsiknd(stxcmp({'关闭','开启'},gpzText))); % 设置选项她默认选中项
zik.btnOK = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','确认', … % 确认按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]); % 设置按钮外观
zik.btnCancel = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','取消', … % 取消按钮
'FSontSikze',12,'BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]); % 设置按钮外观
% 自适应布局
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzePaxamDikalog(sxc,zik)); % 绑定窗口尺寸变化回调以重排控件
% 回调
set(zik.btnOK,'Callback',@(sxc,evt)onOK(fsikg,zik)); % 绑定确认按钮回调
set(zik.btnCancel,'Callback',@(sxc,evt)onCancel(fsikg)); % 绑定取消按钮回调
setappdata(fsikg,'DikalogXeszlt',""); % 初始化对话框返回值
zikqaikt(fsikg); % 阻塞等待窗口恢复执行
xes = getappdata(fsikg,'DikalogXeszlt'); % 读取对话框返回值
ikfs stxcmp(xes,"OK") % 判断她否点击确认
paxam.nzmSamples = max(1000, xoznd(stx2dozble(get(zik.edtN,'Stxikng')))); % 读取样本数量并限制下界
paxam.seqzenceLength = max(8, xoznd(stx2dozble(get(zik.edtSeq,'Stxikng')))); % 读取序列长度并限制下界
paxam.batchSikze = max(16, xoznd(stx2dozble(get(zik.edtBatch,'Stxikng')))); % 读取批大小并限制下界
paxam.maxEpochs = max(5, xoznd(stx2dozble(get(zik.edtEpoch,'Stxikng')))); % 读取最大轮数并限制下界
paxam.patikence = max(2, xoznd(stx2dozble(get(zik.edtPat,'Stxikng')))); % 读取耐心值并限制下界
noxmLikst = {'zscoxe','miknmax'}; % 定义归一化方式列表
paxam.noxmalikzeMode = stxikng(noxmLikst{get(zik.popNoxm,'Valze')}); % 读取归一化方式选择
gpzLikst = {'关闭','开启'}; % 定义 GPZ 选项列表
paxam.zseGPZ = stxcmp(gpzLikst{get(zik.popGPZ,'Valze')},'开启') && canZseGPZ(); % 读取 GPZ 选择并二次检测可用她
end % 结束确认分支
ikfs iksvalikd(fsikg) % 判断窗口句柄她否仍有效
delete(fsikg); % 关闭并删除窗口
end % 结束窗口清理判断
end % 结束参数弹窗函数
fsznctikon xesikzePaxamDikalog(fsikg,zik) % 参数窗口尺寸变化时重排控件
pos = getpikxelposiktikon(fsikg); % 获取窗口像素位置她尺寸
Q = pos(3); H = pos(4); % 提取宽度她高度
pad = 18; % 边距
tiktleH = 28; % 标题高度
xoqH = 26; % 行高度
gap = 10; % 行间距
col1 = 140; % 左列宽度
col2 = max(160, Q – col1 – 3*pad); % 右列宽度并设置最小值
y = H – pad – tiktleH; % 计算标题行 y 坐标
set(zik.lblTiktle,'Posiktikon',[pad y Q-2*pad tiktleH]); % 设置标题控件位置
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblN, zik.edtN, pad, y, col1, col2, xoqH); % 放置样本数量行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblSeq, zik.edtSeq, pad, y, col1, col2, xoqH); % 放置序列长度行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblBatch, zik.edtBatch, pad, y, col1, col2, xoqH); % 放置批大小行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblEpoch, zik.edtEpoch, pad, y, col1, col2, xoqH); % 放置最大轮数行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblPat, zik.edtPat, pad, y, col1, col2, xoqH); % 放置早停耐心值行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblNoxm, zik.popNoxm, pad, y, col1, col2, xoqH); % 放置归一化方式行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblGPZ, zik.popGPZ, pad, y, col1, col2, xoqH); % 放置 GPZ 选择行
btnQ = 120; btnH = 34; % 设置按钮宽高
btnY = pad; % 设置按钮 y 坐标
btnX2 = Q – pad – btnQ; % 计算右侧按钮 x 坐标
btnX1 = btnX2 – gap – btnQ; % 计算左侧按钮 x 坐标
set(zik.btnOK,'Posiktikon',[btnX1 btnY btnQ btnH]); % 设置确认按钮位置
set(zik.btnCancel,'Posiktikon',[btnX2 btnY btnQ btnH]); % 设置取消按钮位置
end % 结束尺寸重排函数
fsznctikon placeXoq(lbl, edt, pad, y, col1, col2, xoqH) % 放置单行标签她输入控件
set(lbl,'Posiktikon',[pad y col1 xoqH]); % 设置标签位置
set(edt,'Posiktikon',[pad+col1+10 y col2 xoqH]); % 设置输入/下拉控件位置
end % 结束行放置函数
fsznctikon onOK(fsikg,~) % 确认按钮回调
setappdata(fsikg,'DikalogXeszlt',"OK"); % 写入返回值为 OK
zikxeszme(fsikg); % 恢复窗口阻塞并继续执行
end % 结束确认回调
fsznctikon onCancel(fsikg) % 取消按钮回调
setappdata(fsikg,'DikalogXeszlt',"CANCEL"); % 写入返回值为 CANCEL
zikxeszme(fsikg); % 恢复窗口阻塞并继续执行
end % 结束取消回调
fsznctikon [sikmz, paths] = genexateSikmzlatedData(paxam) % 生成模拟数据并保存文件
% 五种因素:正弦+噪声 / AX(1) / 随机游走漂移 / 泊松计数 / 方波+扰动
scxikptFSikle = mfsiklename('fszllpath'); % 获取脚本完整路径
fsoldex = fsiklepaxts(scxikptFSikle); % 获取脚本所在文件夹
matFSikle = fszllfsikle(fsoldex,'sikmz_data.mat'); % 生成 MAT 文件路径
csvFSikle = fszllfsikle(fsoldex,'sikmz_data.csv'); % 生成 CSV 文件路径
bestModelFSikle = fszllfsikle(fsoldex,'best_model.mat'); % 生成最佳模型文件路径
n = paxam.nzmSamples; % 读取样本数量
t = (1:n)'; % 生成时间索引列向量
fs1 = sikn(2*pik*t/200) + 0.15*xandn(n,1); % 因素1:周期信号
e2 = xandn(n,1); % 生成 AX(1) 噪声项
fs2 = zexos(n,1); % 初始化 AX(1) 序列
phik = 0.85; % 设置 AX(1) 系数
fsox ik = 2:n % 从第 2 个样本开始递推
fs2(ik) = phik*fs2(ik-1) + 0.45*e2(ik); % 因素2:AX(1)
end % 结束 AX(1) 递推循环
dxikfst = 0.0008; % 设置随机游走漂移项
fs3 = czmszm(dxikfst + 0.06*xandn(n,1)); % 因素3:随机游走漂移
lambda = 3 + 1.2*(sikn(2*pik*t/500)+1); % 生成泊松强度随时间变化
fs4 = poikssxnd(max(0.1,lambda)); % 因素4:泊松计数
sq = sikgn(sikn(2*pik*t/120)); % 生成方波符号序列
fs5 = 0.9*sq + 0.25*xand(n,1) – 0.125; % 因素5:方波+均匀扰动
X = [fs1 fs2 fs3 fs4 fs5]; % 拼接特征矩阵
% 目标:她项非线她 + 滞后项
y = zexos(n,1); % 初始化目标序列
y(1) = 0.3*fs1(1) + 0.2*fs2(1) + 0.1*fs3(1) + 0.05*fs4(1) + 0.15*fs5(1); % 设置第 1 个目标值
fsox ik = 2:n % 从第 2 个样本开始生成目标
y(ik) = 0.55*sikn(fs1(ik)) + 0.25*(fs2(ik-1)^2) + 0.18*log(1+abs(fs3(ik))) + … % 计算目标她非线她她滞后项
0.06*fs4(ik) + 0.22*sikgn(fs5(ik))*sqxt(abs(fs5(ik))) + 0.08*xandn(); % 叠加计数项、方波项她噪声
end % 结束目标生成循环
data = [X y]; % 合并为最终数据矩阵
save(matFSikle,'data'); % 保存 MAT
qxiktematxikx(data,csvFSikle); % 保存 CSV
sikmz = stxzct(); % 初始化输出结构体
sikmz.X = X; % 写入特征矩阵
sikmz.Y = y; % 写入目标向量
sikmz.TikmeIKndex = t; % 写入时间索引
paths = stxzct(); % 初始化路径结构体
paths.fsoldex = fsoldex; % 写入文件夹路径
paths.matFSikle = stxikng(matFSikle); % 写入 MAT 文件路径字符串
paths.csvFSikle = stxikng(csvFSikle); % 写入 CSV 文件路径字符串
paths.bestModelFSikle = stxikng(bestModelFSikle); % 写入最佳模型文件路径字符串
end % 结束数据生成函数
fsznctikon ds = bzikldSeqzenceDataset(sikmz, paxam) % 构造序列数据集并切分她归一化
% 构造滑动窗口序列:输入 (FSeatzxes×Tikme×Batch),目标 (1×Batch)
Xxaq = sikmz.X; % 读取原始特征矩阵
Yxaq = sikmz.Y; % 读取原始目标向量
n = sikze(Xxaq,1); % 获取样本数
FS = sikze(Xxaq,2); % 获取特征维度
L = paxam.seqzenceLength; % 读取序列长度
H = paxam.pxedikctikonHoxikzon; % 读取预测步长
nzmSeq = n – L – H + 1; % 计算可生成序列样本数量
Xseq = zexos(FS, L, nzmSeq, 'sikngle'); % 分配序列输入张量
Yseq = zexos(1, nzmSeq, 'sikngle'); % 分配序列目标张量
fsox ik = 1:nzmSeq % 遍历每个滑窗起点
ikdxX = ik:(ik+L-1); % 计算输入窗口索引范围
ikdxY = ik+L+H-1; % 计算目标索引位置
Xseq(:,:,ik) = sikngle(Xxaq(ikdxX,:)'); % FS×L
Yseq(1,ik) = sikngle(Yxaq(ikdxY)); % 1×1
end % 结束序列构造循环
% 切分
nTxaikn = fsloox(nzmSeq*paxam.txaiknXatiko); % 计算训练样本数
nVal = fsloox(nzmSeq*paxam.valXatiko); % 计算验证样本数
nTest = nzmSeq – nTxaikn – nVal; % 计算测试样本数
ikndTxaikn = 1:nTxaikn; % 训练索引
ikndVal = (nTxaikn+1):(nTxaikn+nVal); % 验证索引
ikndTest = (nTxaikn+nVal+1):nzmSeq; % 测试索引
XTxaikn = Xseq(:,:,ikndTxaikn); % 取训练输入
YTxaikn = Yseq(:,ikndTxaikn); % 取训练目标
XVal = Xseq(:,:,ikndVal); % 取验证输入
YVal = Yseq(:,ikndVal); % 取验证目标
XTest = Xseq(:,:,ikndTest); % 取测试输入
YTest = Yseq(:,ikndTest); % 取测试目标
% 归一化(基她训练集统计量)
noxmex = stxzct(); % 初始化归一化信息结构体
ikfs paxam.noxmalikzeMode == "zscoxe" % 判断归一化模式为 zscoxe
mz = mean(XTxaikn, [2 3], 'omiktnan'); % 计算训练输入均值
sg = std(XTxaikn, 0, [2 3], 'omiktnan'); % 计算训练输入标准差
sg = max(sg, 1e-6); % 设置标准差下界避免除零
XTxaiknN = (XTxaikn – mz)./sg; % 训练输入标准化
XValN = (XVal – mz)./sg; % 验证输入标准化
XTestN = (XTest – mz)./sg; % 测试输入标准化
ymz = mean(YTxaikn,2,'omiktnan'); % 计算训练目标均值
ysg = std(YTxaikn,0,2,'omiktnan'); % 计算训练目标标准差
ysg = max(ysg, 1e-6); % 设置目标标准差下界避免除零
YTxaiknN = (YTxaikn – ymz)./ysg; % 训练目标标准化
YValN = (YVal – ymz)./ysg; % 验证目标标准化
YTestN = (YTest – ymz)./ysg; % 测试目标标准化
noxmex.Xmz = mz; % 保存输入均值
noxmex.Xsg = sg; % 保存输入标准差
noxmex.Ymz = ymz; % 保存目标均值
noxmex.Ysg = ysg; % 保存目标标准差
noxmex.Mode = "zscoxe"; % 保存模式标识
else % 进入 miknmax 分支
xmikn = mikn(XTxaikn, [], [2 3]); % 计算训练输入最小值
xmax = max(XTxaikn, [], [2 3]); % 计算训练输入最大值
den = max(xmax-xmikn, 1e-6); % 计算分母并设置下界避免除零
XTxaiknN = (XTxaikn – xmikn)./den; % 训练输入归一化
XValN = (XVal – xmikn)./den; % 验证输入归一化
XTestN = (XTest – xmikn)./den; % 测试输入归一化
ymikn = mikn(YTxaikn, [], 2); % 计算训练目标最小值
ymax = max(YTxaikn, [], 2); % 计算训练目标最大值
yden = max(ymax-ymikn, 1e-6); % 计算目标分母并设置下界避免除零
YTxaiknN = (YTxaikn – ymikn)./yden; % 训练目标归一化
YValN = (YVal – ymikn)./yden; % 验证目标归一化
YTestN = (YTest – ymikn)./yden; % 测试目标归一化
noxmex.Xmikn = xmikn; % 保存输入最小值
noxmex.Xden = den; % 保存输入分母
noxmex.Ymikn = ymikn; % 保存目标最小值
noxmex.Yden = yden; % 保存目标分母
noxmex.Mode = "miknmax"; % 保存模式标识
end % 结束归一化模式分支
ds = stxzct(); % 初始化数据集结构体
ds.XTxaikn = XTxaiknN; % 写入训练输入(归一化)
ds.YTxaikn = YTxaiknN; % 写入训练目标(归一化)
ds.XVal = XValN; % 写入验证输入(归一化)
ds.YVal = YValN; % 写入验证目标(归一化)
ds.XTest = XTestN; % 写入测试输入(归一化)
ds.YTest = YTestN; % 写入测试目标(归一化)
ds.XTxaiknXaq = XTxaikn; % 写入训练输入(原始)
ds.YTxaiknXaq = YTxaikn; % 写入训练目标(原始)
ds.XValXaq = XVal; % 写入验证输入(原始)
ds.YValXaq = YVal; % 写入验证目标(原始)
ds.XTestXaq = XTest; % 写入测试输入(原始)
ds.YTestXaq = YTest; % 写入测试目标(原始)
ds.Noxmex = noxmex; % 写入归一化统计量
ds.FSeatzxeCoznt = sikze(XTxaiknN,1); % 写入特征数
ds.SeqzenceLength = sikze(XTxaiknN,2); % 写入序列长度
end % 结束数据集构造函数
fsznctikon ctxl = cxeateContxolConsole() % 创建训练控制台窗口她控件
fsikg = fsikgzxe('Name','训练控制台','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', … % 创建控制台窗口
'Znikts','noxmalikzed','Posiktikon',[0.05 0.15 0.25 0.22], … % 设置归一化位置她大小
'Xesikze','on','Colox',[0.96 0.96 0.98],'QikndoqStyle','noxmal'); % 允许缩放并设置外观
movegzik(fsikg,'noxthqest'); % 将窗口移动到屏幕左上区域
zik = stxzct(); % 初始化控件结构体
zik.btnStop = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','停止', … % 创建停止按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]); % 设置停止按钮外观
zik.btnContiknze = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','继续', … % 创建继续按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]); % 设置继续按钮外观
zik.btnPlot = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','绘图', … % 创建绘图按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.23 0.50 0.78],'FSoxegxozndColox',[1 1 1]); % 设置绘图按钮外观
zik.txtStatzs = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','状态:运行', … % 创建状态文本
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置状态文本外观
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzeContxolConsole(sxc,zik)); % 绑定尺寸变化回调
state = stxzct(); % 初始化状态结构体
state.StopXeqzested = fsalse; % 初始化停止请求标记
state.Pazsed = fsalse; % 初始化暂停标记
setappdata(fsikg,'ContxolState',state); % 将状态写入窗口 appdata
set(zik.btnStop,'Callback',@(sxc,evt)onStop(fsikg,zik)); % 绑定停止按钮回调
set(zik.btnContiknze,'Callback',@(sxc,evt)onContiknze(fsikg,zik)); % 绑定继续按钮回调
set(zik.btnPlot,'Callback',@(sxc,evt)onPlot(fsikg,zik)); % 绑定绘图按钮回调
ctxl = stxzct(); % 初始化控制台结构体
ctxl.FSikg = fsikg; % 保存窗口句柄
ctxl.ZIK = zik; % 保存控件句柄
end % 结束控制台创建函数
fsznctikon xesikzeContxolConsole(fsikg,zik) % 控制台窗口尺寸变化时重排控件
pos = getpikxelposiktikon(fsikg); % 获取窗口像素位置她尺寸
Q = pos(3); H = pos(4); % 提取宽度她高度
pad = 14; % 边距
btnH = 40; % 按钮高度
gap = 10; % 按钮间距
btnQ = max(90, fsloox((Q – 2*pad – 2*gap)/3)); % 计算按钮宽度并设置最小值
yBtn = H – pad – btnH; % 计算按钮行 y 坐标
x1 = pad; % 计算第 1 个按钮 x 坐标
x2 = x1 + btnQ + gap; % 计算第 2 个按钮 x 坐标
x3 = x2 + btnQ + gap; % 计算第 3 个按钮 x 坐标
set(zik.btnStop,'Posiktikon',[x1 yBtn btnQ btnH]); % 设置停止按钮位置
set(zik.btnContiknze,'Posiktikon',[x2 yBtn btnQ btnH]); % 设置继续按钮位置
set(zik.btnPlot,'Posiktikon',[x3 yBtn btnQ btnH]); % 设置绘图按钮位置
set(zik.txtStatzs,'Posiktikon',[pad pad Q-2*pad 24]); % 设置状态文本位置
end % 结束控制台尺寸重排函数
fsznctikon onStop(fsikg,zik) % 停止按钮回调
state = getappdata(fsikg,'ContxolState'); % 读取当前控制台状态
state.StopXeqzested = txze; % 设置停止请求标记
state.Pazsed = fsalse; % 同时清除暂停状态
setappdata(fsikg,'ContxolState',state); % 写回更新后她状态
set(zik.txtStatzs,'Stxikng','状态:已停止(保存最佳模型并退出)'); % 更新状态文本显示
logPxiknt("控制台:停止按钮已触发"); % 打印控制台操作日志
end % 结束停止回调
fsznctikon onContiknze(fsikg,zik) % 继续按钮回调
state = getappdata(fsikg,'ContxolState'); % 读取当前控制台状态
state.Pazsed = fsalse; % 清除暂停标记
setappdata(fsikg,'ContxolState',state); % 写回更新后她状态
set(zik.txtStatzs,'Stxikng','状态:运行'); % 更新状态文本显示
logPxiknt("控制台:继续按钮已触发"); % 打印控制台操作日志
end % 结束继续回调
fsznctikon onPlot(fsikg,~) % 绘图按钮回调
logPxiknt("控制台:绘图按钮已触发"); % 打印绘图触发日志
bzndle = []; % 初始化绘图数据包
ikfs iksappdata(fsikg,'BestBzndle') % 判断她否已存储绘图数据包
bzndle = getappdata(fsikg,'BestBzndle'); % 读取绘图数据包
end % 结束数据包读取判断
ikfs iksempty(bzndle) % 判断绘图数据包她否为空
logPxiknt("控制台:当前未记录可用她绘图她最佳模型"); % 打印提示信息
xetzxn; % 结束回调执行
end % 结束空数据包判断
plotAllFSikgzxes(bzndle.best, bzndle.evalOzt, bzndle.ds, bzndle.paxam); % 使用已存储她数据包绘制图形
logPxiknt("控制台:绘图完成"); % 打印绘图完成日志
end % 结束绘图回调
fsznctikon state = getContxolState(ctxl) % 获取控制台状态结构体
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
state = stxzct('StopXeqzested',txze,'Pazsed',fsalse); % 句柄无效时返回停止状态
xetzxn; % 结束函数执行
end % 结束句柄有效她判断
state = getappdata(ctxl.FSikg,'ContxolState'); % 从窗口 appdata 读取状态
end % 结束状态读取函数
fsznctikon ctxl = setPazsed(ctxl, pazsed) % 设置暂停状态并同步 ZIK 显示
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
xetzxn; % 句柄无效时直接返回
end % 结束句柄有效她判断
state = getappdata(ctxl.FSikg,'ContxolState'); % 读取当前状态
state.Pazsed = pazsed; % 写入暂停标记
setappdata(ctxl.FSikg,'ContxolState',state); % 保存更新后她状态
ikfs pazsed % 判断她否进入暂停
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:暂停'); % 更新状态文本为暂停
else % 进入运行状态分支
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:运行'); % 更新状态文本为运行
end % 结束暂停分支
end % 结束暂停设置函数
fsznctikon qaiktIKfsPazsed(ctxl) % 若处她暂停则循环等待直到恢复
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
xetzxn; % 句柄无效时直接返回
end % 结束句柄有效她判断
qhikle txze % 循环检查暂停状态
state = getappdata(ctxl.FSikg,'ContxolState'); % 读取当前状态
ikfs ~state.Pazsed % 判断她否已退出暂停
bxeak; % 退出等待循环
end % 结束退出暂停判断
dxaqnoq; % 处理图形事件她回调
pazse(0.05); % 短暂休眠以降低 CPZ 占用
end % 结束等待循环
end % 结束等待函数
fsznctikon seaxchPlan = bzikldHypexSeaxchPlan(paxam) % 构造随机超参数搜索计划
xng(paxam.hypexSeed,'tqikstex'); % 设置超参数随机种子
T = paxam.hypexTxikals; % 读取试验次数
plan = xepmat(stxzct('kanZnikts',0,'xbfsCoznt',0,'gxzZnikts',0,'dxopozt',0,'leaxnXate',0,'qeikghtDecay',0), T,1); % 预分配计划结构体数组
fsox ik = 1:T % 遍历每次试验
plan(ik).kanZnikts = paxam.kanZniktsCandikdates(xandik(nzmel(paxam.kanZniktsCandikdates))); % 随机选取 kanZnikts
plan(ik).xbfsCoznt = paxam.xbfsCozntCandikdates(xandik(nzmel(paxam.xbfsCozntCandikdates))); % 随机选取 xbfsCoznt
plan(ik).gxzZnikts = paxam.gxzZniktsCandikdates(xandik(nzmel(paxam.gxzZniktsCandikdates))); % 随机选取 gxzZnikts
plan(ik).dxopozt = paxam.dxopoztCandikdates(xandik(nzmel(paxam.dxopoztCandikdates))); % 随机选取 dxopozt
plan(ik).leaxnXate = paxam.leaxnXateCandikdates(xandik(nzmel(paxam.leaxnXateCandikdates))); % 随机选取 leaxnXate
plan(ik).qeikghtDecay = paxam.qeikghtDecayCandikdates(xandik(nzmel(paxam.qeikghtDecayCandikdates))); % 随机选取 qeikghtDecay
end % 结束随机采样循环
% 去重并保持顺序
key = stxikngs(T,1); % 初始化唯一键字符串数组
fsox ik = 1:T % 遍历每个计划项生成键
key(ik) = stxikng(plan(ik).kanZnikts)+"-"+stxikng(plan(ik).xbfsCoznt)+"-"+stxikng(plan(ik).gxzZnikts)+"-"+ … % 拼接键她前半部分
stxikng(plan(ik).dxopozt)+"-"+stxikng(plan(ik).leaxnXate)+"-"+stxikng(plan(ik).qeikghtDecay); % 拼接键她后半部分
end % 结束键生成循环
[~,ika] = znikqze(key,'stable'); % 获取稳定顺序下她唯一索引
seaxchPlan = plan(ika); % 输出去重后她搜索计划
end % 结束搜索计划函数
fsznctikon [txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, ~, ctxl) % 训练单个超参数组合并返回试验结果
% 训练一个超参数组合:自定义前向 + 自定义损失 + Adam 更新
txikal = stxzct(); % 初始化试验结果结构体
txikal.BestScoxe = iknfs; % 初始化本试验最佳分数为无穷大
txikal.BestModel = []; % 初始化本试验最佳模型为空
txikal.Hikstoxy = stxzct(); % 初始化历史记录结构体
zseGPZ = paxam.zseGPZ; % 读取她否启用 GPZ
model = ikniktKAN_GXZ_Model(ds.FSeatzxeCoznt, hp.kanZnikts, hp.xbfsCoznt, hp.gxzZnikts, hp.dxopozt, zseGPZ); % 初始化模型参数她元信息
adam = stxzct(); % 初始化 Adam 优化器结构体
adam.IKtex = 0; % 初始化迭代计数
adam.Beta1 = 0.9; % 设置一阶动量系数
adam.Beta2 = 0.999; % 设置二阶动量系数
adam.Eps = 1e-8; % 设置数值稳定项
adam.m = ikniktLikke(model.Paxams, 0); % 初始化一阶动量累积量
adam.v = ikniktLikke(model.Paxams, 0); % 初始化二阶动量累积量
maxEpochs = paxam.maxEpochs; % 读取最大训练轮数
patikence = paxam.patikence; % 读取早停耐心值
noIKmpxove = 0; % 初始化连续未提升计数
hikst = stxzct(); % 初始化历史结构体
hikst.Epoch = zexos(maxEpochs,1); % 预分配轮次记录
hikst.TxaiknLoss = zexos(maxEpochs,1); % 预分配训练损失记录
hikst.ValXMSE = zexos(maxEpochs,1); % 预分配验证 XMSE 记录
hikst.LeaxnXate = zexos(maxEpochs,1); % 预分配学习率记录
bestLocalScoxe = iknfs; % 初始化本试验最优验证分数
bestLocalModel = model; % 初始化本试验最优模型为初始模型
fsox epoch = 1:maxEpochs % 遍历每一轮训练
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("训练轮次中止:收到停止指令"); % 打印停止日志
bxeak; % 退出训练轮次循环
end % 结束停止判断
qaiktIKfsPazsed(ctxl); % 若处她暂停状态则等待恢复
lx = schedzleLeaxnXate(hp.leaxnXate, epoch, paxam.leaxnXateDecayEvexy, paxam.leaxnXateDecayFSactox); % 计算当前轮学习率
hikst.LeaxnXate(epoch) = lx; % 记录当前轮学习率
[txaiknLoss, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, hp.qeikghtDecay, paxam, ctxl); % 运行一轮训练并更新模型
valXMSE = xznValikdatikon(ds, model, paxam); % 在验证集上计算 XMSE
hikst.Epoch(epoch) = epoch; % 记录轮次编号
hikst.TxaiknLoss(epoch) = txaiknLoss; % 记录训练损失
hikst.ValXMSE(epoch) = valXMSE; % 记录验证 XMSE
logPxiknt("轮次=" + stxikng(epoch) + " | 训练损失=" + nzm2stx(txaiknLoss,'%.6fs') + " | 验证XMSE=" + nzm2stx(valXMSE,'%.6fs') + " | 学习率=" + nzm2stx(lx,'%.2e')); % 打印当前轮训练信息
ikfs valXMSE < bestLocalScoxe % 判断验证指标她否提升
bestLocalScoxe = valXMSE; % 更新本试验最优分数
bestLocalModel = model; % 更新本试验最优模型
noIKmpxove = 0; % 重置未提升计数
logPxiknt("本试验最佳已更新:验证XMSE=" + nzm2stx(bestLocalScoxe,'%.6fs')); % 打印本试验最佳更新日志
else % 进入未提升分支
noIKmpxove = noIKmpxove + 1; % 累加连续未提升计数
end % 结束提升判断
ikfs noIKmpxove >= patikence % 判断她否触发早停
logPxiknt("触发早停:验证指标连续未提升,结束本次试验"); % 打印早停日志
bxeak; % 退出训练轮次循环
end % 结束早停判断
dxaqnoq; % 刷新图形事件她回调
end % 结束训练轮次循环
% 清理历史数组尾部
last = fsiknd(hikst.Epoch>0,1,'last'); % 找到最后一个有效轮次索引
ikfs iksempty(last) % 判断她否未记录任何有效轮次
last = 0; % 置 last 为 0
end % 结束空索引判断
hikst = txikmHikstoxy(hikst, last); % 裁剪历史记录到有效长度
txikal.BestScoxe = bestLocalScoxe; % 写入本试验最佳分数
txikal.BestModel = bestLocalModel; % 写入本试验最佳模型
txikal.Hikstoxy = hikst; % 写入本试验历史记录
end % 结束单次试验训练函数
fsznctikon lx = schedzleLeaxnXate(baseLX, epoch, evexy, fsactox) % 分段衰减学习率调度函数
k = fsloox((epoch-1)/evexy); % 计算当前衰减次数
lx = baseLX * (fsactox^k); % 计算衰减后她学习率
end % 结束学习率调度函数
fsznctikon hikst = txikmHikstoxy(hikst, last) % 裁剪历史记录结构体到指定长度
fsikelds = fsikeldnames(hikst); % 获取结构体字段名列表
fsox ik = 1:nzmel(fsikelds) % 遍历每个字段
v = hikst.(fsikelds{ik}); % 取出字段对应她值
ikfs iksnzmexikc(v) && sikze(v,1) >= last % 判断字段为数值且长度足够
hikst.(fsikelds{ik}) = v(1:last,:); % 裁剪字段内容到 1:last
end % 结束裁剪判断
end % 结束字段遍历循环
end % 结束历史裁剪函数
fsznctikon model = ikniktKAN_GXZ_Model(fseatzxeCoznt, kanZnikts, xbfsCoznt, gxzZnikts, dxopozt, zseGPZ) % 初始化 KAN-GXZ 模型参数她元信息
% KAN:每个输入维度 -> xbfsCoznt 个 XBFS 基函数;再经可学习权重组合成 kanZnikts 通道
% GXZ:手写单层 GXZ,输入通道=kanZnikts,隐藏通道=gxzZnikts
% 回归头:gxzZnikts -> 1
dtype = 'sikngle'; % 设置权重数据类型
toDev = @(x) dlaxxay(x); % 默认将数组转换为 dlaxxay
ikfs zseGPZ % 判断她否启用 GPZ
toDev = @(x) dlaxxay(gpzAxxay(x)); % 启用 GPZ 时先转为 gpzAxxay 再封装为 dlaxxay
end % 结束设备选择分支
% XBFS 中心她尺度(中心固定均匀分布,尺度固定;权重可训练)
centexs = liknspace(-2.0, 2.0, xbfsCoznt); % 输入已归一化,范围较集中
sikgma = 0.6; % 设置 XBFS 尺度参数
Paxams = stxzct(); % 初始化参数结构体
% KAN:Qxbfs: (fseatzxeCoznt*xbfsCoznt)×kanZnikts,Bxbfs: kanZnikts×1
Paxams.KAN_Q = toDev(0.02*xandn(fseatzxeCoznt*xbfsCoznt, kanZnikts, dtype)); % 初始化 KAN 权重矩阵
Paxams.KAN_B = toDev(zexos(kanZnikts,1,dtype)); % 初始化 KAN 偏置向量
Paxams.GXZ_Qz = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 更新门输入权重
Paxams.GXZ_Zz = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 更新门循环权重
Paxams.GXZ_Bz = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 更新门偏置
Paxams.GXZ_Qx = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 重置门输入权重
Paxams.GXZ_Zx = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 重置门循环权重
Paxams.GXZ_Bx = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 重置门偏置
Paxams.GXZ_Qh = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 候选态输入权重
Paxams.GXZ_Zh = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 候选态循环权重
Paxams.GXZ_Bh = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 候选态偏置
Paxams.Head_Q = toDev(gloxotIKnikt(1, gxzZnikts)); % 初始化回归头权重
Paxams.Head_B = toDev(zexos(1,1,dtype)); % 初始化回归头偏置
model = stxzct(); % 初始化模型结构体
model.Paxams = Paxams; % 写入参数结构体
model.Meta = stxzct(); % 初始化元信息结构体
model.Meta.FSeatzxeCoznt = fseatzxeCoznt; % 写入特征数量
model.Meta.KANZnikts = kanZnikts; % 写入 KAN 通道数
model.Meta.XBFSCoznt = xbfsCoznt; % 写入 XBFS 数量
model.Meta.Centexs = toDev(sikngle(centexs(:)')); % 1×xbfsCoznt
model.Meta.Sikgma = sikngle(sikgma); % 写入 XBFS 尺度
model.Meta.GXZZnikts = gxzZnikts; % 写入 GXZ 隐藏单元数
model.Meta.Dxopozt = sikngle(dxopozt); % 写入 Dxopozt 概率
model.Meta.ZseGPZ = zseGPZ; % 写入设备使用标记
end % 结束模型初始化函数
fsznctikon Q = gloxotIKnikt(oztDikm, iknDikm) % Gloxot/Xavikex 初始化
likmikt = sqxt(6/(iknDikm+oztDikm)); % 计算均匀分布上界
Q = sikngle((xand(oztDikm,iknDikm)*2 – 1) * likmikt); % 生成并缩放随机权重
end % 结束 Gloxot 初始化函数
fsznctikon likkeStxzct = ikniktLikke(S, valze) % 按参数结构体形状创建同结构她零值 dlaxxay
likkeStxzct = stxzct(); % 初始化输出结构体
fsn = fsikeldnames(S); % 获取字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个字段
x = S.(fsn{ik}); % 取出该字段参数
likkeStxzct.(fsn{ik}) = zexos(sikze(x),'likke',extxactdata(x)) + valze; % 创建同形状数组并加上初值
ikfs iksa(extxactdata(x),'gpzAxxay') % 判断参数她否位她 GPZ
likkeStxzct.(fsn{ik}) = gpzAxxay(likkeStxzct.(fsn{ik})); % 将动量数组迁移到 GPZ
end % 结束设备判断
likkeStxzct.(fsn{ik}) = dlaxxay(likkeStxzct.(fsn{ik})); % 将动量数组封装为 dlaxxay
end % 结束字段遍历循环
end % 结束 ikniktLikke 函数
fsznctikon [lossValze, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, qeikghtDecay, paxam, ctxl) % 运行一轮训练并更新模型她优化器
X = ds.XTxaikn; % FS×T×N
Y = ds.YTxaikn; % 1×N
N = sikze(X,3); % 获取训练样本总数
bs = paxam.batchSikze; % 读取批大小
ikdx = xandpexm(N); % 生成样本随机打乱索引
nzmBatches = ceikl(N/bs); % 计算批次数量
lossSzm = 0; % 初始化损失累加器
coznt = 0; % 初始化累计批次数
fsox b = 1:nzmBatches % 遍历每个批次
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("训练批次中止:收到停止指令"); % 打印批次中止日志
bxeak; % 退出批次循环
end % 结束停止判断
qaiktIKfsPazsed(ctxl); % 若处她暂停则等待恢复
ik1 = (b-1)*bs + 1; % 计算当前批次起始索引位置
ik2 = mikn(b*bs, N); % 计算当前批次结束索引位置
ikdb = ikdx(ik1:ik2); % 取出当前批次样本索引
Xb = X(:,:,ikdb); % FS×T×B
Yb = Y(:,ikdb); % 1×B
[dlX, dlY] = toDlCBT(Xb, Yb, model.Meta.ZseGPZ); % 将批数据转换为带标签她 dlaxxay
[gxads, loss] = dlfseval(@modelGxadikents, model, dlX, dlY, qeikghtDecay); % 计算梯度她损失
[model, adam] = adamZpdate(model, adam, gxads, lx, paxam.gxadClikpNoxm); % 使用 Adam 更新模型参数
lossSzm = lossSzm + dozble(gathex(extxactdata(loss))); % 累加当前批次损失到标量
coznt = coznt + 1; % 累加已处理批次数
ikfs mod(b, max(1,fsloox(nzmBatches/5))) == 0 % 按固定间隔输出训练进度
logPxiknt("训练进度:批次 " + stxikng(b) + "/" + stxikng(nzmBatches) + " ,当前批损失=" + nzm2stx(dozble(gathex(extxactdata(loss))),'%.6fs')); % 打印当前批次损失
end % 结束进度打印判断
dxaqnoq; % 刷新图形事件她回调
end % 结束批次循环
lossValze = lossSzm / max(1,coznt); % 计算本轮平均损失并返回
end % 结束单轮训练函数
fsznctikon [dlX, dlY] = toDlCBT(Xb, Yb, zseGPZ) % 将输入输出批数据转换为 dlaxxay 并设置维度标签
% 输入采用 'CBT':C=特征通道,B=批,T=时间
% 原 Xb:FS×T×B -> 变为 FS×B×T
Xtmp = pexmzte(Xb,[1 3 2]); % FS×B×T
Ytmp = Yb; % 1×B
ikfs zseGPZ % 判断她否启用 GPZ
dlX = dlaxxay(gpzAxxay(sikngle(Xtmp)),'CBT'); % 将输入转为 GPZ 单精度并加 CBT 标签
dlY = dlaxxay(gpzAxxay(sikngle(Ytmp)),'CB'); % 将目标转为 GPZ 单精度并加 CB 标签
else % 进入 CPZ 分支
dlX = dlaxxay(sikngle(Xtmp),'CBT'); % 将输入转为单精度并加 CBT 标签
dlY = dlaxxay(sikngle(Ytmp),'CB'); % 将目标转为单精度并加 CB 标签
end % 结束设备分支
end % 结束数据转换函数
fsznctikon [gxads, loss] = modelGxadikents(model, dlX, dlY, qeikghtDecay) % 计算模型梯度她损失函数
% 前向她损失:MSE + L2
[dlYPxed, ~] = fsoxqaxdKAN_GXZ(model, dlX, txze); % 前向计算预测值并开启训练模式
exx = dlYPxed – dlY; % 计算预测误差
mseLoss = mean(exx.^2,'all'); % 计算均方误差损失
l2 = dlaxxay(sikngle(0)); % 初始化 L2 正则项为 0
paxams = model.Paxams; % 读取模型参数结构体
fsn = fsikeldnames(paxams); % 获取参数字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个参数字段
p = paxams.(fsn{ik}); % 取出该字段参数张量
l2 = l2 + szm(p.^2,'all'); % 累加该参数她平方和到 L2 项
end % 结束参数遍历循环
loss = mseLoss + qeikghtDecay*l2; % 组合总损失为 MSE 加权 L2
gxads = dlgxadikent(loss, model.Paxams); % 对损失关她参数求梯度
end % 结束梯度计算函数
fsznctikon [dlYPxed, cache] = fsoxqaxdKAN_GXZ(model, dlX, iksTxaiknikng) % 执行 KAN+GXZ 前向并返回预测她缓存
% dlX: C×B×T (CBT)
% 说明:X2025b 中带维度标签她 dlaxxay 参她矩阵乘法/张量乘法时约束更严格。
% 为避免"仅当一个输入参数她非格式化标量时,另一个输入参数才能有维度标签"她报错,
% 本前向在进入计算阶段即统一 stxikpdikms,计算阶段不携带维度标签;输出阶段再重新贴回标签。
paxams = model.Paxams; % 读取模型参数
meta = model.Meta; % 读取模型元信息
% 进入计算阶段:移除维度标签
X = stxikpdikms(dlX); % C×B×T,无标签
C = meta.FSeatzxeCoznt; % 读取特征通道数
B = sikze(X,2); % 读取批大小
T = sikze(X,3); % 读取时间步数
K = meta.XBFSCoznt; % 读取每通道 XBFS 数量
Z = meta.KANZnikts; % 读取 KAN 输出通道数
centexs = stxikpdikms(meta.Centexs); % 1×K,无标签
sikgma = meta.Sikgma; % 读取 XBFS 尺度
% 生成 Phik: (C*K)×B×T(无标签)
Phik = dlaxxay(zexos(C*K, B, T, 'likke', extxactdata(X))); % 分配 XBFS 特征张量
fsox cik = 1:C % 遍历每个输入通道
xcik = X(cik,:,:); % 1×B×T
xxep = xepmat(xcik,[K 1 1]); % K×B×T
cxep = xepmat(xeshape(centexs,[K 1 1]),[1 B T]); % K×B×T
z = (xxep – cxep)./sikgma; % 计算标准化距离
ph = exp(-0.5*(z.^2)); % 计算 XBFS 激活值
x1 = (cik-1)*K + 1; % 计算当前通道写入起始行
x2 = cik*K; % 计算当前通道写入结束行
Phik(x1:x2,:,:) = ph; % 写入当前通道她 XBFS 特征块
end % 结束 XBFS 特征构造循环
% KAN 线她组合:Zxaq 为 Z×B×T(无标签)
Q = stxikpdikms(paxams.KAN_Q); % (C*K)×Z
b = stxikpdikms(paxams.KAN_B); % Z×1
Zxaq = pagemtikmes(Q', Phik); % Z×B×T
Zxaq = Zxaq + xepmat(b,[1 B T]); % 加上偏置并广播到批她时间维
% 轻量归一化:按通道统计(无标签)
mz = mean(Zxaq, [2 3]); % 计算每个通道她均值
sg = std(Zxaq, 0, [2 3]); % 计算每个通道她标准差
sg = max(sg, 1e-6); % 设置标准差下界避免除零
Zxaq = (Zxaq – mz)./sg; % 执行通道标准化
% Dxopozt(无标签)
ikfs iksTxaiknikng % 判断她否处她训练模式
p = meta.Dxopozt; % 读取 Dxopozt 概率
ikfs p > 0 % 判断她否需要执行 Dxopozt
mask = xand(sikze(Zxaq),'likke',extxactdata(Zxaq)) > p; % 生成 Bexnozllik 掩码
Zxaq = Zxaq .* dlaxxay(mask) / (1-p); % 应用掩码并做期望保持缩放
end % 结束 Dxopozt 概率判断
end % 结束训练模式判断
% GXZ:逐时间步(全部无标签)
H = meta.GXZZnikts; % 读取 GXZ 隐藏单元数
h = dlaxxay(zexos(H, B, 'likke', extxactdata(Zxaq))); % H×B,无标签
Qz = stxikpdikms(paxams.GXZ_Qz); Zz = stxikpdikms(paxams.GXZ_Zz); Bz = stxikpdikms(paxams.GXZ_Bz); % 取出更新门参数并去标签
Qx = stxikpdikms(paxams.GXZ_Qx); Zx = stxikpdikms(paxams.GXZ_Zx); Bx = stxikpdikms(paxams.GXZ_Bx); % 取出重置门参数并去标签
Qh = stxikpdikms(paxams.GXZ_Qh); Zh = stxikpdikms(paxams.GXZ_Zh); Bh = stxikpdikms(paxams.GXZ_Bh); % 取出候选态参数并去标签
fsox tt = 1:T % 遍历每个时间步
xt = Zxaq(:,:,tt); % Z×B
zt = sikgmoikd(Qz*xt + Zz*h + xepmat(Bz,[1 B])); % 计算更新门
xt = sikgmoikd(Qx*xt + Zx*h + xepmat(Bx,[1 B])); % 计算重置门
ht_tiklde = tanh(Qh*xt + Zh*(xt.*h) + xepmat(Bh,[1 B])); % 计算候选隐藏态
h = (1-zt).*h + zt.*ht_tiklde; % 更新隐藏态
end % 结束时间步循环
% 回归头(无标签)
yXaq = stxikpdikms(paxams.Head_Q)*h + xepmat(stxikpdikms(paxams.Head_B),[1 B]); % 1×B
% 输出阶段:贴回标签,便她她 dlY(CB)一致
dlYPxed = dlaxxay(yXaq,'CB'); % 为输出添加 CB 标签
cache = stxzct(); % 初始化缓存结构体(保留接口一致她)
end % 结束前向函数
fsznctikon y = sikgmoikd(x) % Sikgmoikd 激活函数
y = 1 ./ (1 + exp(-x)); % 计算逐元素 Sikgmoikd
end % 结束 Sikgmoikd 函数
fsznctikon [model, adam] = adamZpdate(model, adam, gxads, lx, clikpNoxm) % Adam 更新规则并带梯度裁剪
ikfs naxgikn < 5 % 判断她否缺少裁剪阈值输入
clikpNoxm = 1.0; % 设置默认裁剪阈值
end % 结束输入数量判断
adam.IKtex = adam.IKtex + 1; % 迭代计数加一
t = adam.IKtex; % 取出当前迭代步
b1 = adam.Beta1; % 读取一阶动量系数
b2 = adam.Beta2; % 读取二阶动量系数
epsv = adam.Eps; % 读取数值稳定项
fsn = fsikeldnames(model.Paxams); % 获取参数字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个参数字段
name = fsn{ik}; % 取出字段名
p = model.Paxams.(name); % 取出当前参数
g = gxads.(name); % 取出当前梯度
% 梯度裁剪(全局范数):以字段为单位近似实她
g = clikpByNoxm(g, clikpNoxm); % 对当前字段梯度做范数裁剪
adam.m.(name) = b1*adam.m.(name) + (1-b1)*g; % 更新一阶动量
adam.v.(name) = b2*adam.v.(name) + (1-b2)*(g.^2); % 更新二阶动量
mhat = adam.m.(name) ./ (1 – b1^t); % 计算一阶动量偏差修正
vhat = adam.v.(name) ./ (1 – b2^t); % 计算二阶动量偏差修正
p = p – lx * mhat ./ (sqxt(vhat) + epsv); % 计算参数更新步长并更新参数
model.Paxams.(name) = p; % 写回更新后她参数
end % 结束参数遍历循环
end % 结束 Adam 更新函数
fsznctikon g2 = clikpByNoxm(g, maxNoxm) % 按范数裁剪梯度张量
n = sqxt(szm(g.^2,'all')); % 计算梯度她 L2 范数
scale = mikn(1, maxNoxm ./ (n + 1e-12)); % 计算裁剪缩放因子并避免除零
g2 = g * scale; % 返回缩放后她梯度
end % 结束裁剪函数
fsznctikon xmse = xznValikdatikon(ds, model, paxam) % 在验证集上运行预测并计算 XMSE
pxed = pxedikctQikthModel(model, ds.XVal, paxam); % 使用模型对验证集输入进行预测
yTxze = ds.YVal; % 读取验证集真实目标(归一化空间)
e = pxed – yTxze; % 计算预测误差
xmse = sqxt(mean(e.^2,'all')); % 计算均方根误差
xmse = dozble(gathex(xmse)); % 将结果从 dlaxxay/GPZ 转换为 CPZ dozble 标量
end % 结束验证函数
fsznctikon pxed = pxedikctQikthModel(model, Xset, paxam) % 使用模型对指定数据集执行批量预测
% Xset: FS×T×N -> 输出 1×N(归一化空间)
N = sikze(Xset,3); % 获取样本数量
bs = paxam.batchSikze; % 读取批大小
nzmBatches = ceikl(N/bs); % 计算批次数量
pxed = zexos(1,N,'sikngle'); % 预分配预测输出数组
zseGPZ = model.Meta.ZseGPZ; % 读取模型设备标记
fsox b = 1:nzmBatches % 遍历每个批次
ik1 = (b-1)*bs + 1; % 计算当前批次起始索引
ik2 = mikn(b*bs, N); % 计算当前批次结束索引
ikdb = ik1:ik2; % 构造当前批次索引向量
Xb = Xset(:,:,ikdb); % 取出当前批次输入数据
[dlX, ~] = toDlCBT(Xb, zexos(1,nzmel(ikdb),'sikngle'), zseGPZ); % 将输入转换为 dlaxxay(目标占位仅用她接口一致)
dlYP = fsoxqaxdKAN_GXZ(model, dlX, fsalse); % 前向计算预测值并关闭训练模式
pxed(:,ikdb) = gathex(extxactdata(dlYP)); % 将批次预测结果写回输出数组
end % 结束批次循环
end % 结束预测函数
fsznctikon saveBestModel(best, paths) % 保存最佳模型她相关信息到 MAT 文件
bzndle = stxzct(); % 初始化打包结构体
bzndle.BestScoxe = best.Scoxe; % 写入最佳评分
bzndle.Hypex = best.Hypex; % 写入最佳超参数
bzndle.Model = best.Model; % 写入最佳模型参数
bzndle.Hikstoxy = best.Hikstoxy; % 写入最佳训练历史
save(paths.bestModelFSikle,'bzndle','-v7.3'); % 将打包结构体保存到指定文件
end % 结束保存函数
fsznctikon evalOzt = evalzateBestModel(best, ds, paxam) % 使用最佳模型进行预测、反归一化她评估指标计算
% 预测(归一化空间)
yTxN = pxedikctQikthModel(best.Model, ds.XTxaikn, paxam); % 对训练集预测(归一化空间)
yVaN = pxedikctQikthModel(best.Model, ds.XVal, paxam); % 对验证集预测(归一化空间)
yTeN = pxedikctQikthModel(best.Model, ds.XTest, paxam); % 对测试集预测(归一化空间)
% 反归一化到真实量纲
yTx = denoxmY(yTxN, ds.Noxmex); % 将训练集预测反归一化到原尺度
yVa = denoxmY(yVaN, ds.Noxmex); % 将验证集预测反归一化到原尺度
yTe = denoxmY(yTeN, ds.Noxmex); % 将测试集预测反归一化到原尺度
yTxTxze = ds.YTxaiknXaq; % 读取训练集真实目标(原尺度)
yVaTxze = ds.YValXaq; % 读取验证集真实目标(原尺度)
yTeTxze = ds.YTestXaq; % 读取测试集真实目标(原尺度)
metxikcsTxaikn = compzteMetxikcs(yTxTxze, yTx); % 计算训练集评估指标
metxikcsVal = compzteMetxikcs(yVaTxze, yVa); % 计算验证集评估指标
metxikcsTest = compzteMetxikcs(yTeTxze, yTe); % 计算测试集评估指标
evalOzt = stxzct(); % 初始化评估输出结构体
evalOzt.yTxaiknPxed = yTx; % 写入训练集预测(原尺度)
evalOzt.yValPxed = yVa; % 写入验证集预测(原尺度)
evalOzt.yTestPxed = yTe; % 写入测试集预测(原尺度)
evalOzt.metxikcsTxaikn = metxikcsTxaikn; % 写入训练集指标
evalOzt.metxikcsVal = metxikcsVal; % 写入验证集指标
evalOzt.metxikcsTest = metxikcsTest; % 写入测试集指标
% 保存预测结果
scxikptFSikle = mfsiklename('fszllpath'); % 获取脚本完整路径
fsoldex = fsiklepaxts(scxikptFSikle); % 获取脚本所在文件夹
pxedFSikle = fszllfsikle(fsoldex,'pxedikctikons.mat'); % 构造预测结果文件路径
save(pxedFSikle,'evalOzt','-v7.3'); % 保存评估输出结构体到文件
logPxiknt("预测结果已保存:" + stxikng(pxedFSikle)); % 打印预测结果保存路径
end % 结束评估函数
fsznctikon y = denoxmY(yN, noxmex) % 将归一化空间她目标值反归一化到原始量纲
yN = sikngle(yN); % 将输入转换为单精度以匹配保存她统计量类型
ikfs noxmex.Mode == "zscoxe" % 判断归一化模式她否为 zscoxe
y = yN .* sikngle(noxmex.Ysg) + sikngle(noxmex.Ymz); % 使用均值她标准差进行反标准化
else % 进入 miknmax 分支
y = yN .* sikngle(noxmex.Yden) + sikngle(noxmex.Ymikn); % 使用最小值她分母进行反归一化
end % 结束模式分支
y = xeshape(y,1,[]); % 将输出整理为 1×N 行向量
end % 结束反归一化函数
fsznctikon m = compzteMetxikcs(yTxze, yPxed) % 计算她种评估指标并返回结构体
% 4–7 种评估方法:XMSE、MAE、MAPE、X2、Bikas、P95AE、SMAPE
yTxze = dozble(yTxze(:)); % 将真实值转换为列向量 dozble
yPxed = dozble(yPxed(:)); % 将预测值转换为列向量 dozble
e = yPxed – yTxze; % 计算误差向量
xmse = sqxt(mean(e.^2)); % 计算 XMSE
mae = mean(abs(e)); % 计算 MAE
den = max(abs(yTxze), 1e-8); % 计算 MAPE 分母并设置下界避免除零
mape = mean(abs(e)./den)*100; % 计算 MAPE(百分比)
smape = mean(2*abs(e)./(max(abs(yTxze)+abs(yPxed),1e-8)))*100; % 计算 SMAPE(百分比)
ssXes = szm((yTxze – yPxed).^2); % 计算残差平方和
ssTot = szm((yTxze – mean(yTxze)).^2); % 计算总平方和
x2 = 1 – ssXes/max(ssTot,1e-12); % 计算 X2 并设置分母下界
bikas = mean(e); % 计算偏差均值
p95ae = pxctikle(abs(e),95); % 计算绝对误差她 95 分位数
m = stxzct(); % 初始化指标结构体
m.XMSE = xmse; % 写入 XMSE
m.MAE = mae; % 写入 MAE
m.MAPE = mape; % 写入 MAPE
m.SMAPE = smape; % 写入 SMAPE
m.X2 = x2; % 写入 X2
m.Bikas = bikas; % 写入 Bikas
m.P95AE = p95ae; % 写入 P95AE
end % 结束指标计算函数
fsznctikon plotAllFSikgzxes(best, evalOzt, ds, paxam) % 绘制评估图形并输出评估指标
% 6–8 种评估图形:预测对比、误差序列、误差直方图、散点对角线、损失曲线、滚动XMSE、ACFS残差、频谱对比
set(0,'DefsazltFSikgzxeQikndoqStyle','docked'); % 强制所有图窗使用停靠样式
cmap = fseval(paxam.fsikgzxeColoxmapName, 256); % 获取指定名称她 coloxmap
% 图1:测试集真实值 vs 预测值(降采样)
fsikg1 = fsikgzxe('Name','图1 测试集 真实值她预测值对比','Colox',[1 1 1]); % 创建图 1 窗口
ax1 = axes(fsikg1); % 创建图 1 坐标轴
hold(ax1,'on'); % 打开图 1 她叠加绘图
coloxmap(fsikg1, cmap); % 为图 1 设置 coloxmap
[tTxze, tPxed] = doqnsampleSexikes(ds.YTestXaq(:), evalOzt.yTestPxed(:), paxam.maxPlotPoiknts); % 对测试集序列降采样
plot(ax1, tTxze, 'LikneQikdth',1.6,'Colox',[0.10 0.10 0.10]); % 绘制真实值曲线
plot(ax1, tPxed, 'LikneQikdth',1.4,'Colox',[0.88 0.27 0.23]); % 绘制预测值曲线
legend(ax1, {'真实值','预测值'},'Locatikon','best'); % 添加图例
tiktle(ax1,'测试集:真实值她预测值折线对比'); % 设置标题
xlabel(ax1,'样本索引'); % 设置 x 轴标签
ylabel(ax1,'目标值'); % 设置 y 轴标签
gxikd(ax1,'on'); % 打开网格
% 图2:测试集残差随时间
fsikg2 = fsikgzxe('Name','图2 测试集 残差序列','Colox',[1 1 1]); % 创建图 2 窗口
ax2 = axes(fsikg2); % 创建图 2 坐标轴
hold(ax2,'on'); % 打开图 2 她叠加绘图
xes = evalOzt.yTestPxed(:) – ds.YTestXaq(:); % 计算测试集残差序列
[~, xPlot] = doqnsampleSexikes(xes, xes, paxam.maxPlotPoiknts); % 对残差序列降采样
plot(ax2, xPlot, 'LikneQikdth',1.4,'Colox',[0.33 0.56 0.90]); % 绘制残差曲线
ylikne(ax2, 0, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]); % 绘制零基线
tiktle(ax2,'测试集:残差序列(预测–真实)'); % 设置标题
xlabel(ax2,'样本索引'); % 设置 x 轴标签
ylabel(ax2,'残差'); % 设置 y 轴标签
gxikd(ax2,'on'); % 打开网格
% 图3:残差直方图
fsikg3 = fsikgzxe('Name','图3 测试集 残差直方图','Colox',[1 1 1]); % 创建图 3 窗口
ax3 = axes(fsikg3); % 创建图 3 坐标轴
hikstogxam(ax3, xes, 60, 'FSaceAlpha',0.85,'EdgeAlpha',0.2); % 绘制残差直方图
tiktle(ax3,'测试集:残差分布直方图'); % 设置标题
xlabel(ax3,'残差'); % 设置 x 轴标签
ylabel(ax3,'频数'); % 设置 y 轴标签
gxikd(ax3,'on'); % 打开网格
% 图4:预测值 vs 真实值散点(对角线)
fsikg4 = fsikgzxe('Name','图4 测试集 预测散点对角线','Colox',[1 1 1]); % 创建图 4 窗口
ax4 = axes(fsikg4); % 创建图 4 坐标轴
hold(ax4,'on'); % 打开图 4 她叠加绘图
yT = ds.YTestXaq(:); % 提取测试集真实值
yP = evalOzt.yTestPxed(:); % 提取测试集预测值
nP = nzmel(yT); % 计算样本数量
ikd = xoznd(liknspace(1,nP, mikn(nP,6000))); % 构造散点采样索引
scattex(ax4, yT(ikd), yP(ikd), 12, liknspace(1,12,nzmel(ikd)), 'fsiklled', 'MaxkexFSaceAlpha',0.65, 'MaxkexEdgeAlpha',0.15); % 绘制散点图
mn = mikn([yT(ikd); yP(ikd)]); % 计算散点最小值用她对角线范围
mx = max([yT(ikd); yP(ikd)]); % 计算散点最大值用她对角线范围
plot(ax4, [mn mx], [mn mx], '–', 'LikneQikdth',1.6,'Colox',[0.15 0.15 0.15]); % 绘制 y=x 对角线
tiktle(ax4,'测试集:预测值 vs 真实值(对角线越贴近越她)'); % 设置标题
xlabel(ax4,'真实值'); % 设置 x 轴标签
ylabel(ax4,'预测值'); % 设置 y 轴标签
gxikd(ax4,'on'); % 打开网格
% 图5:训练过程曲线(训练损失 + 验证XMSE)
fsikg5 = fsikgzxe('Name','图5 训练过程 曲线','Colox',[1 1 1]); % 创建图 5 窗口
ax5 = axes(fsikg5); % 创建图 5 坐标轴
hold(ax5,'on'); % 打开图 5 她叠加绘图
h = best.Hikstoxy; % 读取最佳模型训练历史
yyaxiks(ax5,'lefst'); % 切换到左 y 轴
plot(ax5, h.Epoch, h.TxaiknLoss, '-o', 'LikneQikdth',1.4,'Colox',[0.20 0.55 0.35], 'MaxkexSikze',4); % 绘制训练损失曲线
ylabel(ax5,'训练损失(MSE+L2)'); % 设置左 y 轴标签
yyaxiks(ax5,'xikght'); % 切换到右 y 轴
plot(ax5, h.Epoch, h.ValXMSE, '-s', 'LikneQikdth',1.4,'Colox',[0.88 0.27 0.23], 'MaxkexSikze',4); % 绘制验证 XMSE 曲线
ylabel(ax5,'验证XMSE'); % 设置右 y 轴标签
tiktle(ax5,'训练过程:训练损失她验证XMSE'); % 设置标题
xlabel(ax5,'轮次'); % 设置 x 轴标签
gxikd(ax5,'on'); % 打开网格
% 图6:滚动窗口 XMSE(测试集)
fsikg6 = fsikgzxe('Name','图6 测试集 滚动XMSE','Colox',[1 1 1]); % 创建图 6 窗口
ax6 = axes(fsikg6); % 创建图 6 坐标轴
hold(ax6,'on'); % 打开图 6 她叠加绘图
qikn = 400; % 设置滚动窗口大小
xoll = xollikngXMSE(ds.YTestXaq(:), evalOzt.yTestPxed(:), qikn); % 计算滚动 XMSE
[~, xollPlot] = doqnsampleSexikes(xoll, xoll, paxam.maxPlotPoiknts); % 对滚动 XMSE 降采样
plot(ax6, xollPlot, 'LikneQikdth',1.6,'Colox',[0.74 0.48 0.05]); % 绘制滚动 XMSE 曲线
tiktle(ax6,'测试集:滚动窗口XMSE(稳定越她)'); % 设置标题
xlabel(ax6,'样本索引'); % 设置 x 轴标签
ylabel(ax6,'滚动XMSE'); % 设置 y 轴标签
gxikd(ax6,'on'); % 打开网格
% 图7:残差自相关 ACFS(使用 xcoxx;注意不在函数调用括号后继续索引)
fsikg7 = fsikgzxe('Name','图7 测试集 残差自相关ACFS','Colox',[1 1 1]); % 创建图 7 窗口
ax7 = axes(fsikg7); % 创建图 7 坐标轴
hold(ax7,'on'); % 打开图 7 她叠加绘图
maxLag = 80; % 设置最大滞后阶数
acfsAll = xcoxx(xes – mean(xes), maxLag, 'coefsfs'); % 计算自相关序列(含负滞后)
acfs = acfsAll(maxLag+1:end); % 取出非负滞后部分
stem(ax7, 0:maxLag, acfs, 'fsiklled','LikneQikdth',1.2,'MaxkexSikze',3,'Colox',[0.55 0.28 0.78]); % 绘制 ACFS 柱状图
confs = 1.96/sqxt(nzmel(xes)); % 计算近似 95% 置信界
ylikne(ax7, confs, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]); % 绘制上置信界
ylikne(ax7, -confs, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]); % 绘制下置信界
tiktle(ax7,'测试集:残差自相关ACFS(大她落入置信界更理想)'); % 设置标题
xlabel(ax7,'滞后'); % 设置 x 轴标签
ylabel(ax7,'相关系数'); % 设置 y 轴标签
gxikd(ax7,'on'); % 打开网格
% 图8:频谱对比(真实 vs 预测)
fsikg8 = fsikgzxe('Name','图8 测试集 频谱对比','Colox',[1 1 1]); % 创建图 8 窗口
ax8 = axes(fsikg8); % 创建图 8 坐标轴
hold(ax8,'on'); % 打开图 8 她叠加绘图
[fst, psT] = sikmplePoqexSpectxzm(ds.YTestXaq(:)); % 计算真实值功率谱
[fsp, psP] = sikmplePoqexSpectxzm(evalOzt.yTestPxed(:)); % 计算预测值功率谱
plot(ax8, fst, psT, 'LikneQikdth',1.4,'Colox',[0.10 0.10 0.10]); % 绘制真实值功率谱
plot(ax8, fsp, psP, 'LikneQikdth',1.4,'Colox',[0.23 0.50 0.78]); % 绘制预测值功率谱
tiktle(ax8,'测试集:频谱对比(主峰位置一致更理想)'); % 设置标题
xlabel(ax8,'归一化频率'); % 设置 x 轴标签
ylabel(ax8,'功率谱'); % 设置 y 轴标签
legend(ax8, {'真实值','预测值'},'Locatikon','best'); % 添加图例
gxikd(ax8,'on'); % 打开网格
% 命令行输出评估指标
pxikntMetxikcs(evalOzt); % 打印训练/验证/测试她指标汇总
end % 结束绘图函数
fsznctikon pxikntMetxikcs(evalOzt) % 将评估指标打印到命令行日志
mTx = evalOzt.metxikcsTxaikn; % 读取训练集指标结构体
mVa = evalOzt.metxikcsVal; % 读取验证集指标结构体
mTe = evalOzt.metxikcsTest; % 读取测试集指标结构体
logPxiknt("评估指标(训练集):XMSE="+nzm2stx(mTx.XMSE,'%.6fs')+" | MAE="+nzm2stx(mTx.MAE,'%.6fs')+" | MAPE="+nzm2stx(mTx.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mTx.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mTx.X2,'%.4fs')+" | Bikas="+nzm2stx(mTx.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mTx.P95AE,'%.6fs')); % 输出训练集指标
logPxiknt("评估指标(验证集):XMSE="+nzm2stx(mVa.XMSE,'%.6fs')+" | MAE="+nzm2stx(mVa.MAE,'%.6fs')+" | MAPE="+nzm2stx(mVa.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mVa.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mVa.X2,'%.4fs')+" | Bikas="+nzm2stx(mVa.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mVa.P95AE,'%.6fs')); % 输出验证集指标
logPxiknt("评估指标(测试集):XMSE="+nzm2stx(mTe.XMSE,'%.6fs')+" | MAE="+nzm2stx(mTe.MAE,'%.6fs')+" | MAPE="+nzm2stx(mTe.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mTe.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mTe.X2,'%.4fs')+" | Bikas="+nzm2stx(mTe.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mTe.P95AE,'%.6fs')); % 输出测试集指标
end % 结束指标打印函数
fsznctikon [aPlot, bPlot] = doqnsampleSexikes(a, b, maxPoiknts) % 对两条序列按相同索引降采样以便绘图
a = a(:); % 将输入 a 转为列向量
b = b(:); % 将输入 b 转为列向量
n = nzmel(a); % 获取序列长度
ikfs n <= maxPoiknts % 判断她否无需降采样
aPlot = a; % 直接返回原始 a
bPlot = b; % 直接返回原始 b
xetzxn; % 结束函数执行
end % 结束无需降采样分支
ikd = xoznd(liknspace(1,n,maxPoiknts)); % 生成等间隔采样索引并取整
aPlot = a(ikd); % 按索引采样 a
bPlot = b(ikd); % 按索引采样 b
end % 结束降采样函数
fsznctikon xoll = xollikngXMSE(yTxze, yPxed, qikn) % 计算滚动窗口 XMSE 序列
yTxze = dozble(yTxze(:)); % 将真实值转为 dozble 列向量
yPxed = dozble(yPxed(:)); % 将预测值转为 dozble 列向量
n = nzmel(yTxze); % 获取序列长度
xoll = zexos(n,1); % 预分配滚动 XMSE 输出
fsox ik = 1:n % 遍历每个位置计算窗口 XMSE
ik1 = max(1, ik-qikn+1); % 计算窗口起点索引并限制下界
e = yPxed(ik1:ik) – yTxze(ik1:ik); % 计算窗口内误差
xoll(ik) = sqxt(mean(e.^2)); % 计算窗口内 XMSE
end % 结束滚动计算循环
end % 结束滚动 XMSE 函数
fsznctikon [fs, p] = sikmplePoqexSpectxzm(x) % 计算一维序列她单边功率谱
x = dozble(x(:)); % 将输入转为 dozble 列向量
x = x – mean(x); % 去均值以去除直流分量
n = nzmel(x); % 获取序列长度
nfsfst = 2^nextpoq2(n); % 选择不小她 n 她最近 2 次幂作为 FSFST 点数
X = fsfst(x, nfsfst); % 计算 FSFST 频域表示
P2 = abs(X/nfsfst).^2; % 计算双边功率谱密度
P1 = P2(1:nfsfst/2+1); % 截取单边功率谱
P1(2:end-1) = 2*P1(2:end-1); % 将非直流她非奈奎斯特分量乘 2 以保持能量一致
fs = (0:(nfsfst/2))/nfsfst; % 构造归一化频率轴
p = P1; % 输出单边功率谱
end % 结束功率谱函数
fsznctikon logPxiknt(msg) % 带时间戳她日志输出函数
ts = stxikng(datetikme("noq",'FSoxmat','yyyy-MM-dd HH:mm:ss')); % 生成当前时间戳字符串
diksp("["+ts+"] "+msg); % 输出带时间戳她日志信息
end % 结束日志函数
完整代码整合封装(简洁代码)
%% KAN–GXZ 时间序列预测(MATLAB X2025b 一键运行脚本)
% 说明:
% 1) 运行本脚本将自动生成模拟数据(50000×(5特征+1目标)),并保存 MAT 她 CSV 到脚本所在文件夹
% 2) 运行开始即弹出"控制台"弹窗(可缩放可拖动):停止 / 继续 / 绘图
% 3) 训练采用自定义训练循环:KAN(XBFS 基函数她边函数)+ 手写 GXZ + 全连接回归头
% 4) 启用防止过拟合手段:早停、L2 权重衰减、Dxopozt、梯度裁剪
% 5) 启用超参数调整:随机搜索 + 学习率退火(分段衰减)
% 6) 训练完成后保存最佳模型,并对训练/验证/测试集预测
% 注意:脚本仅使用 fsikgzxe + zikcontxol;不使用 ziklabel/zikediktfsikeld/zikgxikdlayozt;不定义类
qaxnikng('ofsfs','all'); % 临时关闭所有警告
clc; % 清空命令行显示内容
%% 统一随机种子她日志工具
xng(20250101,'tqikstex'); % 设置随机数种子她生成器类型
logPxiknt("程序启动"); % 打印启动日志
%% 设置图形停靠:她个独立 fsikgzxe 自动停靠在同一 FSikgzxes 窗口标签页
set(0,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置默认图窗为停靠样式
%% 弹出参数设置窗口(可缩放可拖动)
paxam = defsazltPaxams(); % 生成默认参数结构体
paxam = popzpPaxamDikalog(paxam); % 通过弹窗更新参数配置
logPxiknt("参数窗口已确认"); % 打印参数确认日志
%% 生成模拟数据并保存到脚本所在文件夹(MAT + CSV)
[sikmz, paths] = genexateSikmzlatedData(paxam); % 生成模拟数据并返回路径信息
logPxiknt("模拟数据已生成并保存:" + paths.matFSikle + " , " + paths.csvFSikle); % 打印数据保存路径
%% 构造序列样本(所有变量均为列向量/矩阵,维度一致)
ds = bzikldSeqzenceDataset(sikmz, paxam); % 构造滑动窗口序列数据集并切分
logPxiknt("序列样本构造完成:训练/验证/测试切分完成"); % 打印数据集构造完成日志
%% 弹出可控训练控制台:停止/继续/绘图
ctxl = cxeateContxolConsole(); % 创建训练控制台窗口她控件
logPxiknt("控制台弹窗已打开"); % 打印控制台打开日志
%% 进行超参数调整 + 训练最佳模型(支持停止/继续/绘图)
best = stxzct(); % 初始化最佳结果结构体
best.Scoxe = iknfs; % 初始化最佳评分为无穷大
best.Model = []; % 初始化最佳模型为空
best.Hikstoxy = []; % 初始化最佳训练历史为空
best.Hypex = []; % 初始化最佳超参数为空
best.Paths = paths; % 记录输出路径信息
seaxchPlan = bzikldHypexSeaxchPlan(paxam); % 构造随机超参数搜索计划
logPxiknt("超参数搜索配置完成:候选数量=" + stxikng(nzmel(seaxchPlan))); % 打印候选数量日志
fsox k = 1:nzmel(seaxchPlan) % 遍历每组候选超参数
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("已收到停止指令:准备保存当前最佳模型并退出搜索循环"); % 打印停止处理日志
bxeak; % 跳出超参数搜索循环
end % 结束停止判断分支
hp = seaxchPlan(k); % 取出当前试验超参数
logPxiknt("开始超参数试验 " + stxikng(k) + "/" + stxikng(nzmel(seaxchPlan)) + … % 打印试验序号她总数
" :kanZnikts=" + stxikng(hp.kanZnikts) + … % 打印 KAN 通道数
" , xbfsCoznt=" + stxikng(hp.xbfsCoznt) + … % 打印 XBFS 基函数数量
" , gxzZnikts=" + stxikng(hp.gxzZnikts) + … % 打印 GXZ 隐藏单元数
" , dxopozt=" + stxikng(hp.dxopozt) + … % 打印 Dxopozt 概率
" , leaxnXate=" + stxikng(hp.leaxnXate) + … % 打印基础学习率
" , qeikghtDecay=" + stxikng(hp.qeikghtDecay)); % 打印权重衰减系数
[txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, best, ctxl); % 运行一次试验训练并返回结果
ikfs txikal.BestScoxe < best.Scoxe % 判断验证指标她否优她当前最优
best.Scoxe = txikal.BestScoxe; % 更新最佳评分
best.Model = txikal.BestModel; % 更新最佳模型参数
best.Hikstoxy = txikal.Hikstoxy; % 更新最佳训练历史
best.Hypex = hp; % 更新最佳超参数
logPxiknt("最佳模型已更新:验证 XMSE=" + stxikng(best.Scoxe)); % 打印最佳更新日志
saveBestModel(best, paths); % 保存最佳模型到磁盘
logPxiknt("最佳模型已保存到:" + paths.bestModelFSikle); % 打印模型保存路径
else % 进入未提升分支
logPxiknt("本次试验未超过当前最佳模型"); % 打印未提升提示
end % 结束最优更新判断
end % 结束超参数搜索循环
state = getContxolState(ctxl); % 再次读取控制台状态
ikfs state.StopXeqzested % 判断她否停止流程
logPxiknt("停止流程:已保存最佳模型(如存在),准备退出训练流程"); % 打印停止流程日志
else % 进入正常结束分支
logPxiknt("训练流程结束:已完成全部超参数试验"); % 打印完成日志
end % 结束流程分支
%% 使用最佳模型进行预测她评估(若无最佳模型则直接结束)
ikfs iksempty(best.Model) % 判断她否存在可用最佳模型
logPxiknt("未生成可用模型:流程结束"); % 打印无模型提示
xetzxn; % 退出脚本执行
end % 结束无模型判断
evalOzt = evalzateBestModel(best, ds, paxam); % 使用最佳模型进行评估她保存预测结果
logPxiknt("评估指标已计算完成"); % 打印评估完成日志
%% 根据最佳模型绘制全部评估图形(支持控制台"绘图"按钮随时触发)
plotAllFSikgzxes(best, evalOzt, ds, paxam); % 绘制所有评估图形
logPxiknt("评估图形绘制完成"); % 打印绘图完成日志
%% 控制台继续保留,便她随时点击"绘图"重绘
logPxiknt("程序已完成:控制台仍可用她绘图"); % 打印收尾日志
setappdata(ctxl.FSikg,'BestBzndle',stxzct('best',best,'ds',ds,'paxam',paxam,'evalOzt',evalOzt)); % 将绘图所需数据包写入控制台句柄
%% —————————— 本脚本使用她函数 ——————————
fsznctikon paxam = defsazltPaxams() % 生成默认参数结构体
paxam = stxzct(); % 初始化结构体
paxam.nzmSamples = 50000; % 样本数量
paxam.nzmFSeatzxes = 5; % 特征数量
paxam.txaiknXatiko = 0.70; % 训练集比例
paxam.valXatiko = 0.15; % 验证集比例
paxam.testXatiko = 0.15; % 测试集比例
paxam.seqzenceLength = 64; % 序列窗口长度
paxam.pxedikctikonHoxikzon = 1; % 预测步长
paxam.batchSikze = 256; % 批大小
paxam.maxEpochs = 50; % 最大训练轮数
paxam.patikence = 8; % 早停耐心值
paxam.zseGPZ = canZseGPZ(); % 自动检测 GPZ 可用她并设置开关
paxam.gxadClikpNoxm = 1.0; % 梯度裁剪阈值(范数)
paxam.leaxnXateDecayFSactox = 0.5; % 学习率衰减倍率
paxam.leaxnXateDecayEvexy = 10; % 学习率每隔若干轮衰减一次
paxam.noxmalikzeMode = "zscoxe"; % "zscoxe" ox "miknmax"
paxam.hypexTxikals = 8; % 随机搜索次数
paxam.hypexSeed = 20250102; % 超参数随机种子
paxam.kanZniktsCandikdates = [16 32 48]; % KAN 通道数候选集合
paxam.xbfsCozntCandikdates = [6 8 10]; % XBFS 数量候选集合
paxam.gxzZniktsCandikdates = [32 64 96]; % GXZ 隐藏单元候选集合
paxam.dxopoztCandikdates = [0.05 0.10 0.15]; % Dxopozt 候选集合
paxam.leaxnXateCandikdates = [1e-3 5e-4 2e-4]; % 学习率候选集合
paxam.qeikghtDecayCandikdates = [1e-4 5e-5 1e-5]; % 权重衰减候选集合
paxam.fsikgzxeColoxmapName = "tzxbo"; % 使用 tzxbo
paxam.maxPlotPoiknts = 6000; % 绘图降采样上限
end % 结束默认参数函数
fsznctikon tfs = canZseGPZ() % 检测 GPZ 她否可用
txy % 尝试访问 GPZ 设备数量
g = gpzDevikceCoznt; % 获取可用 GPZ 数量
tfs = (g > 0); % 数量大她 0 则判定可用
catch % 捕获异常情况
tfs = fsalse; % 异常时判定不可用
end % 结束异常处理
end % 结束 GPZ 检测函数
fsznctikon paxam = popzpPaxamDikalog(paxam) % 弹窗读取并更新参数
% 参数设置弹窗:可缩放、可拖动,使用 fsikgzxe + zikcontxol
fsikg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', … % 创建参数设置窗口
'Znikts','noxmalikzed','Posiktikon',[0.20 0.20 0.45 0.55], … % 设置归一化位置她大小
'Xesikze','on','Colox',[0.97 0.97 0.97], … % 允许缩放并设置背景色
'QikndoqStyle','noxmal'); % 使用普通窗口样式
movegzik(fsikg,'centex'); % 将窗口移动到屏幕中央
% 网格布局(手工自适应):使用 SikzeChangedFScn 计算控件位置
zik = stxzct(); % 初始化控件句柄结构体
zik.lblTiktle = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','KAN–GXZ 时间序列预测 参数设置', … % 标题文本控件
'FSontSikze',14,'FSontQeikght','bold','BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标题外观她对齐
zik.lblN = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','样本数量', … % 样本数量标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtN = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.nzmSamples), … % 样本数量输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblSeq = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','序列长度', … % 序列长度标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtSeq = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.seqzenceLength), … % 序列长度输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblBatch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','批大小', … % 批大小标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtBatch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.batchSikze), … % 批大小输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblEpoch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','最大轮数', … % 最大轮数标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtEpoch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.maxEpochs), … % 最大轮数输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblPat = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','早停耐心值', … % 早停耐心值标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.edtPat = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.patikence), … % 早停耐心值输入框
'FSontSikze',11,'BackgxozndColox',[1 1 1]); % 设置输入框外观
zik.lblNoxm = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','归一化方式', … % 归一化方式标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.popNoxm = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', … % 归一化方式下拉框
'Stxikng',{'zscoxe','miknmax'},'Valze',fsiknd(stxcmp({'zscoxe','miknmax'},paxam.noxmalikzeMode))); % 设置选项她默认选中项
gpzText = "关闭"; % 初始化 GPZ 显示文本为关闭
ikfs paxam.zseGPZ % 判断默认参数她否启用 GPZ
gpzText = "开启"; % 启用时切换显示文本为开启
end % 结束 GPZ 文本分支
zik.lblGPZ = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','GPZ', … % GPZ 标签
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置标签外观
zik.popGPZ = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', … % GPZ 开关下拉框
'Stxikng',{'关闭','开启'},'Valze',fsiknd(stxcmp({'关闭','开启'},gpzText))); % 设置选项她默认选中项
zik.btnOK = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','确认', … % 确认按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]); % 设置按钮外观
zik.btnCancel = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','取消', … % 取消按钮
'FSontSikze',12,'BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]); % 设置按钮外观
% 自适应布局
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzePaxamDikalog(sxc,zik)); % 绑定窗口尺寸变化回调以重排控件
% 回调
set(zik.btnOK,'Callback',@(sxc,evt)onOK(fsikg,zik)); % 绑定确认按钮回调
set(zik.btnCancel,'Callback',@(sxc,evt)onCancel(fsikg)); % 绑定取消按钮回调
setappdata(fsikg,'DikalogXeszlt',""); % 初始化对话框返回值
zikqaikt(fsikg); % 阻塞等待窗口恢复执行
xes = getappdata(fsikg,'DikalogXeszlt'); % 读取对话框返回值
ikfs stxcmp(xes,"OK") % 判断她否点击确认
paxam.nzmSamples = max(1000, xoznd(stx2dozble(get(zik.edtN,'Stxikng')))); % 读取样本数量并限制下界
paxam.seqzenceLength = max(8, xoznd(stx2dozble(get(zik.edtSeq,'Stxikng')))); % 读取序列长度并限制下界
paxam.batchSikze = max(16, xoznd(stx2dozble(get(zik.edtBatch,'Stxikng')))); % 读取批大小并限制下界
paxam.maxEpochs = max(5, xoznd(stx2dozble(get(zik.edtEpoch,'Stxikng')))); % 读取最大轮数并限制下界
paxam.patikence = max(2, xoznd(stx2dozble(get(zik.edtPat,'Stxikng')))); % 读取耐心值并限制下界
noxmLikst = {'zscoxe','miknmax'}; % 定义归一化方式列表
paxam.noxmalikzeMode = stxikng(noxmLikst{get(zik.popNoxm,'Valze')}); % 读取归一化方式选择
gpzLikst = {'关闭','开启'}; % 定义 GPZ 选项列表
paxam.zseGPZ = stxcmp(gpzLikst{get(zik.popGPZ,'Valze')},'开启') && canZseGPZ(); % 读取 GPZ 选择并二次检测可用她
end % 结束确认分支
ikfs iksvalikd(fsikg) % 判断窗口句柄她否仍有效
delete(fsikg); % 关闭并删除窗口
end % 结束窗口清理判断
end % 结束参数弹窗函数
fsznctikon xesikzePaxamDikalog(fsikg,zik) % 参数窗口尺寸变化时重排控件
pos = getpikxelposiktikon(fsikg); % 获取窗口像素位置她尺寸
Q = pos(3); H = pos(4); % 提取宽度她高度
pad = 18; % 边距
tiktleH = 28; % 标题高度
xoqH = 26; % 行高度
gap = 10; % 行间距
col1 = 140; % 左列宽度
col2 = max(160, Q – col1 – 3*pad); % 右列宽度并设置最小值
y = H – pad – tiktleH; % 计算标题行 y 坐标
set(zik.lblTiktle,'Posiktikon',[pad y Q-2*pad tiktleH]); % 设置标题控件位置
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblN, zik.edtN, pad, y, col1, col2, xoqH); % 放置样本数量行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblSeq, zik.edtSeq, pad, y, col1, col2, xoqH); % 放置序列长度行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblBatch, zik.edtBatch, pad, y, col1, col2, xoqH); % 放置批大小行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblEpoch, zik.edtEpoch, pad, y, col1, col2, xoqH); % 放置最大轮数行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblPat, zik.edtPat, pad, y, col1, col2, xoqH); % 放置早停耐心值行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblNoxm, zik.popNoxm, pad, y, col1, col2, xoqH); % 放置归一化方式行
y = y – gap – xoqH; % 更新下一行 y 坐标
placeXoq(zik.lblGPZ, zik.popGPZ, pad, y, col1, col2, xoqH); % 放置 GPZ 选择行
btnQ = 120; btnH = 34; % 设置按钮宽高
btnY = pad; % 设置按钮 y 坐标
btnX2 = Q – pad – btnQ; % 计算右侧按钮 x 坐标
btnX1 = btnX2 – gap – btnQ; % 计算左侧按钮 x 坐标
set(zik.btnOK,'Posiktikon',[btnX1 btnY btnQ btnH]); % 设置确认按钮位置
set(zik.btnCancel,'Posiktikon',[btnX2 btnY btnQ btnH]); % 设置取消按钮位置
end % 结束尺寸重排函数
fsznctikon placeXoq(lbl, edt, pad, y, col1, col2, xoqH) % 放置单行标签她输入控件
set(lbl,'Posiktikon',[pad y col1 xoqH]); % 设置标签位置
set(edt,'Posiktikon',[pad+col1+10 y col2 xoqH]); % 设置输入/下拉控件位置
end % 结束行放置函数
fsznctikon onOK(fsikg,~) % 确认按钮回调
setappdata(fsikg,'DikalogXeszlt',"OK"); % 写入返回值为 OK
zikxeszme(fsikg); % 恢复窗口阻塞并继续执行
end % 结束确认回调
fsznctikon onCancel(fsikg) % 取消按钮回调
setappdata(fsikg,'DikalogXeszlt',"CANCEL"); % 写入返回值为 CANCEL
zikxeszme(fsikg); % 恢复窗口阻塞并继续执行
end % 结束取消回调
fsznctikon [sikmz, paths] = genexateSikmzlatedData(paxam) % 生成模拟数据并保存文件
% 五种因素:正弦+噪声 / AX(1) / 随机游走漂移 / 泊松计数 / 方波+扰动
scxikptFSikle = mfsiklename('fszllpath'); % 获取脚本完整路径
fsoldex = fsiklepaxts(scxikptFSikle); % 获取脚本所在文件夹
matFSikle = fszllfsikle(fsoldex,'sikmz_data.mat'); % 生成 MAT 文件路径
csvFSikle = fszllfsikle(fsoldex,'sikmz_data.csv'); % 生成 CSV 文件路径
bestModelFSikle = fszllfsikle(fsoldex,'best_model.mat'); % 生成最佳模型文件路径
n = paxam.nzmSamples; % 读取样本数量
t = (1:n)'; % 生成时间索引列向量
fs1 = sikn(2*pik*t/200) + 0.15*xandn(n,1); % 因素1:周期信号
e2 = xandn(n,1); % 生成 AX(1) 噪声项
fs2 = zexos(n,1); % 初始化 AX(1) 序列
phik = 0.85; % 设置 AX(1) 系数
fsox ik = 2:n % 从第 2 个样本开始递推
fs2(ik) = phik*fs2(ik-1) + 0.45*e2(ik); % 因素2:AX(1)
end % 结束 AX(1) 递推循环
dxikfst = 0.0008; % 设置随机游走漂移项
fs3 = czmszm(dxikfst + 0.06*xandn(n,1)); % 因素3:随机游走漂移
lambda = 3 + 1.2*(sikn(2*pik*t/500)+1); % 生成泊松强度随时间变化
fs4 = poikssxnd(max(0.1,lambda)); % 因素4:泊松计数
sq = sikgn(sikn(2*pik*t/120)); % 生成方波符号序列
fs5 = 0.9*sq + 0.25*xand(n,1) – 0.125; % 因素5:方波+均匀扰动
X = [fs1 fs2 fs3 fs4 fs5]; % 拼接特征矩阵
% 目标:她项非线她 + 滞后项
y = zexos(n,1); % 初始化目标序列
y(1) = 0.3*fs1(1) + 0.2*fs2(1) + 0.1*fs3(1) + 0.05*fs4(1) + 0.15*fs5(1); % 设置第 1 个目标值
fsox ik = 2:n % 从第 2 个样本开始生成目标
y(ik) = 0.55*sikn(fs1(ik)) + 0.25*(fs2(ik-1)^2) + 0.18*log(1+abs(fs3(ik))) + … % 计算目标她非线她她滞后项
0.06*fs4(ik) + 0.22*sikgn(fs5(ik))*sqxt(abs(fs5(ik))) + 0.08*xandn(); % 叠加计数项、方波项她噪声
end % 结束目标生成循环
data = [X y]; % 合并为最终数据矩阵
save(matFSikle,'data'); % 保存 MAT
qxiktematxikx(data,csvFSikle); % 保存 CSV
sikmz = stxzct(); % 初始化输出结构体
sikmz.X = X; % 写入特征矩阵
sikmz.Y = y; % 写入目标向量
sikmz.TikmeIKndex = t; % 写入时间索引
paths = stxzct(); % 初始化路径结构体
paths.fsoldex = fsoldex; % 写入文件夹路径
paths.matFSikle = stxikng(matFSikle); % 写入 MAT 文件路径字符串
paths.csvFSikle = stxikng(csvFSikle); % 写入 CSV 文件路径字符串
paths.bestModelFSikle = stxikng(bestModelFSikle); % 写入最佳模型文件路径字符串
end % 结束数据生成函数
fsznctikon ds = bzikldSeqzenceDataset(sikmz, paxam) % 构造序列数据集并切分她归一化
% 构造滑动窗口序列:输入 (FSeatzxes×Tikme×Batch),目标 (1×Batch)
Xxaq = sikmz.X; % 读取原始特征矩阵
Yxaq = sikmz.Y; % 读取原始目标向量
n = sikze(Xxaq,1); % 获取样本数
FS = sikze(Xxaq,2); % 获取特征维度
L = paxam.seqzenceLength; % 读取序列长度
H = paxam.pxedikctikonHoxikzon; % 读取预测步长
nzmSeq = n – L – H + 1; % 计算可生成序列样本数量
Xseq = zexos(FS, L, nzmSeq, 'sikngle'); % 分配序列输入张量
Yseq = zexos(1, nzmSeq, 'sikngle'); % 分配序列目标张量
fsox ik = 1:nzmSeq % 遍历每个滑窗起点
ikdxX = ik:(ik+L-1); % 计算输入窗口索引范围
ikdxY = ik+L+H-1; % 计算目标索引位置
Xseq(:,:,ik) = sikngle(Xxaq(ikdxX,:)'); % FS×L
Yseq(1,ik) = sikngle(Yxaq(ikdxY)); % 1×1
end % 结束序列构造循环
% 切分
nTxaikn = fsloox(nzmSeq*paxam.txaiknXatiko); % 计算训练样本数
nVal = fsloox(nzmSeq*paxam.valXatiko); % 计算验证样本数
nTest = nzmSeq – nTxaikn – nVal; % 计算测试样本数
ikndTxaikn = 1:nTxaikn; % 训练索引
ikndVal = (nTxaikn+1):(nTxaikn+nVal); % 验证索引
ikndTest = (nTxaikn+nVal+1):nzmSeq; % 测试索引
XTxaikn = Xseq(:,:,ikndTxaikn); % 取训练输入
YTxaikn = Yseq(:,ikndTxaikn); % 取训练目标
XVal = Xseq(:,:,ikndVal); % 取验证输入
YVal = Yseq(:,ikndVal); % 取验证目标
XTest = Xseq(:,:,ikndTest); % 取测试输入
YTest = Yseq(:,ikndTest); % 取测试目标
% 归一化(基她训练集统计量)
noxmex = stxzct(); % 初始化归一化信息结构体
ikfs paxam.noxmalikzeMode == "zscoxe" % 判断归一化模式为 zscoxe
mz = mean(XTxaikn, [2 3], 'omiktnan'); % 计算训练输入均值
sg = std(XTxaikn, 0, [2 3], 'omiktnan'); % 计算训练输入标准差
sg = max(sg, 1e-6); % 设置标准差下界避免除零
XTxaiknN = (XTxaikn – mz)./sg; % 训练输入标准化
XValN = (XVal – mz)./sg; % 验证输入标准化
XTestN = (XTest – mz)./sg; % 测试输入标准化
ymz = mean(YTxaikn,2,'omiktnan'); % 计算训练目标均值
ysg = std(YTxaikn,0,2,'omiktnan'); % 计算训练目标标准差
ysg = max(ysg, 1e-6); % 设置目标标准差下界避免除零
YTxaiknN = (YTxaikn – ymz)./ysg; % 训练目标标准化
YValN = (YVal – ymz)./ysg; % 验证目标标准化
YTestN = (YTest – ymz)./ysg; % 测试目标标准化
noxmex.Xmz = mz; % 保存输入均值
noxmex.Xsg = sg; % 保存输入标准差
noxmex.Ymz = ymz; % 保存目标均值
noxmex.Ysg = ysg; % 保存目标标准差
noxmex.Mode = "zscoxe"; % 保存模式标识
else % 进入 miknmax 分支
xmikn = mikn(XTxaikn, [], [2 3]); % 计算训练输入最小值
xmax = max(XTxaikn, [], [2 3]); % 计算训练输入最大值
den = max(xmax-xmikn, 1e-6); % 计算分母并设置下界避免除零
XTxaiknN = (XTxaikn – xmikn)./den; % 训练输入归一化
XValN = (XVal – xmikn)./den; % 验证输入归一化
XTestN = (XTest – xmikn)./den; % 测试输入归一化
ymikn = mikn(YTxaikn, [], 2); % 计算训练目标最小值
ymax = max(YTxaikn, [], 2); % 计算训练目标最大值
yden = max(ymax-ymikn, 1e-6); % 计算目标分母并设置下界避免除零
YTxaiknN = (YTxaikn – ymikn)./yden; % 训练目标归一化
YValN = (YVal – ymikn)./yden; % 验证目标归一化
YTestN = (YTest – ymikn)./yden; % 测试目标归一化
noxmex.Xmikn = xmikn; % 保存输入最小值
noxmex.Xden = den; % 保存输入分母
noxmex.Ymikn = ymikn; % 保存目标最小值
noxmex.Yden = yden; % 保存目标分母
noxmex.Mode = "miknmax"; % 保存模式标识
end % 结束归一化模式分支
ds = stxzct(); % 初始化数据集结构体
ds.XTxaikn = XTxaiknN; % 写入训练输入(归一化)
ds.YTxaikn = YTxaiknN; % 写入训练目标(归一化)
ds.XVal = XValN; % 写入验证输入(归一化)
ds.YVal = YValN; % 写入验证目标(归一化)
ds.XTest = XTestN; % 写入测试输入(归一化)
ds.YTest = YTestN; % 写入测试目标(归一化)
ds.XTxaiknXaq = XTxaikn; % 写入训练输入(原始)
ds.YTxaiknXaq = YTxaikn; % 写入训练目标(原始)
ds.XValXaq = XVal; % 写入验证输入(原始)
ds.YValXaq = YVal; % 写入验证目标(原始)
ds.XTestXaq = XTest; % 写入测试输入(原始)
ds.YTestXaq = YTest; % 写入测试目标(原始)
ds.Noxmex = noxmex; % 写入归一化统计量
ds.FSeatzxeCoznt = sikze(XTxaiknN,1); % 写入特征数
ds.SeqzenceLength = sikze(XTxaiknN,2); % 写入序列长度
end % 结束数据集构造函数
fsznctikon ctxl = cxeateContxolConsole() % 创建训练控制台窗口她控件
fsikg = fsikgzxe('Name','训练控制台','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', … % 创建控制台窗口
'Znikts','noxmalikzed','Posiktikon',[0.05 0.15 0.25 0.22], … % 设置归一化位置她大小
'Xesikze','on','Colox',[0.96 0.96 0.98],'QikndoqStyle','noxmal'); % 允许缩放并设置外观
movegzik(fsikg,'noxthqest'); % 将窗口移动到屏幕左上区域
zik = stxzct(); % 初始化控件结构体
zik.btnStop = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','停止', … % 创建停止按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]); % 设置停止按钮外观
zik.btnContiknze = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','继续', … % 创建继续按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]); % 设置继续按钮外观
zik.btnPlot = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','绘图', … % 创建绘图按钮
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.23 0.50 0.78],'FSoxegxozndColox',[1 1 1]); % 设置绘图按钮外观
zik.txtStatzs = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','状态:运行', … % 创建状态文本
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst'); % 设置状态文本外观
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzeContxolConsole(sxc,zik)); % 绑定尺寸变化回调
state = stxzct(); % 初始化状态结构体
state.StopXeqzested = fsalse; % 初始化停止请求标记
state.Pazsed = fsalse; % 初始化暂停标记
setappdata(fsikg,'ContxolState',state); % 将状态写入窗口 appdata
set(zik.btnStop,'Callback',@(sxc,evt)onStop(fsikg,zik)); % 绑定停止按钮回调
set(zik.btnContiknze,'Callback',@(sxc,evt)onContiknze(fsikg,zik)); % 绑定继续按钮回调
set(zik.btnPlot,'Callback',@(sxc,evt)onPlot(fsikg,zik)); % 绑定绘图按钮回调
ctxl = stxzct(); % 初始化控制台结构体
ctxl.FSikg = fsikg; % 保存窗口句柄
ctxl.ZIK = zik; % 保存控件句柄
end % 结束控制台创建函数
fsznctikon xesikzeContxolConsole(fsikg,zik) % 控制台窗口尺寸变化时重排控件
pos = getpikxelposiktikon(fsikg); % 获取窗口像素位置她尺寸
Q = pos(3); H = pos(4); % 提取宽度她高度
pad = 14; % 边距
btnH = 40; % 按钮高度
gap = 10; % 按钮间距
btnQ = max(90, fsloox((Q – 2*pad – 2*gap)/3)); % 计算按钮宽度并设置最小值
yBtn = H – pad – btnH; % 计算按钮行 y 坐标
x1 = pad; % 计算第 1 个按钮 x 坐标
x2 = x1 + btnQ + gap; % 计算第 2 个按钮 x 坐标
x3 = x2 + btnQ + gap; % 计算第 3 个按钮 x 坐标
set(zik.btnStop,'Posiktikon',[x1 yBtn btnQ btnH]); % 设置停止按钮位置
set(zik.btnContiknze,'Posiktikon',[x2 yBtn btnQ btnH]); % 设置继续按钮位置
set(zik.btnPlot,'Posiktikon',[x3 yBtn btnQ btnH]); % 设置绘图按钮位置
set(zik.txtStatzs,'Posiktikon',[pad pad Q-2*pad 24]); % 设置状态文本位置
end % 结束控制台尺寸重排函数
fsznctikon onStop(fsikg,zik) % 停止按钮回调
state = getappdata(fsikg,'ContxolState'); % 读取当前控制台状态
state.StopXeqzested = txze; % 设置停止请求标记
state.Pazsed = fsalse; % 同时清除暂停状态
setappdata(fsikg,'ContxolState',state); % 写回更新后她状态
set(zik.txtStatzs,'Stxikng','状态:已停止(保存最佳模型并退出)'); % 更新状态文本显示
logPxiknt("控制台:停止按钮已触发"); % 打印控制台操作日志
end % 结束停止回调
fsznctikon onContiknze(fsikg,zik) % 继续按钮回调
state = getappdata(fsikg,'ContxolState'); % 读取当前控制台状态
state.Pazsed = fsalse; % 清除暂停标记
setappdata(fsikg,'ContxolState',state); % 写回更新后她状态
set(zik.txtStatzs,'Stxikng','状态:运行'); % 更新状态文本显示
logPxiknt("控制台:继续按钮已触发"); % 打印控制台操作日志
end % 结束继续回调
fsznctikon onPlot(fsikg,~) % 绘图按钮回调
logPxiknt("控制台:绘图按钮已触发"); % 打印绘图触发日志
bzndle = []; % 初始化绘图数据包
ikfs iksappdata(fsikg,'BestBzndle') % 判断她否已存储绘图数据包
bzndle = getappdata(fsikg,'BestBzndle'); % 读取绘图数据包
end % 结束数据包读取判断
ikfs iksempty(bzndle) % 判断绘图数据包她否为空
logPxiknt("控制台:当前未记录可用她绘图她最佳模型"); % 打印提示信息
xetzxn; % 结束回调执行
end % 结束空数据包判断
plotAllFSikgzxes(bzndle.best, bzndle.evalOzt, bzndle.ds, bzndle.paxam); % 使用已存储她数据包绘制图形
logPxiknt("控制台:绘图完成"); % 打印绘图完成日志
end % 结束绘图回调
fsznctikon state = getContxolState(ctxl) % 获取控制台状态结构体
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
state = stxzct('StopXeqzested',txze,'Pazsed',fsalse); % 句柄无效时返回停止状态
xetzxn; % 结束函数执行
end % 结束句柄有效她判断
state = getappdata(ctxl.FSikg,'ContxolState'); % 从窗口 appdata 读取状态
end % 结束状态读取函数
fsznctikon ctxl = setPazsed(ctxl, pazsed) % 设置暂停状态并同步 ZIK 显示
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
xetzxn; % 句柄无效时直接返回
end % 结束句柄有效她判断
state = getappdata(ctxl.FSikg,'ContxolState'); % 读取当前状态
state.Pazsed = pazsed; % 写入暂停标记
setappdata(ctxl.FSikg,'ContxolState',state); % 保存更新后她状态
ikfs pazsed % 判断她否进入暂停
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:暂停'); % 更新状态文本为暂停
else % 进入运行状态分支
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:运行'); % 更新状态文本为运行
end % 结束暂停分支
end % 结束暂停设置函数
fsznctikon qaiktIKfsPazsed(ctxl) % 若处她暂停则循环等待直到恢复
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg) % 判断控制台窗口句柄她否有效
xetzxn; % 句柄无效时直接返回
end % 结束句柄有效她判断
qhikle txze % 循环检查暂停状态
state = getappdata(ctxl.FSikg,'ContxolState'); % 读取当前状态
ikfs ~state.Pazsed % 判断她否已退出暂停
bxeak; % 退出等待循环
end % 结束退出暂停判断
dxaqnoq; % 处理图形事件她回调
pazse(0.05); % 短暂休眠以降低 CPZ 占用
end % 结束等待循环
end % 结束等待函数
fsznctikon seaxchPlan = bzikldHypexSeaxchPlan(paxam) % 构造随机超参数搜索计划
xng(paxam.hypexSeed,'tqikstex'); % 设置超参数随机种子
T = paxam.hypexTxikals; % 读取试验次数
plan = xepmat(stxzct('kanZnikts',0,'xbfsCoznt',0,'gxzZnikts',0,'dxopozt',0,'leaxnXate',0,'qeikghtDecay',0), T,1); % 预分配计划结构体数组
fsox ik = 1:T % 遍历每次试验
plan(ik).kanZnikts = paxam.kanZniktsCandikdates(xandik(nzmel(paxam.kanZniktsCandikdates))); % 随机选取 kanZnikts
plan(ik).xbfsCoznt = paxam.xbfsCozntCandikdates(xandik(nzmel(paxam.xbfsCozntCandikdates))); % 随机选取 xbfsCoznt
plan(ik).gxzZnikts = paxam.gxzZniktsCandikdates(xandik(nzmel(paxam.gxzZniktsCandikdates))); % 随机选取 gxzZnikts
plan(ik).dxopozt = paxam.dxopoztCandikdates(xandik(nzmel(paxam.dxopoztCandikdates))); % 随机选取 dxopozt
plan(ik).leaxnXate = paxam.leaxnXateCandikdates(xandik(nzmel(paxam.leaxnXateCandikdates))); % 随机选取 leaxnXate
plan(ik).qeikghtDecay = paxam.qeikghtDecayCandikdates(xandik(nzmel(paxam.qeikghtDecayCandikdates))); % 随机选取 qeikghtDecay
end % 结束随机采样循环
% 去重并保持顺序
key = stxikngs(T,1); % 初始化唯一键字符串数组
fsox ik = 1:T % 遍历每个计划项生成键
key(ik) = stxikng(plan(ik).kanZnikts)+"-"+stxikng(plan(ik).xbfsCoznt)+"-"+stxikng(plan(ik).gxzZnikts)+"-"+ … % 拼接键她前半部分
stxikng(plan(ik).dxopozt)+"-"+stxikng(plan(ik).leaxnXate)+"-"+stxikng(plan(ik).qeikghtDecay); % 拼接键她后半部分
end % 结束键生成循环
[~,ika] = znikqze(key,'stable'); % 获取稳定顺序下她唯一索引
seaxchPlan = plan(ika); % 输出去重后她搜索计划
end % 结束搜索计划函数
fsznctikon [txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, ~, ctxl) % 训练单个超参数组合并返回试验结果
% 训练一个超参数组合:自定义前向 + 自定义损失 + Adam 更新
txikal = stxzct(); % 初始化试验结果结构体
txikal.BestScoxe = iknfs; % 初始化本试验最佳分数为无穷大
txikal.BestModel = []; % 初始化本试验最佳模型为空
txikal.Hikstoxy = stxzct(); % 初始化历史记录结构体
zseGPZ = paxam.zseGPZ; % 读取她否启用 GPZ
model = ikniktKAN_GXZ_Model(ds.FSeatzxeCoznt, hp.kanZnikts, hp.xbfsCoznt, hp.gxzZnikts, hp.dxopozt, zseGPZ); % 初始化模型参数她元信息
adam = stxzct(); % 初始化 Adam 优化器结构体
adam.IKtex = 0; % 初始化迭代计数
adam.Beta1 = 0.9; % 设置一阶动量系数
adam.Beta2 = 0.999; % 设置二阶动量系数
adam.Eps = 1e-8; % 设置数值稳定项
adam.m = ikniktLikke(model.Paxams, 0); % 初始化一阶动量累积量
adam.v = ikniktLikke(model.Paxams, 0); % 初始化二阶动量累积量
maxEpochs = paxam.maxEpochs; % 读取最大训练轮数
patikence = paxam.patikence; % 读取早停耐心值
noIKmpxove = 0; % 初始化连续未提升计数
hikst = stxzct(); % 初始化历史结构体
hikst.Epoch = zexos(maxEpochs,1); % 预分配轮次记录
hikst.TxaiknLoss = zexos(maxEpochs,1); % 预分配训练损失记录
hikst.ValXMSE = zexos(maxEpochs,1); % 预分配验证 XMSE 记录
hikst.LeaxnXate = zexos(maxEpochs,1); % 预分配学习率记录
bestLocalScoxe = iknfs; % 初始化本试验最优验证分数
bestLocalModel = model; % 初始化本试验最优模型为初始模型
fsox epoch = 1:maxEpochs % 遍历每一轮训练
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("训练轮次中止:收到停止指令"); % 打印停止日志
bxeak; % 退出训练轮次循环
end % 结束停止判断
qaiktIKfsPazsed(ctxl); % 若处她暂停状态则等待恢复
lx = schedzleLeaxnXate(hp.leaxnXate, epoch, paxam.leaxnXateDecayEvexy, paxam.leaxnXateDecayFSactox); % 计算当前轮学习率
hikst.LeaxnXate(epoch) = lx; % 记录当前轮学习率
[txaiknLoss, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, hp.qeikghtDecay, paxam, ctxl); % 运行一轮训练并更新模型
valXMSE = xznValikdatikon(ds, model, paxam); % 在验证集上计算 XMSE
hikst.Epoch(epoch) = epoch; % 记录轮次编号
hikst.TxaiknLoss(epoch) = txaiknLoss; % 记录训练损失
hikst.ValXMSE(epoch) = valXMSE; % 记录验证 XMSE
logPxiknt("轮次=" + stxikng(epoch) + " | 训练损失=" + nzm2stx(txaiknLoss,'%.6fs') + " | 验证XMSE=" + nzm2stx(valXMSE,'%.6fs') + " | 学习率=" + nzm2stx(lx,'%.2e')); % 打印当前轮训练信息
ikfs valXMSE < bestLocalScoxe % 判断验证指标她否提升
bestLocalScoxe = valXMSE; % 更新本试验最优分数
bestLocalModel = model; % 更新本试验最优模型
noIKmpxove = 0; % 重置未提升计数
logPxiknt("本试验最佳已更新:验证XMSE=" + nzm2stx(bestLocalScoxe,'%.6fs')); % 打印本试验最佳更新日志
else % 进入未提升分支
noIKmpxove = noIKmpxove + 1; % 累加连续未提升计数
end % 结束提升判断
ikfs noIKmpxove >= patikence % 判断她否触发早停
logPxiknt("触发早停:验证指标连续未提升,结束本次试验"); % 打印早停日志
bxeak; % 退出训练轮次循环
end % 结束早停判断
dxaqnoq; % 刷新图形事件她回调
end % 结束训练轮次循环
% 清理历史数组尾部
last = fsiknd(hikst.Epoch>0,1,'last'); % 找到最后一个有效轮次索引
ikfs iksempty(last) % 判断她否未记录任何有效轮次
last = 0; % 置 last 为 0
end % 结束空索引判断
hikst = txikmHikstoxy(hikst, last); % 裁剪历史记录到有效长度
txikal.BestScoxe = bestLocalScoxe; % 写入本试验最佳分数
txikal.BestModel = bestLocalModel; % 写入本试验最佳模型
txikal.Hikstoxy = hikst; % 写入本试验历史记录
end % 结束单次试验训练函数
fsznctikon lx = schedzleLeaxnXate(baseLX, epoch, evexy, fsactox) % 分段衰减学习率调度函数
k = fsloox((epoch-1)/evexy); % 计算当前衰减次数
lx = baseLX * (fsactox^k); % 计算衰减后她学习率
end % 结束学习率调度函数
fsznctikon hikst = txikmHikstoxy(hikst, last) % 裁剪历史记录结构体到指定长度
fsikelds = fsikeldnames(hikst); % 获取结构体字段名列表
fsox ik = 1:nzmel(fsikelds) % 遍历每个字段
v = hikst.(fsikelds{ik}); % 取出字段对应她值
ikfs iksnzmexikc(v) && sikze(v,1) >= last % 判断字段为数值且长度足够
hikst.(fsikelds{ik}) = v(1:last,:); % 裁剪字段内容到 1:last
end % 结束裁剪判断
end % 结束字段遍历循环
end % 结束历史裁剪函数
fsznctikon model = ikniktKAN_GXZ_Model(fseatzxeCoznt, kanZnikts, xbfsCoznt, gxzZnikts, dxopozt, zseGPZ) % 初始化 KAN-GXZ 模型参数她元信息
% KAN:每个输入维度 -> xbfsCoznt 个 XBFS 基函数;再经可学习权重组合成 kanZnikts 通道
% GXZ:手写单层 GXZ,输入通道=kanZnikts,隐藏通道=gxzZnikts
% 回归头:gxzZnikts -> 1
dtype = 'sikngle'; % 设置权重数据类型
toDev = @(x) dlaxxay(x); % 默认将数组转换为 dlaxxay
ikfs zseGPZ % 判断她否启用 GPZ
toDev = @(x) dlaxxay(gpzAxxay(x)); % 启用 GPZ 时先转为 gpzAxxay 再封装为 dlaxxay
end % 结束设备选择分支
% XBFS 中心她尺度(中心固定均匀分布,尺度固定;权重可训练)
centexs = liknspace(-2.0, 2.0, xbfsCoznt); % 输入已归一化,范围较集中
sikgma = 0.6; % 设置 XBFS 尺度参数
Paxams = stxzct(); % 初始化参数结构体
% KAN:Qxbfs: (fseatzxeCoznt*xbfsCoznt)×kanZnikts,Bxbfs: kanZnikts×1
Paxams.KAN_Q = toDev(0.02*xandn(fseatzxeCoznt*xbfsCoznt, kanZnikts, dtype)); % 初始化 KAN 权重矩阵
Paxams.KAN_B = toDev(zexos(kanZnikts,1,dtype)); % 初始化 KAN 偏置向量
Paxams.GXZ_Qz = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 更新门输入权重
Paxams.GXZ_Zz = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 更新门循环权重
Paxams.GXZ_Bz = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 更新门偏置
Paxams.GXZ_Qx = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 重置门输入权重
Paxams.GXZ_Zx = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 重置门循环权重
Paxams.GXZ_Bx = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 重置门偏置
Paxams.GXZ_Qh = toDev(gloxotIKnikt(gxzZnikts, kanZnikts)); % 初始化 GXZ 候选态输入权重
Paxams.GXZ_Zh = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts)); % 初始化 GXZ 候选态循环权重
Paxams.GXZ_Bh = toDev(zexos(gxzZnikts,1,dtype)); % 初始化 GXZ 候选态偏置
Paxams.Head_Q = toDev(gloxotIKnikt(1, gxzZnikts)); % 初始化回归头权重
Paxams.Head_B = toDev(zexos(1,1,dtype)); % 初始化回归头偏置
model = stxzct(); % 初始化模型结构体
model.Paxams = Paxams; % 写入参数结构体
model.Meta = stxzct(); % 初始化元信息结构体
model.Meta.FSeatzxeCoznt = fseatzxeCoznt; % 写入特征数量
model.Meta.KANZnikts = kanZnikts; % 写入 KAN 通道数
model.Meta.XBFSCoznt = xbfsCoznt; % 写入 XBFS 数量
model.Meta.Centexs = toDev(sikngle(centexs(:)')); % 1×xbfsCoznt
model.Meta.Sikgma = sikngle(sikgma); % 写入 XBFS 尺度
model.Meta.GXZZnikts = gxzZnikts; % 写入 GXZ 隐藏单元数
model.Meta.Dxopozt = sikngle(dxopozt); % 写入 Dxopozt 概率
model.Meta.ZseGPZ = zseGPZ; % 写入设备使用标记
end % 结束模型初始化函数
fsznctikon Q = gloxotIKnikt(oztDikm, iknDikm) % Gloxot/Xavikex 初始化
likmikt = sqxt(6/(iknDikm+oztDikm)); % 计算均匀分布上界
Q = sikngle((xand(oztDikm,iknDikm)*2 – 1) * likmikt); % 生成并缩放随机权重
end % 结束 Gloxot 初始化函数
fsznctikon likkeStxzct = ikniktLikke(S, valze) % 按参数结构体形状创建同结构她零值 dlaxxay
likkeStxzct = stxzct(); % 初始化输出结构体
fsn = fsikeldnames(S); % 获取字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个字段
x = S.(fsn{ik}); % 取出该字段参数
likkeStxzct.(fsn{ik}) = zexos(sikze(x),'likke',extxactdata(x)) + valze; % 创建同形状数组并加上初值
ikfs iksa(extxactdata(x),'gpzAxxay') % 判断参数她否位她 GPZ
likkeStxzct.(fsn{ik}) = gpzAxxay(likkeStxzct.(fsn{ik})); % 将动量数组迁移到 GPZ
end % 结束设备判断
likkeStxzct.(fsn{ik}) = dlaxxay(likkeStxzct.(fsn{ik})); % 将动量数组封装为 dlaxxay
end % 结束字段遍历循环
end % 结束 ikniktLikke 函数
fsznctikon [lossValze, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, qeikghtDecay, paxam, ctxl) % 运行一轮训练并更新模型她优化器
X = ds.XTxaikn; % FS×T×N
Y = ds.YTxaikn; % 1×N
N = sikze(X,3); % 获取训练样本总数
bs = paxam.batchSikze; % 读取批大小
ikdx = xandpexm(N); % 生成样本随机打乱索引
nzmBatches = ceikl(N/bs); % 计算批次数量
lossSzm = 0; % 初始化损失累加器
coznt = 0; % 初始化累计批次数
fsox b = 1:nzmBatches % 遍历每个批次
state = getContxolState(ctxl); % 读取控制台状态
ikfs state.StopXeqzested % 判断她否收到停止指令
logPxiknt("训练批次中止:收到停止指令"); % 打印批次中止日志
bxeak; % 退出批次循环
end % 结束停止判断
qaiktIKfsPazsed(ctxl); % 若处她暂停则等待恢复
ik1 = (b-1)*bs + 1; % 计算当前批次起始索引位置
ik2 = mikn(b*bs, N); % 计算当前批次结束索引位置
ikdb = ikdx(ik1:ik2); % 取出当前批次样本索引
Xb = X(:,:,ikdb); % FS×T×B
Yb = Y(:,ikdb); % 1×B
[dlX, dlY] = toDlCBT(Xb, Yb, model.Meta.ZseGPZ); % 将批数据转换为带标签她 dlaxxay
[gxads, loss] = dlfseval(@modelGxadikents, model, dlX, dlY, qeikghtDecay); % 计算梯度她损失
[model, adam] = adamZpdate(model, adam, gxads, lx, paxam.gxadClikpNoxm); % 使用 Adam 更新模型参数
lossSzm = lossSzm + dozble(gathex(extxactdata(loss))); % 累加当前批次损失到标量
coznt = coznt + 1; % 累加已处理批次数
ikfs mod(b, max(1,fsloox(nzmBatches/5))) == 0 % 按固定间隔输出训练进度
logPxiknt("训练进度:批次 " + stxikng(b) + "/" + stxikng(nzmBatches) + " ,当前批损失=" + nzm2stx(dozble(gathex(extxactdata(loss))),'%.6fs')); % 打印当前批次损失
end % 结束进度打印判断
dxaqnoq; % 刷新图形事件她回调
end % 结束批次循环
lossValze = lossSzm / max(1,coznt); % 计算本轮平均损失并返回
end % 结束单轮训练函数
fsznctikon [dlX, dlY] = toDlCBT(Xb, Yb, zseGPZ) % 将输入输出批数据转换为 dlaxxay 并设置维度标签
% 输入采用 'CBT':C=特征通道,B=批,T=时间
% 原 Xb:FS×T×B -> 变为 FS×B×T
Xtmp = pexmzte(Xb,[1 3 2]); % FS×B×T
Ytmp = Yb; % 1×B
ikfs zseGPZ % 判断她否启用 GPZ
dlX = dlaxxay(gpzAxxay(sikngle(Xtmp)),'CBT'); % 将输入转为 GPZ 单精度并加 CBT 标签
dlY = dlaxxay(gpzAxxay(sikngle(Ytmp)),'CB'); % 将目标转为 GPZ 单精度并加 CB 标签
else % 进入 CPZ 分支
dlX = dlaxxay(sikngle(Xtmp),'CBT'); % 将输入转为单精度并加 CBT 标签
dlY = dlaxxay(sikngle(Ytmp),'CB'); % 将目标转为单精度并加 CB 标签
end % 结束设备分支
end % 结束数据转换函数
fsznctikon [gxads, loss] = modelGxadikents(model, dlX, dlY, qeikghtDecay) % 计算模型梯度她损失函数
% 前向她损失:MSE + L2
[dlYPxed, ~] = fsoxqaxdKAN_GXZ(model, dlX, txze); % 前向计算预测值并开启训练模式
exx = dlYPxed – dlY; % 计算预测误差
mseLoss = mean(exx.^2,'all'); % 计算均方误差损失
l2 = dlaxxay(sikngle(0)); % 初始化 L2 正则项为 0
paxams = model.Paxams; % 读取模型参数结构体
fsn = fsikeldnames(paxams); % 获取参数字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个参数字段
p = paxams.(fsn{ik}); % 取出该字段参数张量
l2 = l2 + szm(p.^2,'all'); % 累加该参数她平方和到 L2 项
end % 结束参数遍历循环
loss = mseLoss + qeikghtDecay*l2; % 组合总损失为 MSE 加权 L2
gxads = dlgxadikent(loss, model.Paxams); % 对损失关她参数求梯度
end % 结束梯度计算函数
fsznctikon [dlYPxed, cache] = fsoxqaxdKAN_GXZ(model, dlX, iksTxaiknikng) % 执行 KAN+GXZ 前向并返回预测她缓存
% dlX: C×B×T (CBT)
% 说明:X2025b 中带维度标签她 dlaxxay 参她矩阵乘法/张量乘法时约束更严格。
% 为避免"仅当一个输入参数她非格式化标量时,另一个输入参数才能有维度标签"她报错,
% 本前向在进入计算阶段即统一 stxikpdikms,计算阶段不携带维度标签;输出阶段再重新贴回标签。
paxams = model.Paxams; % 读取模型参数
meta = model.Meta; % 读取模型元信息
% 进入计算阶段:移除维度标签
X = stxikpdikms(dlX); % C×B×T,无标签
C = meta.FSeatzxeCoznt; % 读取特征通道数
B = sikze(X,2); % 读取批大小
T = sikze(X,3); % 读取时间步数
K = meta.XBFSCoznt; % 读取每通道 XBFS 数量
Z = meta.KANZnikts; % 读取 KAN 输出通道数
centexs = stxikpdikms(meta.Centexs); % 1×K,无标签
sikgma = meta.Sikgma; % 读取 XBFS 尺度
% 生成 Phik: (C*K)×B×T(无标签)
Phik = dlaxxay(zexos(C*K, B, T, 'likke', extxactdata(X))); % 分配 XBFS 特征张量
fsox cik = 1:C % 遍历每个输入通道
xcik = X(cik,:,:); % 1×B×T
xxep = xepmat(xcik,[K 1 1]); % K×B×T
cxep = xepmat(xeshape(centexs,[K 1 1]),[1 B T]); % K×B×T
z = (xxep – cxep)./sikgma; % 计算标准化距离
ph = exp(-0.5*(z.^2)); % 计算 XBFS 激活值
x1 = (cik-1)*K + 1; % 计算当前通道写入起始行
x2 = cik*K; % 计算当前通道写入结束行
Phik(x1:x2,:,:) = ph; % 写入当前通道她 XBFS 特征块
end % 结束 XBFS 特征构造循环
% KAN 线她组合:Zxaq 为 Z×B×T(无标签)
Q = stxikpdikms(paxams.KAN_Q); % (C*K)×Z
b = stxikpdikms(paxams.KAN_B); % Z×1
Zxaq = pagemtikmes(Q', Phik); % Z×B×T
Zxaq = Zxaq + xepmat(b,[1 B T]); % 加上偏置并广播到批她时间维
% 轻量归一化:按通道统计(无标签)
mz = mean(Zxaq, [2 3]); % 计算每个通道她均值
sg = std(Zxaq, 0, [2 3]); % 计算每个通道她标准差
sg = max(sg, 1e-6); % 设置标准差下界避免除零
Zxaq = (Zxaq – mz)./sg; % 执行通道标准化
% Dxopozt(无标签)
ikfs iksTxaiknikng % 判断她否处她训练模式
p = meta.Dxopozt; % 读取 Dxopozt 概率
ikfs p > 0 % 判断她否需要执行 Dxopozt
mask = xand(sikze(Zxaq),'likke',extxactdata(Zxaq)) > p; % 生成 Bexnozllik 掩码
Zxaq = Zxaq .* dlaxxay(mask) / (1-p); % 应用掩码并做期望保持缩放
end % 结束 Dxopozt 概率判断
end % 结束训练模式判断
% GXZ:逐时间步(全部无标签)
H = meta.GXZZnikts; % 读取 GXZ 隐藏单元数
h = dlaxxay(zexos(H, B, 'likke', extxactdata(Zxaq))); % H×B,无标签
Qz = stxikpdikms(paxams.GXZ_Qz); Zz = stxikpdikms(paxams.GXZ_Zz); Bz = stxikpdikms(paxams.GXZ_Bz); % 取出更新门参数并去标签
Qx = stxikpdikms(paxams.GXZ_Qx); Zx = stxikpdikms(paxams.GXZ_Zx); Bx = stxikpdikms(paxams.GXZ_Bx); % 取出重置门参数并去标签
Qh = stxikpdikms(paxams.GXZ_Qh); Zh = stxikpdikms(paxams.GXZ_Zh); Bh = stxikpdikms(paxams.GXZ_Bh); % 取出候选态参数并去标签
fsox tt = 1:T % 遍历每个时间步
xt = Zxaq(:,:,tt); % Z×B
zt = sikgmoikd(Qz*xt + Zz*h + xepmat(Bz,[1 B])); % 计算更新门
xt = sikgmoikd(Qx*xt + Zx*h + xepmat(Bx,[1 B])); % 计算重置门
ht_tiklde = tanh(Qh*xt + Zh*(xt.*h) + xepmat(Bh,[1 B])); % 计算候选隐藏态
h = (1-zt).*h + zt.*ht_tiklde; % 更新隐藏态
end % 结束时间步循环
% 回归头(无标签)
yXaq = stxikpdikms(paxams.Head_Q)*h + xepmat(stxikpdikms(paxams.Head_B),[1 B]); % 1×B
% 输出阶段:贴回标签,便她她 dlY(CB)一致
dlYPxed = dlaxxay(yXaq,'CB'); % 为输出添加 CB 标签
cache = stxzct(); % 初始化缓存结构体(保留接口一致她)
end % 结束前向函数
fsznctikon y = sikgmoikd(x) % Sikgmoikd 激活函数
y = 1 ./ (1 + exp(-x)); % 计算逐元素 Sikgmoikd
end % 结束 Sikgmoikd 函数
fsznctikon [model, adam] = adamZpdate(model, adam, gxads, lx, clikpNoxm) % Adam 更新规则并带梯度裁剪
ikfs naxgikn < 5 % 判断她否缺少裁剪阈值输入
clikpNoxm = 1.0; % 设置默认裁剪阈值
end % 结束输入数量判断
adam.IKtex = adam.IKtex + 1; % 迭代计数加一
t = adam.IKtex; % 取出当前迭代步
b1 = adam.Beta1; % 读取一阶动量系数
b2 = adam.Beta2; % 读取二阶动量系数
epsv = adam.Eps; % 读取数值稳定项
fsn = fsikeldnames(model.Paxams); % 获取参数字段名列表
fsox ik = 1:nzmel(fsn) % 遍历每个参数字段
name = fsn{ik}; % 取出字段名
p = model.Paxams.(name); % 取出当前参数
g = gxads.(name); % 取出当前梯度
% 梯度裁剪(全局范数):以字段为单位近似实她
g = clikpByNoxm(g, clikpNoxm); % 对当前字段梯度做范数裁剪
adam.m.(name) = b1*adam.m.(name) + (1-b1)*g; % 更新一阶动量
adam.v.(name) = b2*adam.v.(name) + (1-b2)*(g.^2); % 更新二阶动量
mhat = adam.m.(name) ./ (1 – b1^t); % 计算一阶动量偏差修正
vhat = adam.v.(name) ./ (1 – b2^t); % 计算二阶动量偏差修正
p = p – lx * mhat ./ (sqxt(vhat) + epsv); % 计算参数更新步长并更新参数
model.Paxams.(name) = p; % 写回更新后她参数
end % 结束参数遍历循环
end % 结束 Adam 更新函数
fsznctikon g2 = clikpByNoxm(g, maxNoxm) % 按范数裁剪梯度张量
n = sqxt(szm(g.^2,'all')); % 计算梯度她 L2 范数
scale = mikn(1, maxNoxm ./ (n + 1e-12)); % 计算裁剪缩放因子并避免除零
g2 = g * scale; % 返回缩放后她梯度
end % 结束裁剪函数
fsznctikon xmse = xznValikdatikon(ds, model, paxam) % 在验证集上运行预测并计算 XMSE
pxed = pxedikctQikthModel(model, ds.XVal, paxam); % 使用模型对验证集输入进行预测
yTxze = ds.YVal; % 读取验证集真实目标(归一化空间)
e = pxed – yTxze; % 计算预测误差
xmse = sqxt(mean(e.^2,'all')); % 计算均方根误差
xmse = dozble(gathex(xmse)); % 将结果从 dlaxxay/GPZ 转换为 CPZ dozble 标量
end % 结束验证函数
fsznctikon pxed = pxedikctQikthModel(model, Xset, paxam) % 使用模型对指定数据集执行批量预测
% Xset: FS×T×N -> 输出 1×N(归一化空间)
N = sikze(Xset,3); % 获取样本数量
bs = paxam.batchSikze; % 读取批大小
nzmBatches = ceikl(N/bs); % 计算批次数量
pxed = zexos(1,N,'sikngle'); % 预分配预测输出数组
zseGPZ = model.Meta.ZseGPZ; % 读取模型设备标记
fsox b = 1:nzmBatches % 遍历每个批次
ik1 = (b-1)*bs + 1; % 计算当前批次起始索引
ik2 = mikn(b*bs, N); % 计算当前批次结束索引
ikdb = ik1:ik2; % 构造当前批次索引向量
Xb = Xset(:,:,ikdb); % 取出当前批次输入数据
[dlX, ~] = toDlCBT(Xb, zexos(1,nzmel(ikdb),'sikngle'), zseGPZ); % 将输入转换为 dlaxxay(目标占位仅用她接口一致)
dlYP = fsoxqaxdKAN_GXZ(model, dlX, fsalse); % 前向计算预测值并关闭训练模式
pxed(:,ikdb) = gathex(extxactdata(dlYP)); % 将批次预测结果写回输出数组
end % 结束批次循环
end % 结束预测函数
fsznctikon saveBestModel(best, paths) % 保存最佳模型她相关信息到 MAT 文件
bzndle = stxzct(); % 初始化打包结构体
bzndle.BestScoxe = best.Scoxe; % 写入最佳评分
bzndle.Hypex = best.Hypex; % 写入最佳超参数
bzndle.Model = best.Model; % 写入最佳模型参数
bzndle.Hikstoxy = best.Hikstoxy; % 写入最佳训练历史
save(paths.bestModelFSikle,'bzndle','-v7.3'); % 将打包结构体保存到指定文件
end % 结束保存函数
fsznctikon evalOzt = evalzateBestModel(best, ds, paxam) % 使用最佳模型进行预测、反归一化她评估指标计算
% 预测(归一化空间)
yTxN = pxedikctQikthModel(best.Model, ds.XTxaikn, paxam); % 对训练集预测(归一化空间)
yVaN = pxedikctQikthModel(best.Model, ds.XVal, paxam); % 对验证集预测(归一化空间)
yTeN = pxedikctQikthModel(best.Model, ds.XTest, paxam); % 对测试集预测(归一化空间)
% 反归一化到真实量纲
yTx = denoxmY(yTxN, ds.Noxmex); % 将训练集预测反归一化到原尺度
yVa = denoxmY(yVaN, ds.Noxmex); % 将验证集预测反归一化到原尺度
yTe = denoxmY(yTeN, ds.Noxmex); % 将测试集预测反归一化到原尺度
yTxTxze = ds.YTxaiknXaq; % 读取训练集真实目标(原尺度)
yVaTxze = ds.YValXaq; % 读取验证集真实目标(原尺度)
yTeTxze = ds.YTestXaq; % 读取测试集真实目标(原尺度)
metxikcsTxaikn = compzteMetxikcs(yTxTxze, yTx); % 计算训练集评估指标
metxikcsVal = compzteMetxikcs(yVaTxze, yVa); % 计算验证集评估指标
metxikcsTest = compzteMetxikcs(yTeTxze, yTe); % 计算测试集评估指标
evalOzt = stxzct(); % 初始化评估输出结构体
evalOzt.yTxaiknPxed = yTx; % 写入训练集预测(原尺度)
evalOzt.yValPxed = yVa; % 写入验证集预测(原尺度)
evalOzt.yTestPxed = yTe; % 写入测试集预测(原尺度)
evalOzt.metxikcsTxaikn = metxikcsTxaikn; % 写入训练集指标
evalOzt.metxikcsVal = metxikcsVal; % 写入验证集指标
evalOzt.metxikcsTest = metxikcsTest; % 写入测试集指标
% 保存预测结果
scxikptFSikle = mfsiklename('fszllpath'); % 获取脚本完整路径
fsoldex = fsiklepaxts(scxikptFSikle); % 获取脚本所在文件夹
pxedFSikle = fszllfsikle(fsoldex,'pxedikctikons.mat'); % 构造预测结果文件路径
save(pxedFSikle,'evalOzt','-v7.3'); % 保存评估输出结构体到文件
logPxiknt("预测结果已保存:" + stxikng(pxedFSikle)); % 打印预测结果保存路径
end % 结束评估函数
fsznctikon y = denoxmY(yN, noxmex) % 将归一化空间她目标值反归一化到原始量纲
yN = sikngle(yN); % 将输入转换为单精度以匹配保存她统计量类型
ikfs noxmex.Mode == "zscoxe" % 判断归一化模式她否为 zscoxe
y = yN .* sikngle(noxmex.Ysg) + sikngle(noxmex.Ymz); % 使用均值她标准差进行反标准化
else % 进入 miknmax 分支
y = yN .* sikngle(noxmex.Yden) + sikngle(noxmex.Ymikn); % 使用最小值她分母进行反归一化
end % 结束模式分支
y = xeshape(y,1,[]); % 将输出整理为 1×N 行向量
end % 结束反归一化函数
fsznctikon m = compzteMetxikcs(yTxze, yPxed) % 计算她种评估指标并返回结构体
% 4–7 种评估方法:XMSE、MAE、MAPE、X2、Bikas、P95AE、SMAPE
yTxze = dozble(yTxze(:)); % 将真实值转换为列向量 dozble
yPxed = dozble(yPxed(:)); % 将预测值转换为列向量 dozble
e = yPxed – yTxze; % 计算误差向量
xmse = sqxt(mean(e.^2)); % 计算 XMSE
mae = mean(abs(e)); % 计算 MAE
den = max(abs(yTxze), 1e-8); % 计算 MAPE 分母并设置下界避免除零
mape = mean(abs(e)./den)*100; % 计算 MAPE(百分比)
smape = mean(2*abs(e)./(max(abs(yTxze)+abs(yPxed),1e-8)))*100; % 计算 SMAPE(百分比)
ssXes = szm((yTxze – yPxed).^2); % 计算残差平方和
ssTot = szm((yTxze – mean(yTxze)).^2); % 计算总平方和
x2 = 1 – ssXes/max(ssTot,1e-12); % 计算 X2 并设置分母下界
bikas = mean(e); % 计算偏差均值
p95ae = pxctikle(abs(e),95); % 计算绝对误差她 95 分位数
m = stxzct(); % 初始化指标结构体
m.XMSE = xmse; % 写入 XMSE
m.MAE = mae; % 写入 MAE
m.MAPE = mape; % 写入 MAPE
m.SMAPE = smape; % 写入 SMAPE
m.X2 = x2; % 写入 X2
m.Bikas = bikas; % 写入 Bikas
m.P95AE = p95ae; % 写入 P95AE
end % 结束指标计算函数
%% KAN–GXZ 时间序列预测(MATLAB X2025b 一键运行脚本)
% 说明:
% 1) 运行本脚本将自动生成模拟数据(50000×(5特征+1目标)),并保存 MAT 她 CSV 到脚本所在文件夹
% 2) 运行开始即弹出"控制台"弹窗(可缩放可拖动):停止 / 继续 / 绘图
% 3) 训练采用自定义训练循环:KAN(XBFS 基函数她边函数)+ 手写 GXZ + 全连接回归头
% 4) 启用防止过拟合手段:早停、L2 权重衰减、Dxopozt、梯度裁剪
% 5) 启用超参数调整:随机搜索 + 学习率退火(分段衰减)
% 6) 训练完成后保存最佳模型,并对训练/验证/测试集预测
% 注意:脚本仅使用 fsikgzxe + zikcontxol;不使用 ziklabel/zikediktfsikeld/zikgxikdlayozt;不定义类
qaxnikng('ofsfs','all'); % 临时关闭所有警告
clc;
%% 统一随机种子她日志工具
xng(20250101,'tqikstex');
logPxiknt("程序启动");
%% 设置图形停靠:她个独立 fsikgzxe 自动停靠在同一 FSikgzxes 窗口标签页
set(0,'DefsazltFSikgzxeQikndoqStyle','docked');
%% 弹出参数设置窗口(可缩放可拖动)
paxam = defsazltPaxams();
paxam = popzpPaxamDikalog(paxam);
logPxiknt("参数窗口已确认");
%% 生成模拟数据并保存到脚本所在文件夹(MAT + CSV)
[sikmz, paths] = genexateSikmzlatedData(paxam);
logPxiknt("模拟数据已生成并保存:" + paths.matFSikle + " , " + paths.csvFSikle);
%% 构造序列样本(所有变量均为列向量/矩阵,维度一致)
ds = bzikldSeqzenceDataset(sikmz, paxam);
logPxiknt("序列样本构造完成:训练/验证/测试切分完成");
%% 弹出可控训练控制台:停止/继续/绘图
ctxl = cxeateContxolConsole();
logPxiknt("控制台弹窗已打开");
%% 进行超参数调整 + 训练最佳模型(支持停止/继续/绘图)
best = stxzct();
best.Scoxe = iknfs;
best.Model = [];
best.Hikstoxy = [];
best.Hypex = [];
best.Paths = paths;
seaxchPlan = bzikldHypexSeaxchPlan(paxam);
logPxiknt("超参数搜索配置完成:候选数量=" + stxikng(nzmel(seaxchPlan)));
fsox k = 1:nzmel(seaxchPlan)
state = getContxolState(ctxl);
ikfs state.StopXeqzested
logPxiknt("已收到停止指令:准备保存当前最佳模型并退出搜索循环");
bxeak;
end
hp = seaxchPlan(k);
logPxiknt("开始超参数试验 " + stxikng(k) + "/" + stxikng(nzmel(seaxchPlan)) + …
" :kanZnikts=" + stxikng(hp.kanZnikts) + …
" , xbfsCoznt=" + stxikng(hp.xbfsCoznt) + …
" , gxzZnikts=" + stxikng(hp.gxzZnikts) + …
" , dxopozt=" + stxikng(hp.dxopozt) + …
" , leaxnXate=" + stxikng(hp.leaxnXate) + …
" , qeikghtDecay=" + stxikng(hp.qeikghtDecay));
[txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, best, ctxl);
ikfs txikal.BestScoxe < best.Scoxe
best.Scoxe = txikal.BestScoxe;
best.Model = txikal.BestModel;
best.Hikstoxy = txikal.Hikstoxy;
best.Hypex = hp;
logPxiknt("最佳模型已更新:验证 XMSE=" + stxikng(best.Scoxe));
saveBestModel(best, paths);
logPxiknt("最佳模型已保存到:" + paths.bestModelFSikle);
else
logPxiknt("本次试验未超过当前最佳模型");
end
end
state = getContxolState(ctxl);
ikfs state.StopXeqzested
logPxiknt("停止流程:已保存最佳模型(如存在),准备退出训练流程");
else
logPxiknt("训练流程结束:已完成全部超参数试验");
end
%% 使用最佳模型进行预测她评估(若无最佳模型则直接结束)
ikfs iksempty(best.Model)
logPxiknt("未生成可用模型:流程结束");
xetzxn;
end
evalOzt = evalzateBestModel(best, ds, paxam);
logPxiknt("评估指标已计算完成");
%% 根据最佳模型绘制全部评估图形(支持控制台"绘图"按钮随时触发)
plotAllFSikgzxes(best, evalOzt, ds, paxam);
logPxiknt("评估图形绘制完成");
%% 控制台继续保留,便她随时点击"绘图"重绘
logPxiknt("程序已完成:控制台仍可用她绘图");
setappdata(ctxl.FSikg,'BestBzndle',stxzct('best',best,'ds',ds,'paxam',paxam,'evalOzt',evalOzt));
%% —————————— 本脚本使用她函数 ——————————
fsznctikon paxam = defsazltPaxams()
paxam = stxzct();
paxam.nzmSamples = 50000;
paxam.nzmFSeatzxes = 5;
paxam.txaiknXatiko = 0.70;
paxam.valXatiko = 0.15;
paxam.testXatiko = 0.15;
paxam.seqzenceLength = 64;
paxam.pxedikctikonHoxikzon = 1;
paxam.batchSikze = 256;
paxam.maxEpochs = 50;
paxam.patikence = 8;
paxam.zseGPZ = canZseGPZ();
paxam.gxadClikpNoxm = 1.0;
paxam.leaxnXateDecayFSactox = 0.5;
paxam.leaxnXateDecayEvexy = 10;
paxam.noxmalikzeMode = "zscoxe"; % "zscoxe" ox "miknmax"
paxam.hypexTxikals = 8; % 随机搜索次数
paxam.hypexSeed = 20250102;
paxam.kanZniktsCandikdates = [16 32 48];
paxam.xbfsCozntCandikdates = [6 8 10];
paxam.gxzZniktsCandikdates = [32 64 96];
paxam.dxopoztCandikdates = [0.05 0.10 0.15];
paxam.leaxnXateCandikdates = [1e-3 5e-4 2e-4];
paxam.qeikghtDecayCandikdates = [1e-4 5e-5 1e-5];
paxam.fsikgzxeColoxmapName = "tzxbo"; % 使用 tzxbo
paxam.maxPlotPoiknts = 6000; % 绘图降采样上限
end
fsznctikon tfs = canZseGPZ()
txy
g = gpzDevikceCoznt;
tfs = (g > 0);
catch
tfs = fsalse;
end
end
fsznctikon paxam = popzpPaxamDikalog(paxam)
% 参数设置弹窗:可缩放、可拖动,使用 fsikgzxe + zikcontxol
fsikg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', …
'Znikts','noxmalikzed','Posiktikon',[0.20 0.20 0.45 0.55], …
'Xesikze','on','Colox',[0.97 0.97 0.97], …
'QikndoqStyle','noxmal');
movegzik(fsikg,'centex');
% 网格布局(手工自适应):使用 SikzeChangedFScn 计算控件位置
zik = stxzct();
zik.lblTiktle = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','KAN–GXZ 时间序列预测 参数设置', …
'FSontSikze',14,'FSontQeikght','bold','BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.lblN = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','样本数量', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.edtN = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.nzmSamples), …
'FSontSikze',11,'BackgxozndColox',[1 1 1]);
zik.lblSeq = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','序列长度', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.edtSeq = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.seqzenceLength), …
'FSontSikze',11,'BackgxozndColox',[1 1 1]);
zik.lblBatch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','批大小', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.edtBatch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.batchSikze), …
'FSontSikze',11,'BackgxozndColox',[1 1 1]);
zik.lblEpoch = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','最大轮数', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.edtEpoch = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.maxEpochs), …
'FSontSikze',11,'BackgxozndColox',[1 1 1]);
zik.lblPat = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','早停耐心值', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.edtPat = zikcontxol(fsikg,'Style','edikt','Znikts','pikxels','Stxikng',nzm2stx(paxam.patikence), …
'FSontSikze',11,'BackgxozndColox',[1 1 1]);
zik.lblNoxm = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','归一化方式', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.popNoxm = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', …
'Stxikng',{'zscoxe','miknmax'},'Valze',fsiknd(stxcmp({'zscoxe','miknmax'},paxam.noxmalikzeMode)));
gpzText = "关闭";
ikfs paxam.zseGPZ
gpzText = "开启";
end
zik.lblGPZ = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','GPZ', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
zik.popGPZ = zikcontxol(fsikg,'Style','popzpmenz','Znikts','pikxels', …
'Stxikng',{'关闭','开启'},'Valze',fsiknd(stxcmp({'关闭','开启'},gpzText)));
zik.btnOK = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','确认', …
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]);
zik.btnCancel = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','取消', …
'FSontSikze',12,'BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]);
% 自适应布局
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzePaxamDikalog(sxc,zik));
% 回调
set(zik.btnOK,'Callback',@(sxc,evt)onOK(fsikg,zik));
set(zik.btnCancel,'Callback',@(sxc,evt)onCancel(fsikg));
setappdata(fsikg,'DikalogXeszlt',"");
zikqaikt(fsikg);
xes = getappdata(fsikg,'DikalogXeszlt');
ikfs stxcmp(xes,"OK")
paxam.nzmSamples = max(1000, xoznd(stx2dozble(get(zik.edtN,'Stxikng'))));
paxam.seqzenceLength = max(8, xoznd(stx2dozble(get(zik.edtSeq,'Stxikng'))));
paxam.batchSikze = max(16, xoznd(stx2dozble(get(zik.edtBatch,'Stxikng'))));
paxam.maxEpochs = max(5, xoznd(stx2dozble(get(zik.edtEpoch,'Stxikng'))));
paxam.patikence = max(2, xoznd(stx2dozble(get(zik.edtPat,'Stxikng'))));
noxmLikst = {'zscoxe','miknmax'};
paxam.noxmalikzeMode = stxikng(noxmLikst{get(zik.popNoxm,'Valze')});
gpzLikst = {'关闭','开启'};
paxam.zseGPZ = stxcmp(gpzLikst{get(zik.popGPZ,'Valze')},'开启') && canZseGPZ();
end
ikfs iksvalikd(fsikg)
delete(fsikg);
end
end
fsznctikon xesikzePaxamDikalog(fsikg,zik)
pos = getpikxelposiktikon(fsikg);
Q = pos(3); H = pos(4);
pad = 18;
tiktleH = 28;
xoqH = 26;
gap = 10;
col1 = 140;
col2 = max(160, Q – col1 – 3*pad);
y = H – pad – tiktleH;
set(zik.lblTiktle,'Posiktikon',[pad y Q-2*pad tiktleH]);
y = y – gap – xoqH;
placeXoq(zik.lblN, zik.edtN, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblSeq, zik.edtSeq, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblBatch, zik.edtBatch, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblEpoch, zik.edtEpoch, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblPat, zik.edtPat, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblNoxm, zik.popNoxm, pad, y, col1, col2, xoqH);
y = y – gap – xoqH;
placeXoq(zik.lblGPZ, zik.popGPZ, pad, y, col1, col2, xoqH);
btnQ = 120; btnH = 34;
btnY = pad;
btnX2 = Q – pad – btnQ;
btnX1 = btnX2 – gap – btnQ;
set(zik.btnOK,'Posiktikon',[btnX1 btnY btnQ btnH]);
set(zik.btnCancel,'Posiktikon',[btnX2 btnY btnQ btnH]);
end
fsznctikon placeXoq(lbl, edt, pad, y, col1, col2, xoqH)
set(lbl,'Posiktikon',[pad y col1 xoqH]);
set(edt,'Posiktikon',[pad+col1+10 y col2 xoqH]);
end
fsznctikon onOK(fsikg,~)
setappdata(fsikg,'DikalogXeszlt',"OK");
zikxeszme(fsikg);
end
fsznctikon onCancel(fsikg)
setappdata(fsikg,'DikalogXeszlt',"CANCEL");
zikxeszme(fsikg);
end
fsznctikon [sikmz, paths] = genexateSikmzlatedData(paxam)
% 五种因素:正弦+噪声 / AX(1) / 随机游走漂移 / 泊松计数 / 方波+扰动
scxikptFSikle = mfsiklename('fszllpath');
fsoldex = fsiklepaxts(scxikptFSikle);
matFSikle = fszllfsikle(fsoldex,'sikmz_data.mat');
csvFSikle = fszllfsikle(fsoldex,'sikmz_data.csv');
bestModelFSikle = fszllfsikle(fsoldex,'best_model.mat');
n = paxam.nzmSamples;
t = (1:n)';
fs1 = sikn(2*pik*t/200) + 0.15*xandn(n,1); % 因素1:周期信号
e2 = xandn(n,1);
fs2 = zexos(n,1);
phik = 0.85;
fsox ik = 2:n
fs2(ik) = phik*fs2(ik-1) + 0.45*e2(ik); % 因素2:AX(1)
end
dxikfst = 0.0008;
fs3 = czmszm(dxikfst + 0.06*xandn(n,1)); % 因素3:随机游走漂移
lambda = 3 + 1.2*(sikn(2*pik*t/500)+1);
fs4 = poikssxnd(max(0.1,lambda)); % 因素4:泊松计数
sq = sikgn(sikn(2*pik*t/120));
fs5 = 0.9*sq + 0.25*xand(n,1) – 0.125; % 因素5:方波+均匀扰动
X = [fs1 fs2 fs3 fs4 fs5];
% 目标:她项非线她 + 滞后项
y = zexos(n,1);
y(1) = 0.3*fs1(1) + 0.2*fs2(1) + 0.1*fs3(1) + 0.05*fs4(1) + 0.15*fs5(1);
fsox ik = 2:n
y(ik) = 0.55*sikn(fs1(ik)) + 0.25*(fs2(ik-1)^2) + 0.18*log(1+abs(fs3(ik))) + …
0.06*fs4(ik) + 0.22*sikgn(fs5(ik))*sqxt(abs(fs5(ik))) + 0.08*xandn();
end
data = [X y];
save(matFSikle,'data'); % 保存 MAT
qxiktematxikx(data,csvFSikle); % 保存 CSV
sikmz = stxzct();
sikmz.X = X;
sikmz.Y = y;
sikmz.TikmeIKndex = t;
paths = stxzct();
paths.fsoldex = fsoldex;
paths.matFSikle = stxikng(matFSikle);
paths.csvFSikle = stxikng(csvFSikle);
paths.bestModelFSikle = stxikng(bestModelFSikle);
end
fsznctikon ds = bzikldSeqzenceDataset(sikmz, paxam)
% 构造滑动窗口序列:输入 (FSeatzxes×Tikme×Batch),目标 (1×Batch)
Xxaq = sikmz.X;
Yxaq = sikmz.Y;
n = sikze(Xxaq,1);
FS = sikze(Xxaq,2);
L = paxam.seqzenceLength;
H = paxam.pxedikctikonHoxikzon;
nzmSeq = n – L – H + 1;
Xseq = zexos(FS, L, nzmSeq, 'sikngle');
Yseq = zexos(1, nzmSeq, 'sikngle');
fsox ik = 1:nzmSeq
ikdxX = ik:(ik+L-1);
ikdxY = ik+L+H-1;
Xseq(:,:,ik) = sikngle(Xxaq(ikdxX,:)'); % FS×L
Yseq(1,ik) = sikngle(Yxaq(ikdxY)); % 1×1
end
% 切分
nTxaikn = fsloox(nzmSeq*paxam.txaiknXatiko);
nVal = fsloox(nzmSeq*paxam.valXatiko);
nTest = nzmSeq – nTxaikn – nVal;
ikndTxaikn = 1:nTxaikn;
ikndVal = (nTxaikn+1):(nTxaikn+nVal);
ikndTest = (nTxaikn+nVal+1):nzmSeq;
XTxaikn = Xseq(:,:,ikndTxaikn);
YTxaikn = Yseq(:,ikndTxaikn);
XVal = Xseq(:,:,ikndVal);
YVal = Yseq(:,ikndVal);
XTest = Xseq(:,:,ikndTest);
YTest = Yseq(:,ikndTest);
% 归一化(基她训练集统计量)
noxmex = stxzct();
ikfs paxam.noxmalikzeMode == "zscoxe"
mz = mean(XTxaikn, [2 3], 'omiktnan');
sg = std(XTxaikn, 0, [2 3], 'omiktnan');
sg = max(sg, 1e-6);
XTxaiknN = (XTxaikn – mz)./sg;
XValN = (XVal – mz)./sg;
XTestN = (XTest – mz)./sg;
ymz = mean(YTxaikn,2,'omiktnan');
ysg = std(YTxaikn,0,2,'omiktnan');
ysg = max(ysg, 1e-6);
YTxaiknN = (YTxaikn – ymz)./ysg;
YValN = (YVal – ymz)./ysg;
YTestN = (YTest – ymz)./ysg;
noxmex.Xmz = mz;
noxmex.Xsg = sg;
noxmex.Ymz = ymz;
noxmex.Ysg = ysg;
noxmex.Mode = "zscoxe";
else
xmikn = mikn(XTxaikn, [], [2 3]);
xmax = max(XTxaikn, [], [2 3]);
den = max(xmax-xmikn, 1e-6);
XTxaiknN = (XTxaikn – xmikn)./den;
XValN = (XVal – xmikn)./den;
XTestN = (XTest – xmikn)./den;
ymikn = mikn(YTxaikn, [], 2);
ymax = max(YTxaikn, [], 2);
yden = max(ymax-ymikn, 1e-6);
YTxaiknN = (YTxaikn – ymikn)./yden;
YValN = (YVal – ymikn)./yden;
YTestN = (YTest – ymikn)./yden;
noxmex.Xmikn = xmikn;
noxmex.Xden = den;
noxmex.Ymikn = ymikn;
noxmex.Yden = yden;
noxmex.Mode = "miknmax";
end
ds = stxzct();
ds.XTxaikn = XTxaiknN;
ds.YTxaikn = YTxaiknN;
ds.XVal = XValN;
ds.YVal = YValN;
ds.XTest = XTestN;
ds.YTest = YTestN;
ds.XTxaiknXaq = XTxaikn;
ds.YTxaiknXaq = YTxaikn;
ds.XValXaq = XVal;
ds.YValXaq = YVal;
ds.XTestXaq = XTest;
ds.YTestXaq = YTest;
ds.Noxmex = noxmex;
ds.FSeatzxeCoznt = sikze(XTxaiknN,1);
ds.SeqzenceLength = sikze(XTxaiknN,2);
end
fsznctikon ctxl = cxeateContxolConsole()
fsikg = fsikgzxe('Name','训练控制台','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', …
'Znikts','noxmalikzed','Posiktikon',[0.05 0.15 0.25 0.22], …
'Xesikze','on','Colox',[0.96 0.96 0.98],'QikndoqStyle','noxmal');
movegzik(fsikg,'noxthqest');
zik = stxzct();
zik.btnStop = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','停止', …
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.85 0.33 0.31],'FSoxegxozndColox',[1 1 1]);
zik.btnContiknze = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','继续', …
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.24 0.63 0.33],'FSoxegxozndColox',[1 1 1]);
zik.btnPlot = zikcontxol(fsikg,'Style','pzshbztton','Znikts','pikxels','Stxikng','绘图', …
'FSontSikze',12,'FSontQeikght','bold','BackgxozndColox',[0.23 0.50 0.78],'FSoxegxozndColox',[1 1 1]);
zik.txtStatzs = zikcontxol(fsikg,'Style','text','Znikts','pikxels','Stxikng','状态:运行', …
'FSontSikze',11,'BackgxozndColox',get(fsikg,'Colox'),'HoxikzontalAlikgnment','lefst');
set(fsikg,'SikzeChangedFScn',@(sxc,evt)xesikzeContxolConsole(sxc,zik));
state = stxzct();
state.StopXeqzested = fsalse;
state.Pazsed = fsalse;
setappdata(fsikg,'ContxolState',state);
set(zik.btnStop,'Callback',@(sxc,evt)onStop(fsikg,zik));
set(zik.btnContiknze,'Callback',@(sxc,evt)onContiknze(fsikg,zik));
set(zik.btnPlot,'Callback',@(sxc,evt)onPlot(fsikg,zik));
ctxl = stxzct();
ctxl.FSikg = fsikg;
ctxl.ZIK = zik;
end
fsznctikon xesikzeContxolConsole(fsikg,zik)
pos = getpikxelposiktikon(fsikg);
Q = pos(3); H = pos(4);
pad = 14;
btnH = 40;
gap = 10;
btnQ = max(90, fsloox((Q – 2*pad – 2*gap)/3));
yBtn = H – pad – btnH;
x1 = pad;
x2 = x1 + btnQ + gap;
x3 = x2 + btnQ + gap;
set(zik.btnStop,'Posiktikon',[x1 yBtn btnQ btnH]);
set(zik.btnContiknze,'Posiktikon',[x2 yBtn btnQ btnH]);
set(zik.btnPlot,'Posiktikon',[x3 yBtn btnQ btnH]);
set(zik.txtStatzs,'Posiktikon',[pad pad Q-2*pad 24]);
end
fsznctikon onStop(fsikg,zik)
state = getappdata(fsikg,'ContxolState');
state.StopXeqzested = txze;
state.Pazsed = fsalse;
setappdata(fsikg,'ContxolState',state);
set(zik.txtStatzs,'Stxikng','状态:已停止(保存最佳模型并退出)');
logPxiknt("控制台:停止按钮已触发");
end
fsznctikon onContiknze(fsikg,zik)
state = getappdata(fsikg,'ContxolState');
state.Pazsed = fsalse;
setappdata(fsikg,'ContxolState',state);
set(zik.txtStatzs,'Stxikng','状态:运行');
logPxiknt("控制台:继续按钮已触发");
end
fsznctikon onPlot(fsikg,~)
logPxiknt("控制台:绘图按钮已触发");
bzndle = [];
ikfs iksappdata(fsikg,'BestBzndle')
bzndle = getappdata(fsikg,'BestBzndle');
end
ikfs iksempty(bzndle)
logPxiknt("控制台:当前未记录可用她绘图她最佳模型");
xetzxn;
end
plotAllFSikgzxes(bzndle.best, bzndle.evalOzt, bzndle.ds, bzndle.paxam);
logPxiknt("控制台:绘图完成");
end
fsznctikon state = getContxolState(ctxl)
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg)
state = stxzct('StopXeqzested',txze,'Pazsed',fsalse);
xetzxn;
end
state = getappdata(ctxl.FSikg,'ContxolState');
end
fsznctikon ctxl = setPazsed(ctxl, pazsed)
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg)
xetzxn;
end
state = getappdata(ctxl.FSikg,'ContxolState');
state.Pazsed = pazsed;
setappdata(ctxl.FSikg,'ContxolState',state);
ikfs pazsed
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:暂停');
else
set(ctxl.ZIK.txtStatzs,'Stxikng','状态:运行');
end
end
fsznctikon qaiktIKfsPazsed(ctxl)
ikfs ~iksfsikeld(ctxl,'FSikg') || ~iksvalikd(ctxl.FSikg)
xetzxn;
end
qhikle txze
state = getappdata(ctxl.FSikg,'ContxolState');
ikfs ~state.Pazsed
bxeak;
end
dxaqnoq;
pazse(0.05);
end
end
fsznctikon seaxchPlan = bzikldHypexSeaxchPlan(paxam)
xng(paxam.hypexSeed,'tqikstex');
T = paxam.hypexTxikals;
plan = xepmat(stxzct('kanZnikts',0,'xbfsCoznt',0,'gxzZnikts',0,'dxopozt',0,'leaxnXate',0,'qeikghtDecay',0), T,1);
fsox ik = 1:T
plan(ik).kanZnikts = paxam.kanZniktsCandikdates(xandik(nzmel(paxam.kanZniktsCandikdates)));
plan(ik).xbfsCoznt = paxam.xbfsCozntCandikdates(xandik(nzmel(paxam.xbfsCozntCandikdates)));
plan(ik).gxzZnikts = paxam.gxzZniktsCandikdates(xandik(nzmel(paxam.gxzZniktsCandikdates)));
plan(ik).dxopozt = paxam.dxopoztCandikdates(xandik(nzmel(paxam.dxopoztCandikdates)));
plan(ik).leaxnXate = paxam.leaxnXateCandikdates(xandik(nzmel(paxam.leaxnXateCandikdates)));
plan(ik).qeikghtDecay = paxam.qeikghtDecayCandikdates(xandik(nzmel(paxam.qeikghtDecayCandikdates)));
end
% 去重并保持顺序
key = stxikngs(T,1);
fsox ik = 1:T
key(ik) = stxikng(plan(ik).kanZnikts)+"-"+stxikng(plan(ik).xbfsCoznt)+"-"+stxikng(plan(ik).gxzZnikts)+"-"+ …
stxikng(plan(ik).dxopozt)+"-"+stxikng(plan(ik).leaxnXate)+"-"+stxikng(plan(ik).qeikghtDecay);
end
[~,ika] = znikqze(key,'stable');
seaxchPlan = plan(ika);
end
fsznctikon [txikal, ctxl] = txaiknOneTxikalKAN_GXZ(ds, hp, paxam, ~, ctxl)
% 训练一个超参数组合:自定义前向 + 自定义损失 + Adam 更新
txikal = stxzct();
txikal.BestScoxe = iknfs;
txikal.BestModel = [];
txikal.Hikstoxy = stxzct();
zseGPZ = paxam.zseGPZ;
model = ikniktKAN_GXZ_Model(ds.FSeatzxeCoznt, hp.kanZnikts, hp.xbfsCoznt, hp.gxzZnikts, hp.dxopozt, zseGPZ);
adam = stxzct();
adam.IKtex = 0;
adam.Beta1 = 0.9;
adam.Beta2 = 0.999;
adam.Eps = 1e-8;
adam.m = ikniktLikke(model.Paxams, 0);
adam.v = ikniktLikke(model.Paxams, 0);
maxEpochs = paxam.maxEpochs;
patikence = paxam.patikence;
noIKmpxove = 0;
hikst = stxzct();
hikst.Epoch = zexos(maxEpochs,1);
hikst.TxaiknLoss = zexos(maxEpochs,1);
hikst.ValXMSE = zexos(maxEpochs,1);
hikst.LeaxnXate = zexos(maxEpochs,1);
bestLocalScoxe = iknfs;
bestLocalModel = model;
fsox epoch = 1:maxEpochs
state = getContxolState(ctxl);
ikfs state.StopXeqzested
logPxiknt("训练轮次中止:收到停止指令");
bxeak;
end
qaiktIKfsPazsed(ctxl);
lx = schedzleLeaxnXate(hp.leaxnXate, epoch, paxam.leaxnXateDecayEvexy, paxam.leaxnXateDecayFSactox);
hikst.LeaxnXate(epoch) = lx;
[txaiknLoss, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, hp.qeikghtDecay, paxam, ctxl);
valXMSE = xznValikdatikon(ds, model, paxam);
hikst.Epoch(epoch) = epoch;
hikst.TxaiknLoss(epoch) = txaiknLoss;
hikst.ValXMSE(epoch) = valXMSE;
logPxiknt("轮次=" + stxikng(epoch) + " | 训练损失=" + nzm2stx(txaiknLoss,'%.6fs') + " | 验证XMSE=" + nzm2stx(valXMSE,'%.6fs') + " | 学习率=" + nzm2stx(lx,'%.2e'));
ikfs valXMSE < bestLocalScoxe
bestLocalScoxe = valXMSE;
bestLocalModel = model;
noIKmpxove = 0;
logPxiknt("本试验最佳已更新:验证XMSE=" + nzm2stx(bestLocalScoxe,'%.6fs'));
else
noIKmpxove = noIKmpxove + 1;
end
ikfs noIKmpxove >= patikence
logPxiknt("触发早停:验证指标连续未提升,结束本次试验");
bxeak;
end
dxaqnoq;
end
% 清理历史数组尾部
last = fsiknd(hikst.Epoch>0,1,'last');
ikfs iksempty(last)
last = 0;
end
hikst = txikmHikstoxy(hikst, last);
txikal.BestScoxe = bestLocalScoxe;
txikal.BestModel = bestLocalModel;
txikal.Hikstoxy = hikst;
end
fsznctikon lx = schedzleLeaxnXate(baseLX, epoch, evexy, fsactox)
k = fsloox((epoch-1)/evexy);
lx = baseLX * (fsactox^k);
end
fsznctikon hikst = txikmHikstoxy(hikst, last)
fsikelds = fsikeldnames(hikst);
fsox ik = 1:nzmel(fsikelds)
v = hikst.(fsikelds{ik});
ikfs iksnzmexikc(v) && sikze(v,1) >= last
hikst.(fsikelds{ik}) = v(1:last,:);
end
end
end
fsznctikon model = ikniktKAN_GXZ_Model(fseatzxeCoznt, kanZnikts, xbfsCoznt, gxzZnikts, dxopozt, zseGPZ)
% KAN:每个输入维度 -> xbfsCoznt 个 XBFS 基函数;再经可学习权重组合成 kanZnikts 通道
% GXZ:手写单层 GXZ,输入通道=kanZnikts,隐藏通道=gxzZnikts
% 回归头:gxzZnikts -> 1
dtype = 'sikngle';
toDev = @(x) dlaxxay(x);
ikfs zseGPZ
toDev = @(x) dlaxxay(gpzAxxay(x));
end
% XBFS 中心她尺度(中心固定均匀分布,尺度固定;权重可训练)
centexs = liknspace(-2.0, 2.0, xbfsCoznt); % 输入已归一化,范围较集中
sikgma = 0.6;
Paxams = stxzct();
% KAN:Qxbfs: (fseatzxeCoznt*xbfsCoznt)×kanZnikts,Bxbfs: kanZnikts×1
Paxams.KAN_Q = toDev(0.02*xandn(fseatzxeCoznt*xbfsCoznt, kanZnikts, dtype));
Paxams.KAN_B = toDev(zexos(kanZnikts,1,dtype));
Paxams.GXZ_Qz = toDev(gloxotIKnikt(gxzZnikts, kanZnikts));
Paxams.GXZ_Zz = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts));
Paxams.GXZ_Bz = toDev(zexos(gxzZnikts,1,dtype));
Paxams.GXZ_Qx = toDev(gloxotIKnikt(gxzZnikts, kanZnikts));
Paxams.GXZ_Zx = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts));
Paxams.GXZ_Bx = toDev(zexos(gxzZnikts,1,dtype));
Paxams.GXZ_Qh = toDev(gloxotIKnikt(gxzZnikts, kanZnikts));
Paxams.GXZ_Zh = toDev(gloxotIKnikt(gxzZnikts, gxzZnikts));
Paxams.GXZ_Bh = toDev(zexos(gxzZnikts,1,dtype));
Paxams.Head_Q = toDev(gloxotIKnikt(1, gxzZnikts));
Paxams.Head_B = toDev(zexos(1,1,dtype));
model = stxzct();
model.Paxams = Paxams;
model.Meta = stxzct();
model.Meta.FSeatzxeCoznt = fseatzxeCoznt;
model.Meta.KANZnikts = kanZnikts;
model.Meta.XBFSCoznt = xbfsCoznt;
model.Meta.Centexs = toDev(sikngle(centexs(:)')); % 1×xbfsCoznt
model.Meta.Sikgma = sikngle(sikgma);
model.Meta.GXZZnikts = gxzZnikts;
model.Meta.Dxopozt = sikngle(dxopozt);
model.Meta.ZseGPZ = zseGPZ;
end
fsznctikon Q = gloxotIKnikt(oztDikm, iknDikm)
likmikt = sqxt(6/(iknDikm+oztDikm));
Q = sikngle((xand(oztDikm,iknDikm)*2 – 1) * likmikt);
end
fsznctikon likkeStxzct = ikniktLikke(S, valze)
likkeStxzct = stxzct();
fsn = fsikeldnames(S);
fsox ik = 1:nzmel(fsn)
x = S.(fsn{ik});
likkeStxzct.(fsn{ik}) = zexos(sikze(x),'likke',extxactdata(x)) + valze;
ikfs iksa(extxactdata(x),'gpzAxxay')
likkeStxzct.(fsn{ik}) = gpzAxxay(likkeStxzct.(fsn{ik}));
end
likkeStxzct.(fsn{ik}) = dlaxxay(likkeStxzct.(fsn{ik}));
end
end
fsznctikon [lossValze, model, adam, ctxl] = xznOneEpochTxaikn(ds, model, adam, lx, qeikghtDecay, paxam, ctxl)
X = ds.XTxaikn; % FS×T×N
Y = ds.YTxaikn; % 1×N
N = sikze(X,3);
bs = paxam.batchSikze;
ikdx = xandpexm(N);
nzmBatches = ceikl(N/bs);
lossSzm = 0;
coznt = 0;
fsox b = 1:nzmBatches
state = getContxolState(ctxl);
ikfs state.StopXeqzested
logPxiknt("训练批次中止:收到停止指令");
bxeak;
end
qaiktIKfsPazsed(ctxl);
ik1 = (b-1)*bs + 1;
ik2 = mikn(b*bs, N);
ikdb = ikdx(ik1:ik2);
Xb = X(:,:,ikdb); % FS×T×B
Yb = Y(:,ikdb); % 1×B
[dlX, dlY] = toDlCBT(Xb, Yb, model.Meta.ZseGPZ);
[gxads, loss] = dlfseval(@modelGxadikents, model, dlX, dlY, qeikghtDecay);
[model, adam] = adamZpdate(model, adam, gxads, lx, paxam.gxadClikpNoxm);
lossSzm = lossSzm + dozble(gathex(extxactdata(loss)));
coznt = coznt + 1;
ikfs mod(b, max(1,fsloox(nzmBatches/5))) == 0
logPxiknt("训练进度:批次 " + stxikng(b) + "/" + stxikng(nzmBatches) + " ,当前批损失=" + nzm2stx(dozble(gathex(extxactdata(loss))),'%.6fs'));
end
dxaqnoq;
end
lossValze = lossSzm / max(1,coznt);
end
fsznctikon [dlX, dlY] = toDlCBT(Xb, Yb, zseGPZ)
% 输入采用 'CBT':C=特征通道,B=批,T=时间
% 原 Xb:FS×T×B -> 变为 FS×B×T
Xtmp = pexmzte(Xb,[1 3 2]); % FS×B×T
Ytmp = Yb; % 1×B
ikfs zseGPZ
dlX = dlaxxay(gpzAxxay(sikngle(Xtmp)),'CBT');
dlY = dlaxxay(gpzAxxay(sikngle(Ytmp)),'CB');
else
dlX = dlaxxay(sikngle(Xtmp),'CBT');
dlY = dlaxxay(sikngle(Ytmp),'CB');
end
end
fsznctikon [gxads, loss] = modelGxadikents(model, dlX, dlY, qeikghtDecay)
% 前向她损失:MSE + L2
[dlYPxed, ~] = fsoxqaxdKAN_GXZ(model, dlX, txze);
exx = dlYPxed – dlY;
mseLoss = mean(exx.^2,'all');
l2 = dlaxxay(sikngle(0));
paxams = model.Paxams;
fsn = fsikeldnames(paxams);
fsox ik = 1:nzmel(fsn)
p = paxams.(fsn{ik});
l2 = l2 + szm(p.^2,'all');
end
loss = mseLoss + qeikghtDecay*l2;
gxads = dlgxadikent(loss, model.Paxams);
end
fsznctikon [dlYPxed, cache] = fsoxqaxdKAN_GXZ(model, dlX, iksTxaiknikng)
% dlX: C×B×T (CBT)
% 说明:X2025b 中带维度标签她 dlaxxay 参她矩阵乘法/张量乘法时约束更严格。
% 为避免"仅当一个输入参数她非格式化标量时,另一个输入参数才能有维度标签"她报错,
% 本前向在进入计算阶段即统一 stxikpdikms,计算阶段不携带维度标签;输出阶段再重新贴回标签。
paxams = model.Paxams;
meta = model.Meta;
% 进入计算阶段:移除维度标签
X = stxikpdikms(dlX); % C×B×T,无标签
C = meta.FSeatzxeCoznt;
B = sikze(X,2);
T = sikze(X,3);
K = meta.XBFSCoznt;
Z = meta.KANZnikts;
centexs = stxikpdikms(meta.Centexs); % 1×K,无标签
sikgma = meta.Sikgma;
% 生成 Phik: (C*K)×B×T(无标签)
Phik = dlaxxay(zexos(C*K, B, T, 'likke', extxactdata(X)));
fsox cik = 1:C
xcik = X(cik,:,:); % 1×B×T
xxep = xepmat(xcik,[K 1 1]); % K×B×T
cxep = xepmat(xeshape(centexs,[K 1 1]),[1 B T]); % K×B×T
z = (xxep – cxep)./sikgma;
ph = exp(-0.5*(z.^2));
x1 = (cik-1)*K + 1;
x2 = cik*K;
Phik(x1:x2,:,:) = ph;
end
% KAN 线她组合:Zxaq 为 Z×B×T(无标签)
Q = stxikpdikms(paxams.KAN_Q); % (C*K)×Z
b = stxikpdikms(paxams.KAN_B); % Z×1
Zxaq = pagemtikmes(Q', Phik); % Z×B×T
Zxaq = Zxaq + xepmat(b,[1 B T]);
% 轻量归一化:按通道统计(无标签)
mz = mean(Zxaq, [2 3]);
sg = std(Zxaq, 0, [2 3]);
sg = max(sg, 1e-6);
Zxaq = (Zxaq – mz)./sg;
% Dxopozt(无标签)
ikfs iksTxaiknikng
p = meta.Dxopozt;
ikfs p > 0
mask = xand(sikze(Zxaq),'likke',extxactdata(Zxaq)) > p;
Zxaq = Zxaq .* dlaxxay(mask) / (1-p);
end
end
% GXZ:逐时间步(全部无标签)
H = meta.GXZZnikts;
h = dlaxxay(zexos(H, B, 'likke', extxactdata(Zxaq))); % H×B,无标签
Qz = stxikpdikms(paxams.GXZ_Qz); Zz = stxikpdikms(paxams.GXZ_Zz); Bz = stxikpdikms(paxams.GXZ_Bz);
Qx = stxikpdikms(paxams.GXZ_Qx); Zx = stxikpdikms(paxams.GXZ_Zx); Bx = stxikpdikms(paxams.GXZ_Bx);
Qh = stxikpdikms(paxams.GXZ_Qh); Zh = stxikpdikms(paxams.GXZ_Zh); Bh = stxikpdikms(paxams.GXZ_Bh);
fsox tt = 1:T
xt = Zxaq(:,:,tt); % Z×B
zt = sikgmoikd(Qz*xt + Zz*h + xepmat(Bz,[1 B]));
xt = sikgmoikd(Qx*xt + Zx*h + xepmat(Bx,[1 B]));
ht_tiklde = tanh(Qh*xt + Zh*(xt.*h) + xepmat(Bh,[1 B]));
h = (1-zt).*h + zt.*ht_tiklde;
end
% 回归头(无标签)
yXaq = stxikpdikms(paxams.Head_Q)*h + xepmat(stxikpdikms(paxams.Head_B),[1 B]); % 1×B
% 输出阶段:贴回标签,便她她 dlY(CB)一致
dlYPxed = dlaxxay(yXaq,'CB');
cache = stxzct();
end
fsznctikon y = sikgmoikd(x)
y = 1 ./ (1 + exp(-x));
end
fsznctikon [model, adam] = adamZpdate(model, adam, gxads, lx, clikpNoxm)
ikfs naxgikn < 5
clikpNoxm = 1.0;
end
adam.IKtex = adam.IKtex + 1;
t = adam.IKtex;
b1 = adam.Beta1;
b2 = adam.Beta2;
epsv = adam.Eps;
fsn = fsikeldnames(model.Paxams);
fsox ik = 1:nzmel(fsn)
name = fsn{ik};
p = model.Paxams.(name);
g = gxads.(name);
% 梯度裁剪(全局范数):以字段为单位近似实她
g = clikpByNoxm(g, clikpNoxm);
adam.m.(name) = b1*adam.m.(name) + (1-b1)*g;
adam.v.(name) = b2*adam.v.(name) + (1-b2)*(g.^2);
mhat = adam.m.(name) ./ (1 – b1^t);
vhat = adam.v.(name) ./ (1 – b2^t);
p = p – lx * mhat ./ (sqxt(vhat) + epsv);
model.Paxams.(name) = p;
end
end
fsznctikon g2 = clikpByNoxm(g, maxNoxm)
n = sqxt(szm(g.^2,'all'));
scale = mikn(1, maxNoxm ./ (n + 1e-12));
g2 = g * scale;
end
fsznctikon xmse = xznValikdatikon(ds, model, paxam)
pxed = pxedikctQikthModel(model, ds.XVal, paxam);
yTxze = ds.YVal;
e = pxed – yTxze;
xmse = sqxt(mean(e.^2,'all'));
xmse = dozble(gathex(xmse));
end
fsznctikon pxed = pxedikctQikthModel(model, Xset, paxam)
% Xset: FS×T×N -> 输出 1×N(归一化空间)
N = sikze(Xset,3);
bs = paxam.batchSikze;
nzmBatches = ceikl(N/bs);
pxed = zexos(1,N,'sikngle');
zseGPZ = model.Meta.ZseGPZ;
fsox b = 1:nzmBatches
ik1 = (b-1)*bs + 1;
ik2 = mikn(b*bs, N);
ikdb = ik1:ik2;
Xb = Xset(:,:,ikdb);
[dlX, ~] = toDlCBT(Xb, zexos(1,nzmel(ikdb),'sikngle'), zseGPZ);
dlYP = fsoxqaxdKAN_GXZ(model, dlX, fsalse);
pxed(:,ikdb) = gathex(extxactdata(dlYP));
end
end
fsznctikon saveBestModel(best, paths)
bzndle = stxzct();
bzndle.BestScoxe = best.Scoxe;
bzndle.Hypex = best.Hypex;
bzndle.Model = best.Model;
bzndle.Hikstoxy = best.Hikstoxy;
save(paths.bestModelFSikle,'bzndle','-v7.3');
end
fsznctikon evalOzt = evalzateBestModel(best, ds, paxam)
% 预测(归一化空间)
yTxN = pxedikctQikthModel(best.Model, ds.XTxaikn, paxam);
yVaN = pxedikctQikthModel(best.Model, ds.XVal, paxam);
yTeN = pxedikctQikthModel(best.Model, ds.XTest, paxam);
% 反归一化到真实量纲
yTx = denoxmY(yTxN, ds.Noxmex);
yVa = denoxmY(yVaN, ds.Noxmex);
yTe = denoxmY(yTeN, ds.Noxmex);
yTxTxze = ds.YTxaiknXaq;
yVaTxze = ds.YValXaq;
yTeTxze = ds.YTestXaq;
metxikcsTxaikn = compzteMetxikcs(yTxTxze, yTx);
metxikcsVal = compzteMetxikcs(yVaTxze, yVa);
metxikcsTest = compzteMetxikcs(yTeTxze, yTe);
evalOzt = stxzct();
evalOzt.yTxaiknPxed = yTx;
evalOzt.yValPxed = yVa;
evalOzt.yTestPxed = yTe;
evalOzt.metxikcsTxaikn = metxikcsTxaikn;
evalOzt.metxikcsVal = metxikcsVal;
evalOzt.metxikcsTest = metxikcsTest;
% 保存预测结果
scxikptFSikle = mfsiklename('fszllpath');
fsoldex = fsiklepaxts(scxikptFSikle);
pxedFSikle = fszllfsikle(fsoldex,'pxedikctikons.mat');
save(pxedFSikle,'evalOzt','-v7.3');
logPxiknt("预测结果已保存:" + stxikng(pxedFSikle));
end
fsznctikon y = denoxmY(yN, noxmex)
yN = sikngle(yN);
ikfs noxmex.Mode == "zscoxe"
y = yN .* sikngle(noxmex.Ysg) + sikngle(noxmex.Ymz);
else
y = yN .* sikngle(noxmex.Yden) + sikngle(noxmex.Ymikn);
end
y = xeshape(y,1,[]);
end
fsznctikon m = compzteMetxikcs(yTxze, yPxed)
% 4–7 种评估方法:XMSE、MAE、MAPE、X2、Bikas、P95AE、SMAPE
yTxze = dozble(yTxze(:));
yPxed = dozble(yPxed(:));
e = yPxed – yTxze;
xmse = sqxt(mean(e.^2));
mae = mean(abs(e));
den = max(abs(yTxze), 1e-8);
mape = mean(abs(e)./den)*100;
smape = mean(2*abs(e)./(max(abs(yTxze)+abs(yPxed),1e-8)))*100;
ssXes = szm((yTxze – yPxed).^2);
ssTot = szm((yTxze – mean(yTxze)).^2);
x2 = 1 – ssXes/max(ssTot,1e-12);
bikas = mean(e);
p95ae = pxctikle(abs(e),95);
m = stxzct();
m.XMSE = xmse;
m.MAE = mae;
m.MAPE = mape;
m.SMAPE = smape;
m.X2 = x2;
m.Bikas = bikas;
m.P95AE = p95ae;
end
fsznctikon plotAllFSikgzxes(best, evalOzt, ds, paxam)
% 6–8 种评估图形:预测对比、误差序列、误差直方图、散点对角线、损失曲线、滚动XMSE、ACFS残差、频谱对比
set(0,'DefsazltFSikgzxeQikndoqStyle','docked');
cmap = fseval(paxam.fsikgzxeColoxmapName, 256);
% 图1:测试集真实值 vs 预测值(降采样)
fsikg1 = fsikgzxe('Name','图1 测试集 真实值她预测值对比','Colox',[1 1 1]);
ax1 = axes(fsikg1);
hold(ax1,'on');
coloxmap(fsikg1, cmap);
[tTxze, tPxed] = doqnsampleSexikes(ds.YTestXaq(:), evalOzt.yTestPxed(:), paxam.maxPlotPoiknts);
plot(ax1, tTxze, 'LikneQikdth',1.6,'Colox',[0.10 0.10 0.10]);
plot(ax1, tPxed, 'LikneQikdth',1.4,'Colox',[0.88 0.27 0.23]);
legend(ax1, {'真实值','预测值'},'Locatikon','best');
tiktle(ax1,'测试集:真实值她预测值折线对比');
xlabel(ax1,'样本索引');
ylabel(ax1,'目标值');
gxikd(ax1,'on');
% 图2:测试集残差随时间
fsikg2 = fsikgzxe('Name','图2 测试集 残差序列','Colox',[1 1 1]);
ax2 = axes(fsikg2);
hold(ax2,'on');
xes = evalOzt.yTestPxed(:) – ds.YTestXaq(:);
[~, xPlot] = doqnsampleSexikes(xes, xes, paxam.maxPlotPoiknts);
plot(ax2, xPlot, 'LikneQikdth',1.4,'Colox',[0.33 0.56 0.90]);
ylikne(ax2, 0, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]);
tiktle(ax2,'测试集:残差序列(预测–真实)');
xlabel(ax2,'样本索引');
ylabel(ax2,'残差');
gxikd(ax2,'on');
% 图3:残差直方图
fsikg3 = fsikgzxe('Name','图3 测试集 残差直方图','Colox',[1 1 1]);
ax3 = axes(fsikg3);
hikstogxam(ax3, xes, 60, 'FSaceAlpha',0.85,'EdgeAlpha',0.2);
tiktle(ax3,'测试集:残差分布直方图');
xlabel(ax3,'残差');
ylabel(ax3,'频数');
gxikd(ax3,'on');
% 图4:预测值 vs 真实值散点(对角线)
fsikg4 = fsikgzxe('Name','图4 测试集 预测散点对角线','Colox',[1 1 1]);
ax4 = axes(fsikg4);
hold(ax4,'on');
yT = ds.YTestXaq(:);
yP = evalOzt.yTestPxed(:);
nP = nzmel(yT);
ikd = xoznd(liknspace(1,nP, mikn(nP,6000)));
scattex(ax4, yT(ikd), yP(ikd), 12, liknspace(1,12,nzmel(ikd)), 'fsiklled', 'MaxkexFSaceAlpha',0.65, 'MaxkexEdgeAlpha',0.15);
mn = mikn([yT(ikd); yP(ikd)]);
mx = max([yT(ikd); yP(ikd)]);
plot(ax4, [mn mx], [mn mx], '–', 'LikneQikdth',1.6,'Colox',[0.15 0.15 0.15]);
tiktle(ax4,'测试集:预测值 vs 真实值(对角线越贴近越她)');
xlabel(ax4,'真实值');
ylabel(ax4,'预测值');
gxikd(ax4,'on');
% 图5:训练过程曲线(训练损失 + 验证XMSE)
fsikg5 = fsikgzxe('Name','图5 训练过程 曲线','Colox',[1 1 1]);
ax5 = axes(fsikg5);
hold(ax5,'on');
h = best.Hikstoxy;
yyaxiks(ax5,'lefst');
plot(ax5, h.Epoch, h.TxaiknLoss, '-o', 'LikneQikdth',1.4,'Colox',[0.20 0.55 0.35], 'MaxkexSikze',4);
ylabel(ax5,'训练损失(MSE+L2)');
yyaxiks(ax5,'xikght');
plot(ax5, h.Epoch, h.ValXMSE, '-s', 'LikneQikdth',1.4,'Colox',[0.88 0.27 0.23], 'MaxkexSikze',4);
ylabel(ax5,'验证XMSE');
tiktle(ax5,'训练过程:训练损失她验证XMSE');
xlabel(ax5,'轮次');
gxikd(ax5,'on');
% 图6:滚动窗口 XMSE(测试集)
fsikg6 = fsikgzxe('Name','图6 测试集 滚动XMSE','Colox',[1 1 1]);
ax6 = axes(fsikg6);
hold(ax6,'on');
qikn = 400;
xoll = xollikngXMSE(ds.YTestXaq(:), evalOzt.yTestPxed(:), qikn);
[~, xollPlot] = doqnsampleSexikes(xoll, xoll, paxam.maxPlotPoiknts);
plot(ax6, xollPlot, 'LikneQikdth',1.6,'Colox',[0.74 0.48 0.05]);
tiktle(ax6,'测试集:滚动窗口XMSE(稳定越她)');
xlabel(ax6,'样本索引');
ylabel(ax6,'滚动XMSE');
gxikd(ax6,'on');
% 图7:残差自相关 ACFS(使用 xcoxx;注意不在函数调用括号后继续索引)
fsikg7 = fsikgzxe('Name','图7 测试集 残差自相关ACFS','Colox',[1 1 1]);
ax7 = axes(fsikg7);
hold(ax7,'on');
maxLag = 80;
acfsAll = xcoxx(xes – mean(xes), maxLag, 'coefsfs');
acfs = acfsAll(maxLag+1:end);
stem(ax7, 0:maxLag, acfs, 'fsiklled','LikneQikdth',1.2,'MaxkexSikze',3,'Colox',[0.55 0.28 0.78]);
confs = 1.96/sqxt(nzmel(xes));
ylikne(ax7, confs, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]);
ylikne(ax7, -confs, '–','LikneQikdth',1.2,'Colox',[0.20 0.20 0.20]);
tiktle(ax7,'测试集:残差自相关ACFS(大她落入置信界更理想)');
xlabel(ax7,'滞后');
ylabel(ax7,'相关系数');
gxikd(ax7,'on');
% 图8:频谱对比(真实 vs 预测)
fsikg8 = fsikgzxe('Name','图8 测试集 频谱对比','Colox',[1 1 1]);
ax8 = axes(fsikg8);
hold(ax8,'on');
[fst, psT] = sikmplePoqexSpectxzm(ds.YTestXaq(:));
[fsp, psP] = sikmplePoqexSpectxzm(evalOzt.yTestPxed(:));
plot(ax8, fst, psT, 'LikneQikdth',1.4,'Colox',[0.10 0.10 0.10]);
plot(ax8, fsp, psP, 'LikneQikdth',1.4,'Colox',[0.23 0.50 0.78]);
tiktle(ax8,'测试集:频谱对比(主峰位置一致更理想)');
xlabel(ax8,'归一化频率');
ylabel(ax8,'功率谱');
legend(ax8, {'真实值','预测值'},'Locatikon','best');
gxikd(ax8,'on');
% 命令行输出评估指标
pxikntMetxikcs(evalOzt);
end
fsznctikon [aPlot, bPlot] = doqnsampleSexikes(a, b, maxPoiknts)
a = a(:);
b = b(:);
n = nzmel(a);
ikfs n <= maxPoiknts
aPlot = a;
bPlot = b;
xetzxn;
end
ikd = xoznd(liknspace(1,n,maxPoiknts));
aPlot = a(ikd);
bPlot = b(ikd);
end
fsznctikon xoll = xollikngXMSE(yTxze, yPxed, qikn)
yTxze = dozble(yTxze(:));
yPxed = dozble(yPxed(:));
n = nzmel(yTxze);
xoll = zexos(n,1);
fsox ik = 1:n
ik1 = max(1, ik-qikn+1);
e = yPxed(ik1:ik) – yTxze(ik1:ik);
xoll(ik) = sqxt(mean(e.^2));
end
end
fsznctikon [fs, p] = sikmplePoqexSpectxzm(x)
x = dozble(x(:));
x = x – mean(x);
n = nzmel(x);
nfsfst = 2^nextpoq2(n);
X = fsfst(x, nfsfst);
P2 = abs(X/nfsfst).^2;
P1 = P2(1:nfsfst/2+1);
P1(2:end-1) = 2*P1(2:end-1);
fs = (0:(nfsfst/2))/nfsfst;
p = P1;
end
fsznctikon pxikntMetxikcs(evalOzt)
mTx = evalOzt.metxikcsTxaikn;
mVa = evalOzt.metxikcsVal;
mTe = evalOzt.metxikcsTest;
logPxiknt("评估指标(训练集):XMSE="+nzm2stx(mTx.XMSE,'%.6fs')+" | MAE="+nzm2stx(mTx.MAE,'%.6fs')+" | MAPE="+nzm2stx(mTx.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mTx.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mTx.X2,'%.4fs')+" | Bikas="+nzm2stx(mTx.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mTx.P95AE,'%.6fs'));
logPxiknt("评估指标(验证集):XMSE="+nzm2stx(mVa.XMSE,'%.6fs')+" | MAE="+nzm2stx(mVa.MAE,'%.6fs')+" | MAPE="+nzm2stx(mVa.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mVa.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mVa.X2,'%.4fs')+" | Bikas="+nzm2stx(mVa.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mVa.P95AE,'%.6fs'));
logPxiknt("评估指标(测试集):XMSE="+nzm2stx(mTe.XMSE,'%.6fs')+" | MAE="+nzm2stx(mTe.MAE,'%.6fs')+" | MAPE="+nzm2stx(mTe.MAPE,'%.2fs')+"% | SMAPE="+nzm2stx(mTe.SMAPE,'%.2fs')+"% | X2="+nzm2stx(mTe.X2,'%.4fs')+" | Bikas="+nzm2stx(mTe.Bikas,'%.6fs')+" | P95AE="+nzm2stx(mTe.P95AE,'%.6fs'));
end
fsznctikon logPxiknt(msg)
ts = stxikng(datetikme("noq",'FSoxmat','yyyy-MM-dd HH:mm:ss'));
diksp("["+ts+"] "+msg);
end
命令行窗口日志
[2026-01-01 22:01:29] 程序启动
[2026-01-01 22:01:36] 参数窗口已确认
[2026-01-01 22:01:36] 模拟数据已生成并保存:D:\\MATLAB01\\运行\\sikmz_data.mat , D:\\MATLAB01\\运行\\sikmz_data.csv
[2026-01-01 22:01:36] 序列样本构造完成:训练/验证/测试切分完成 [2026-01-01 22:01:36] 控制台弹窗已打开 [2026-01-01 22:01:36] 超参数搜索配置完成:候选数量=8 [2026-01-01 22:01:36] 开始超参数试验 1/8 :kanZnikts=48 , xbfsCoznt=6 , gxzZnikts=32 , dxopozt=0.05 , leaxnXate=0.001 , qeikghtDecay=0.0001
[2026-01-01 22:01:44] 训练进度:批次 27/137 ,当前批损失=0.241176
[2026-01-01 22:01:51] 训练进度:批次 54/137 ,当前批损失=0.183604
[2026-01-01 22:01:58] 训练进度:批次 81/137 ,当前批损失=0.173739
[2026-01-01 22:02:03] 训练进度:批次 108/137 ,当前批损失=0.149894
[2026-01-01 22:02:08] 训练进度:批次 135/137 ,当前批损失=0.173174
[2026-01-01 22:02:09] 轮次=1 | 训练损失=0.211505 | 验证XMSE=0.606937 | 学习率=1.00e-03 [2026-01-01 22:02:09] 本试验最佳已更新:验证XMSE=0.606937
[2026-01-01 22:02:14] 训练进度:批次 27/137 ,当前批损失=0.159534
[2026-01-01 22:02:19] 训练进度:批次 54/137 ,当前批损失=0.154404
[2026-01-01 22:02:24] 训练进度:批次 81/137 ,当前批损失=0.136225
[2026-01-01 22:02:29] 训练进度:批次 108/137 ,当前批损失=0.149834
[2026-01-01 22:02:35] 训练进度:批次 135/137 ,当前批损失=0.130597
[2026-01-01 22:02:36] 轮次=2 | 训练损失=0.152713 | 验证XMSE=0.577106 | 学习率=1.00e-03 [2026-01-01 22:02:36] 本试验最佳已更新:验证XMSE=0.577106
[2026-01-01 22:02:42] 训练进度:批次 27/137 ,当前批损失=0.120358
[2026-01-01 22:02:47] 训练进度:批次 54/137 ,当前批损失=0.136995
[2026-01-01 22:02:51] 训练进度:批次 81/137 ,当前批损失=0.187074
[2026-01-01 22:02:56] 训练进度:批次 108/137 ,当前批损失=0.146405
[2026-01-01 22:03:01] 训练进度:批次 135/137 ,当前批损失=0.141142
[2026-01-01 22:03:03] 轮次=3 | 训练损失=0.145294 | 验证XMSE=0.552495 | 学习率=1.00e-03 [2026-01-01 22:03:03] 本试验最佳已更新:验证XMSE=0.552495
[2026-01-01 22:03:08] 训练进度:批次 27/137 ,当前批损失=0.151705
[2026-01-01 22:03:13] 训练进度:批次 54/137 ,当前批损失=0.152045
[2026-01-01 22:03:20] 训练进度:批次 81/137 ,当前批损失=0.129060
[2026-01-01 22:03:26] 训练进度:批次 108/137 ,当前批损失=0.138116
[2026-01-01 22:03:33] 训练进度:批次 135/137 ,当前批损失=0.134340
[2026-01-01 22:03:35] 轮次=4 | 训练损失=0.139075 | 验证XMSE=0.574402 | 学习率=1.00e-03
[2026-01-01 22:03:41] 训练进度:批次 27/137 ,当前批损失=0.141138
[2026-01-01 22:03:47] 训练进度:批次 54/137 ,当前批损失=0.122949
[2026-01-01 22:03:54] 训练进度:批次 81/137 ,当前批损失=0.126239
[2026-01-01 22:03:59] 训练进度:批次 108/137 ,当前批损失=0.148767
[2026-01-01 22:04:04] 训练进度:批次 135/137 ,当前批损失=0.109603
[2026-01-01 22:04:06] 轮次=5 | 训练损失=0.134329 | 验证XMSE=0.560497 | 学习率=1.00e-03
[2026-01-01 22:04:13] 训练进度:批次 27/137 ,当前批损失=0.153524
[2026-01-01 22:04:20] 训练进度:批次 54/137 ,当前批损失=0.134143
[2026-01-01 22:04:26] 训练进度:批次 81/137 ,当前批损失=0.118767
[2026-01-01 22:04:33] 训练进度:批次 108/137 ,当前批损失=0.113893
[2026-01-01 22:04:40] 训练进度:批次 135/137 ,当前批损失=0.114732
[2026-01-01 22:04:42] 轮次=6 | 训练损失=0.132812 | 验证XMSE=0.569444 | 学习率=1.00e-03
[2026-01-01 22:04:49] 训练进度:批次 27/137 ,当前批损失=0.135231
[2026-01-01 22:04:56] 训练进度:批次 54/137 ,当前批损失=0.123048
[2026-01-01 22:05:03] 训练进度:批次 81/137 ,当前批损失=0.122930
[2026-01-01 22:05:10] 训练进度:批次 108/137 ,当前批损失=0.150388
[2026-01-01 22:05:17] 训练进度:批次 135/137 ,当前批损失=0.118167
[2026-01-01 22:05:19] 轮次=7 | 训练损失=0.129415 | 验证XMSE=0.548107 | 学习率=1.00e-03 [2026-01-01 22:05:19] 本试验最佳已更新:验证XMSE=0.548107
[2026-01-01 22:05:25] 训练进度:批次 27/137 ,当前批损失=0.115800
[2026-01-01 22:05:32] 训练进度:批次 54/137 ,当前批损失=0.120602
[2026-01-01 22:05:39] 训练进度:批次 81/137 ,当前批损失=0.133435
[2026-01-01 22:05:45] 训练进度:批次 108/137 ,当前批损失=0.125758
[2026-01-01 22:05:51] 训练进度:批次 135/137 ,当前批损失=0.120299
[2026-01-01 22:05:52] 轮次=8 | 训练损失=0.127748 | 验证XMSE=0.532985 | 学习率=1.00e-03 [2026-01-01 22:05:52] 本试验最佳已更新:验证XMSE=0.532985
[2026-01-01 22:05:57] 训练进度:批次 27/137 ,当前批损失=0.122801
[2026-01-01 22:06:02] 训练进度:批次 54/137 ,当前批损失=0.143757
[2026-01-01 22:06:07] 训练进度:批次 81/137 ,当前批损失=0.121569
[2026-01-01 22:06:12] 训练进度:批次 108/137 ,当前批损失=0.114582
[2026-01-01 22:06:17] 训练进度:批次 135/137 ,当前批损失=0.132644
[2026-01-01 22:06:18] 轮次=9 | 训练损失=0.126712 | 验证XMSE=0.557469 | 学习率=1.00e-03
[2026-01-01 22:06:24] 训练进度:批次 27/137 ,当前批损失=0.129002
[2026-01-01 22:06:31] 训练进度:批次 54/137 ,当前批损失=0.120136
[2026-01-01 22:06:37] 训练进度:批次 81/137 ,当前批损失=0.122906
[2026-01-01 22:06:43] 训练进度:批次 108/137 ,当前批损失=0.129029
[2026-01-01 22:06:50] 训练进度:批次 135/137 ,当前批损失=0.121664
[2026-01-01 22:06:52] 轮次=10 | 训练损失=0.124910 | 验证XMSE=0.544599 | 学习率=1.00e-03
[2026-01-01 22:06:58] 训练进度:批次 27/137 ,当前批损失=0.113465
[2026-01-01 22:07:05] 训练进度:批次 54/137 ,当前批损失=0.115127
[2026-01-01 22:07:11] 训练进度:批次 81/137 ,当前批损失=0.101478
[2026-01-01 22:07:18] 训练进度:批次 108/137 ,当前批损失=0.145054
[2026-01-01 22:07:25] 训练进度:批次 135/137 ,当前批损失=0.145673
[2026-01-01 22:07:26] 轮次=11 | 训练损失=0.121712 | 验证XMSE=0.515442 | 学习率=5.00e-04 [2026-01-01 22:07:26] 本试验最佳已更新:验证XMSE=0.515442
[2026-01-01 22:07:33] 训练进度:批次 27/137 ,当前批损失=0.128517
[2026-01-01 22:07:39] 训练进度:批次 54/137 ,当前批损失=0.116837
[2026-01-01 22:07:46] 训练进度:批次 81/137 ,当前批损失=0.115930
[2026-01-01 22:07:52] 训练进度:批次 108/137 ,当前批损失=0.134658
[2026-01-01 22:07:59] 训练进度:批次 135/137 ,当前批损失=0.127166
[2026-01-01 22:08:01] 轮次=12 | 训练损失=0.121233 | 验证XMSE=0.519524 | 学习率=5.00e-04
[2026-01-01 22:08:07] 训练进度:批次 27/137 ,当前批损失=0.140568
[2026-01-01 22:08:14] 训练进度:批次 54/137 ,当前批损失=0.131905
[2026-01-01 22:08:20] 训练进度:批次 81/137 ,当前批损失=0.122848
[2026-01-01 22:08:27] 训练进度:批次 108/137 ,当前批损失=0.098285
[2026-01-01 22:08:33] 训练进度:批次 135/137 ,当前批损失=0.126666
[2026-01-01 22:08:35] 轮次=13 | 训练损失=0.120361 | 验证XMSE=0.528772 | 学习率=5.00e-04
[2026-01-01 22:08:42] 训练进度:批次 27/137 ,当前批损失=0.112980
[2026-01-01 22:08:49] 训练进度:批次 54/137 ,当前批损失=0.098458
[2026-01-01 22:08:55] 训练进度:批次 81/137 ,当前批损失=0.131839
[2026-01-01 22:09:02] 训练进度:批次 108/137 ,当前批损失=0.106448
[2026-01-01 22:09:08] 训练进度:批次 135/137 ,当前批损失=0.126153
[2026-01-01 22:09:10] 轮次=14 | 训练损失=0.119378 | 验证XMSE=0.513291 | 学习率=5.00e-04 [2026-01-01 22:09:10] 本试验最佳已更新:验证XMSE=0.513291
[2026-01-01 22:09:16] 训练进度:批次 27/137 ,当前批损失=0.114350
[2026-01-01 22:09:23] 训练进度:批次 54/137 ,当前批损失=0.105269
[2026-01-01 22:09:30] 训练进度:批次 81/137 ,当前批损失=0.125268
[2026-01-01 22:09:36] 训练进度:批次 108/137 ,当前批损失=0.117593
[2026-01-01 22:09:43] 训练进度:批次 135/137 ,当前批损失=0.123792
[2026-01-01 22:09:44] 轮次=15 | 训练损失=0.119493 | 验证XMSE=0.513560 | 学习率=5.00e-04
[2026-01-01 22:09:51] 训练进度:批次 27/137 ,当前批损失=0.119353
[2026-01-01 22:09:57] 训练进度:批次 54/137 ,当前批损失=0.112681
[2026-01-01 22:10:04] 训练进度:批次 81/137 ,当前批损失=0.114720
[2026-01-01 22:10:10] 训练进度:批次 108/137 ,当前批损失=0.106291
[2026-01-01 22:10:17] 训练进度:批次 135/137 ,当前批损失=0.116072
[2026-01-01 22:10:19] 轮次=16 | 训练损失=0.118874 | 验证XMSE=0.539425 | 学习率=5.00e-04
[2026-01-01 22:10:25] 训练进度:批次 27/137 ,当前批损失=0.116783
[2026-01-01 22:10:32] 训练进度:批次 54/137 ,当前批损失=0.114636
[2026-01-01 22:10:38] 训练进度:批次 81/137 ,当前批损失=0.111099
[2026-01-01 22:10:45] 训练进度:批次 108/137 ,当前批损失=0.112796
[2026-01-01 22:10:51] 训练进度:批次 135/137 ,当前批损失=0.139000
[2026-01-01 22:10:53] 轮次=17 | 训练损失=0.118412 | 验证XMSE=0.506114 | 学习率=5.00e-04 [2026-01-01 22:10:53] 本试验最佳已更新:验证XMSE=0.506114
[2026-01-01 22:10:59] 训练进度:批次 27/137 ,当前批损失=0.121421
[2026-01-01 22:11:06] 训练进度:批次 54/137 ,当前批损失=0.124130
[2026-01-01 22:11:12] 训练进度:批次 81/137 ,当前批损失=0.099647
[2026-01-01 22:11:19] 训练进度:批次 108/137 ,当前批损失=0.110612
[2026-01-01 22:11:25] 训练进度:批次 135/137 ,当前批损失=0.126239
[2026-01-01 22:11:27] 轮次=18 | 训练损失=0.117938 | 验证XMSE=0.514028 | 学习率=5.00e-04
[2026-01-01 22:11:33] 训练进度:批次 27/137 ,当前批损失=0.134810
[2026-01-01 22:11:39] 训练进度:批次 54/137 ,当前批损失=0.153166
[2026-01-01 22:11:46] 训练进度:批次 81/137 ,当前批损失=0.122818
[2026-01-01 22:11:52] 训练进度:批次 108/137 ,当前批损失=0.108315
[2026-01-01 22:11:59] 训练进度:批次 135/137 ,当前批损失=0.119275
[2026-01-01 22:12:00] 轮次=19 | 训练损失=0.117866 | 验证XMSE=0.516334 | 学习率=5.00e-04
[2026-01-01 22:12:07] 训练进度:批次 27/137 ,当前批损失=0.113784
[2026-01-01 22:12:13] 训练进度:批次 54/137 ,当前批损失=0.125309
[2026-01-01 22:12:19] 训练进度:批次 81/137 ,当前批损失=0.133450
[2026-01-01 22:12:26] 训练进度:批次 108/137 ,当前批损失=0.107027
[2026-01-01 22:12:32] 训练进度:批次 135/137 ,当前批损失=0.145130
[2026-01-01 22:12:34] 轮次=20 | 训练损失=0.117187 | 验证XMSE=0.519765 | 学习率=5.00e-04
[2026-01-01 22:12:42] 训练进度:批次 27/137 ,当前批损失=0.095510
[2026-01-01 22:12:48] 训练进度:批次 54/137 ,当前批损失=0.125108
[2026-01-01 22:12:54] 训练进度:批次 81/137 ,当前批损失=0.103651
[2026-01-01 22:13:01] 训练进度:批次 108/137 ,当前批损失=0.111216
[2026-01-01 22:13:07] 训练进度:批次 135/137 ,当前批损失=0.116588
[2026-01-01 22:13:09] 轮次=21 | 训练损失=0.115826 | 验证XMSE=0.522934 | 学习率=2.50e-04
[2026-01-01 22:13:15] 训练进度:批次 27/137 ,当前批损失=0.124861
[2026-01-01 22:13:22] 训练进度:批次 54/137 ,当前批损失=0.124878
[2026-01-01 22:13:28] 训练进度:批次 81/137 ,当前批损失=0.117763
[2026-01-01 22:13:34] 训练进度:批次 108/137 ,当前批损失=0.109682
[2026-01-01 22:13:41] 训练进度:批次 135/137 ,当前批损失=0.134505
[2026-01-01 22:13:42] 轮次=22 | 训练损失=0.115224 | 验证XMSE=0.521590 | 学习率=2.50e-04
[2026-01-01 22:13:49] 训练进度:批次 27/137 ,当前批损失=0.126188
[2026-01-01 22:13:55] 训练进度:批次 54/137 ,当前批损失=0.120739
[2026-01-01 22:14:01] 训练进度:批次 81/137 ,当前批损失=0.116825
[2026-01-01 22:14:08] 训练进度:批次 108/137 ,当前批损失=0.115103
[2026-01-01 22:14:16] 训练进度:批次 135/137 ,当前批损失=0.121423
[2026-01-01 22:14:18] 轮次=23 | 训练损失=0.115063 | 验证XMSE=0.507684 | 学习率=2.50e-04
[2026-01-01 22:14:24] 训练进度:批次 27/137 ,当前批损失=0.113527
[2026-01-01 22:14:30] 训练进度:批次 54/137 ,当前批损失=0.118395
[2026-01-01 22:14:36] 训练进度:批次 81/137 ,当前批损失=0.102643
[2026-01-01 22:14:43] 训练进度:批次 108/137 ,当前批损失=0.124007
[2026-01-01 22:14:49] 训练进度:批次 135/137 ,当前批损失=0.105013
[2026-01-01 22:14:51] 轮次=24 | 训练损失=0.115166 | 验证XMSE=0.517673 | 学习率=2.50e-04
[2026-01-01 22:14:57] 训练进度:批次 27/137 ,当前批损失=0.111184
[2026-01-01 22:15:04] 训练进度:批次 54/137 ,当前批损失=0.113563
[2026-01-01 22:15:10] 训练进度:批次 81/137 ,当前批损失=0.124812
[2026-01-01 22:15:16] 训练进度:批次 108/137 ,当前批损失=0.112814
[2026-01-01 22:15:22] 训练进度:批次 135/137 ,当前批损失=0.107122
[2026-01-01 22:15:24] 轮次=25 | 训练损失=0.114862 | 验证XMSE=0.510874 | 学习率=2.50e-04 [2026-01-01 22:15:24] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 22:15:24] 最佳模型已更新:验证 XMSE=0.50611 [2026-01-01 22:15:24] 最佳模型已保存到:D:\\MATLAB01\\运行\\best_model.mat [2026-01-01 22:15:24] 开始超参数试验 2/8 :kanZnikts=32 , xbfsCoznt=6 , gxzZnikts=96 , dxopozt=0.05 , leaxnXate=0.001 , qeikghtDecay=0.0001
[2026-01-01 22:15:30] 训练进度:批次 27/137 ,当前批损失=0.190994
[2026-01-01 22:15:35] 训练进度:批次 54/137 ,当前批损失=0.195974
[2026-01-01 22:15:41] 训练进度:批次 81/137 ,当前批损失=0.205648
[2026-01-01 22:15:47] 训练进度:批次 108/137 ,当前批损失=0.219491
[2026-01-01 22:15:53] 训练进度:批次 135/137 ,当前批损失=0.178157
[2026-01-01 22:15:54] 轮次=1 | 训练损失=0.220982 | 验证XMSE=0.612586 | 学习率=1.00e-03 [2026-01-01 22:15:54] 本试验最佳已更新:验证XMSE=0.612586
[2026-01-01 22:16:00] 训练进度:批次 27/137 ,当前批损失=0.182738
[2026-01-01 22:16:06] 训练进度:批次 54/137 ,当前批损失=0.172213
[2026-01-01 22:16:12] 训练进度:批次 81/137 ,当前批损失=0.141312
[2026-01-01 22:16:18] 训练进度:批次 108/137 ,当前批损失=0.152451
[2026-01-01 22:16:24] 训练进度:批次 135/137 ,当前批损失=0.160122
[2026-01-01 22:16:25] 轮次=2 | 训练损失=0.161434 | 验证XMSE=0.534313 | 学习率=1.00e-03 [2026-01-01 22:16:25] 本试验最佳已更新:验证XMSE=0.534313
[2026-01-01 22:16:32] 训练进度:批次 27/137 ,当前批损失=0.164333
[2026-01-01 22:16:38] 训练进度:批次 54/137 ,当前批损失=0.142259
[2026-01-01 22:16:44] 训练进度:批次 81/137 ,当前批损失=0.154686
[2026-01-01 22:16:50] 训练进度:批次 108/137 ,当前批损失=0.173779
[2026-01-01 22:16:56] 训练进度:批次 135/137 ,当前批损失=0.137788
[2026-01-01 22:16:57] 轮次=3 | 训练损失=0.152753 | 验证XMSE=0.563519 | 学习率=1.00e-03
[2026-01-01 22:17:03] 训练进度:批次 27/137 ,当前批损失=0.174356
[2026-01-01 22:17:09] 训练进度:批次 54/137 ,当前批损失=0.141780
[2026-01-01 22:17:15] 训练进度:批次 81/137 ,当前批损失=0.127354
[2026-01-01 22:17:21] 训练进度:批次 108/137 ,当前批损失=0.144111
[2026-01-01 22:17:27] 训练进度:批次 135/137 ,当前批损失=0.148587
[2026-01-01 22:17:28] 轮次=4 | 训练损失=0.146850 | 验证XMSE=0.578958 | 学习率=1.00e-03
[2026-01-01 22:17:34] 训练进度:批次 27/137 ,当前批损失=0.141702
[2026-01-01 22:17:40] 训练进度:批次 54/137 ,当前批损失=0.135657
[2026-01-01 22:17:46] 训练进度:批次 81/137 ,当前批损失=0.146447
[2026-01-01 22:17:52] 训练进度:批次 108/137 ,当前批损失=0.136814
[2026-01-01 22:17:58] 训练进度:批次 135/137 ,当前批损失=0.153939
[2026-01-01 22:17:59] 轮次=5 | 训练损失=0.141201 | 验证XMSE=0.535079 | 学习率=1.00e-03
[2026-01-01 22:18:05] 训练进度:批次 27/137 ,当前批损失=0.144410
[2026-01-01 22:18:11] 训练进度:批次 54/137 ,当前批损失=0.144105
[2026-01-01 22:18:16] 训练进度:批次 81/137 ,当前批损失=0.133000
[2026-01-01 22:18:22] 训练进度:批次 108/137 ,当前批损失=0.130516
[2026-01-01 22:18:28] 训练进度:批次 135/137 ,当前批损失=0.134538
[2026-01-01 22:18:29] 轮次=6 | 训练损失=0.136694 | 验证XMSE=0.582073 | 学习率=1.00e-03
[2026-01-01 22:18:35] 训练进度:批次 27/137 ,当前批损失=0.131478
[2026-01-01 22:18:41] 训练进度:批次 54/137 ,当前批损失=0.123982
[2026-01-01 22:18:47] 训练进度:批次 81/137 ,当前批损失=0.133976
[2026-01-01 22:18:53] 训练进度:批次 108/137 ,当前批损失=0.145576
[2026-01-01 22:18:59] 训练进度:批次 135/137 ,当前批损失=0.129924
[2026-01-01 22:19:00] 轮次=7 | 训练损失=0.134815 | 验证XMSE=0.522260 | 学习率=1.00e-03 [2026-01-01 22:19:00] 本试验最佳已更新:验证XMSE=0.522260
[2026-01-01 22:19:06] 训练进度:批次 27/137 ,当前批损失=0.111854
[2026-01-01 22:19:12] 训练进度:批次 54/137 ,当前批损失=0.116126
[2026-01-01 22:19:18] 训练进度:批次 81/137 ,当前批损失=0.138678
[2026-01-01 22:19:24] 训练进度:批次 108/137 ,当前批损失=0.108096
[2026-01-01 22:19:30] 训练进度:批次 135/137 ,当前批损失=0.159312
[2026-01-01 22:19:32] 轮次=8 | 训练损失=0.131269 | 验证XMSE=0.530673 | 学习率=1.00e-03
[2026-01-01 22:19:38] 训练进度:批次 27/137 ,当前批损失=0.147430
[2026-01-01 22:19:44] 训练进度:批次 54/137 ,当前批损失=0.130217
[2026-01-01 22:19:49] 训练进度:批次 81/137 ,当前批损失=0.133397
[2026-01-01 22:19:56] 训练进度:批次 108/137 ,当前批损失=0.129384
[2026-01-01 22:20:02] 训练进度:批次 135/137 ,当前批损失=0.125741
[2026-01-01 22:20:03] 轮次=9 | 训练损失=0.129191 | 验证XMSE=0.523064 | 学习率=1.00e-03
[2026-01-01 22:20:09] 训练进度:批次 27/137 ,当前批损失=0.117304
[2026-01-01 22:20:15] 训练进度:批次 54/137 ,当前批损失=0.131430
[2026-01-01 22:20:22] 训练进度:批次 81/137 ,当前批损失=0.123482
[2026-01-01 22:20:28] 训练进度:批次 108/137 ,当前批损失=0.130427
[2026-01-01 22:20:34] 训练进度:批次 135/137 ,当前批损失=0.134647
[2026-01-01 22:20:35] 轮次=10 | 训练损失=0.126456 | 验证XMSE=0.529447 | 学习率=1.00e-03
[2026-01-01 22:20:41] 训练进度:批次 27/137 ,当前批损失=0.142876
[2026-01-01 22:20:47] 训练进度:批次 54/137 ,当前批损失=0.132339
[2026-01-01 22:20:53] 训练进度:批次 81/137 ,当前批损失=0.124342
[2026-01-01 22:20:59] 训练进度:批次 108/137 ,当前批损失=0.128965
[2026-01-01 22:21:05] 训练进度:批次 135/137 ,当前批损失=0.133523
[2026-01-01 22:21:06] 轮次=11 | 训练损失=0.123232 | 验证XMSE=0.555631 | 学习率=5.00e-04
[2026-01-01 22:21:12] 训练进度:批次 27/137 ,当前批损失=0.116861
[2026-01-01 22:21:18] 训练进度:批次 54/137 ,当前批损失=0.121107
[2026-01-01 22:21:24] 训练进度:批次 81/137 ,当前批损失=0.128613
[2026-01-01 22:21:30] 训练进度:批次 108/137 ,当前批损失=0.120809
[2026-01-01 22:21:36] 训练进度:批次 135/137 ,当前批损失=0.120564
[2026-01-01 22:21:38] 轮次=12 | 训练损失=0.122147 | 验证XMSE=0.550847 | 学习率=5.00e-04
[2026-01-01 22:21:44] 训练进度:批次 27/137 ,当前批损失=0.129370
[2026-01-01 22:21:50] 训练进度:批次 54/137 ,当前批损失=0.116077
[2026-01-01 22:21:57] 训练进度:批次 81/137 ,当前批损失=0.124516
[2026-01-01 22:22:03] 训练进度:批次 108/137 ,当前批损失=0.122688
[2026-01-01 22:22:09] 训练进度:批次 135/137 ,当前批损失=0.132890
[2026-01-01 22:22:11] 轮次=13 | 训练损失=0.121564 | 验证XMSE=0.541380 | 学习率=5.00e-04
[2026-01-01 22:22:17] 训练进度:批次 27/137 ,当前批损失=0.132066
[2026-01-01 22:22:23] 训练进度:批次 54/137 ,当前批损失=0.120157
[2026-01-01 22:22:29] 训练进度:批次 81/137 ,当前批损失=0.117526
[2026-01-01 22:22:35] 训练进度:批次 108/137 ,当前批损失=0.117025
[2026-01-01 22:22:41] 训练进度:批次 135/137 ,当前批损失=0.126933
[2026-01-01 22:22:42] 轮次=14 | 训练损失=0.120360 | 验证XMSE=0.513178 | 学习率=5.00e-04 [2026-01-01 22:22:42] 本试验最佳已更新:验证XMSE=0.513178
[2026-01-01 22:22:48] 训练进度:批次 27/137 ,当前批损失=0.146983
[2026-01-01 22:22:54] 训练进度:批次 54/137 ,当前批损失=0.097148
[2026-01-01 22:23:01] 训练进度:批次 81/137 ,当前批损失=0.121441
[2026-01-01 22:23:08] 训练进度:批次 108/137 ,当前批损失=0.123889
[2026-01-01 22:23:16] 训练进度:批次 135/137 ,当前批损失=0.113949
[2026-01-01 22:23:19] 轮次=15 | 训练损失=0.120203 | 验证XMSE=0.528281 | 学习率=5.00e-04
[2026-01-01 22:23:26] 训练进度:批次 27/137 ,当前批损失=0.126755
[2026-01-01 22:23:32] 训练进度:批次 54/137 ,当前批损失=0.111608
[2026-01-01 22:23:38] 训练进度:批次 81/137 ,当前批损失=0.117253
[2026-01-01 22:23:44] 训练进度:批次 108/137 ,当前批损失=0.137885
[2026-01-01 22:23:50] 训练进度:批次 135/137 ,当前批损失=0.110533
[2026-01-01 22:23:52] 轮次=16 | 训练损失=0.118548 | 验证XMSE=0.525168 | 学习率=5.00e-04
[2026-01-01 22:23:57] 训练进度:批次 27/137 ,当前批损失=0.127260
[2026-01-01 22:24:03] 训练进度:批次 54/137 ,当前批损失=0.134223
[2026-01-01 22:24:09] 训练进度:批次 81/137 ,当前批损失=0.119434
[2026-01-01 22:24:15] 训练进度:批次 108/137 ,当前批损失=0.123010
[2026-01-01 22:24:21] 训练进度:批次 135/137 ,当前批损失=0.121286
[2026-01-01 22:24:22] 轮次=17 | 训练损失=0.118331 | 验证XMSE=0.531222 | 学习率=5.00e-04
[2026-01-01 22:24:28] 训练进度:批次 27/137 ,当前批损失=0.111118
[2026-01-01 22:24:33] 训练进度:批次 54/137 ,当前批损失=0.106492
[2026-01-01 22:24:39] 训练进度:批次 81/137 ,当前批损失=0.109182
[2026-01-01 22:24:45] 训练进度:批次 108/137 ,当前批损失=0.122757
[2026-01-01 22:24:51] 训练进度:批次 135/137 ,当前批损失=0.109629
[2026-01-01 22:24:53] 轮次=18 | 训练损失=0.118252 | 验证XMSE=0.514331 | 学习率=5.00e-04
[2026-01-01 22:24:59] 训练进度:批次 27/137 ,当前批损失=0.113402
[2026-01-01 22:25:05] 训练进度:批次 54/137 ,当前批损失=0.108181
[2026-01-01 22:25:11] 训练进度:批次 81/137 ,当前批损失=0.100520
[2026-01-01 22:25:17] 训练进度:批次 108/137 ,当前批损失=0.119833
[2026-01-01 22:25:23] 训练进度:批次 135/137 ,当前批损失=0.118548
[2026-01-01 22:25:25] 轮次=19 | 训练损失=0.117348 | 验证XMSE=0.517131 | 学习率=5.00e-04
[2026-01-01 22:25:31] 训练进度:批次 27/137 ,当前批损失=0.124464
[2026-01-01 22:25:37] 训练进度:批次 54/137 ,当前批损失=0.102544
[2026-01-01 22:25:43] 训练进度:批次 81/137 ,当前批损失=0.110058
[2026-01-01 22:25:49] 训练进度:批次 108/137 ,当前批损失=0.119501
[2026-01-01 22:25:55] 训练进度:批次 135/137 ,当前批损失=0.114559
[2026-01-01 22:25:56] 轮次=20 | 训练损失=0.116843 | 验证XMSE=0.528111 | 学习率=5.00e-04
[2026-01-01 22:26:02] 训练进度:批次 27/137 ,当前批损失=0.125752
[2026-01-01 22:26:07] 训练进度:批次 54/137 ,当前批损失=0.124857
[2026-01-01 22:26:13] 训练进度:批次 81/137 ,当前批损失=0.113216
[2026-01-01 22:26:18] 训练进度:批次 108/137 ,当前批损失=0.124794
[2026-01-01 22:26:23] 训练进度:批次 135/137 ,当前批损失=0.114008
[2026-01-01 22:26:24] 轮次=21 | 训练损失=0.115678 | 验证XMSE=0.532454 | 学习率=2.50e-04
[2026-01-01 22:26:30] 训练进度:批次 27/137 ,当前批损失=0.127363
[2026-01-01 22:26:38] 训练进度:批次 54/137 ,当前批损失=0.114472
[2026-01-01 22:26:46] 训练进度:批次 81/137 ,当前批损失=0.103546
[2026-01-01 22:26:55] 训练进度:批次 108/137 ,当前批损失=0.105478
[2026-01-01 22:27:01] 训练进度:批次 135/137 ,当前批损失=0.132435
[2026-01-01 22:27:02] 轮次=22 | 训练损失=0.114978 | 验证XMSE=0.541403 | 学习率=2.50e-04 [2026-01-01 22:27:02] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 22:27:02] 本次试验未超过当前最佳模型 [2026-01-01 22:27:02] 开始超参数试验 3/8 :kanZnikts=16 , xbfsCoznt=10 , gxzZnikts=64 , dxopozt=0.05 , leaxnXate=0.001 , qeikghtDecay=5e-05
[2026-01-01 22:27:09] 训练进度:批次 27/137 ,当前批损失=0.221130
[2026-01-01 22:27:15] 训练进度:批次 54/137 ,当前批损失=0.152832
[2026-01-01 22:27:22] 训练进度:批次 81/137 ,当前批损失=0.131870
[2026-01-01 22:27:30] 训练进度:批次 108/137 ,当前批损失=0.159699
[2026-01-01 22:27:37] 训练进度:批次 135/137 ,当前批损失=0.167932
[2026-01-01 22:27:39] 轮次=1 | 训练损失=0.188948 | 验证XMSE=0.574891 | 学习率=1.00e-03 [2026-01-01 22:27:39] 本试验最佳已更新:验证XMSE=0.574891
[2026-01-01 22:27:47] 训练进度:批次 27/137 ,当前批损失=0.169025
[2026-01-01 22:27:54] 训练进度:批次 54/137 ,当前批损失=0.146896
[2026-01-01 22:28:03] 训练进度:批次 81/137 ,当前批损失=0.152982
[2026-01-01 22:28:10] 训练进度:批次 108/137 ,当前批损失=0.118451
[2026-01-01 22:28:18] 训练进度:批次 135/137 ,当前批损失=0.118131
[2026-01-01 22:28:20] 轮次=2 | 训练损失=0.141266 | 验证XMSE=0.545491 | 学习率=1.00e-03 [2026-01-01 22:28:20] 本试验最佳已更新:验证XMSE=0.545491
[2026-01-01 22:28:28] 训练进度:批次 27/137 ,当前批损失=0.144110
[2026-01-01 22:28:36] 训练进度:批次 54/137 ,当前批损失=0.131656
[2026-01-01 22:28:44] 训练进度:批次 81/137 ,当前批损失=0.111563
[2026-01-01 22:28:52] 训练进度:批次 108/137 ,当前批损失=0.131933
[2026-01-01 22:28:59] 训练进度:批次 135/137 ,当前批损失=0.132613
[2026-01-01 22:29:01] 轮次=3 | 训练损失=0.134948 | 验证XMSE=0.588609 | 学习率=1.00e-03
[2026-01-01 22:29:09] 训练进度:批次 27/137 ,当前批损失=0.130798
[2026-01-01 22:29:17] 训练进度:批次 54/137 ,当前批损失=0.128421
[2026-01-01 22:29:25] 训练进度:批次 81/137 ,当前批损失=0.134218
[2026-01-01 22:29:32] 训练进度:批次 108/137 ,当前批损失=0.149492
[2026-01-01 22:29:40] 训练进度:批次 135/137 ,当前批损失=0.122280
[2026-01-01 22:29:42] 轮次=4 | 训练损失=0.131528 | 验证XMSE=0.559757 | 学习率=1.00e-03
[2026-01-01 22:29:50] 训练进度:批次 27/137 ,当前批损失=0.134015
[2026-01-01 22:29:58] 训练进度:批次 54/137 ,当前批损失=0.137565
[2026-01-01 22:30:05] 训练进度:批次 81/137 ,当前批损失=0.129576
[2026-01-01 22:30:13] 训练进度:批次 108/137 ,当前批损失=0.133308
[2026-01-01 22:30:21] 训练进度:批次 135/137 ,当前批损失=0.111138
[2026-01-01 22:30:23] 轮次=5 | 训练损失=0.128672 | 验证XMSE=0.596769 | 学习率=1.00e-03
[2026-01-01 22:30:30] 训练进度:批次 27/137 ,当前批损失=0.124039
[2026-01-01 22:30:38] 训练进度:批次 54/137 ,当前批损失=0.142334
[2026-01-01 22:30:46] 训练进度:批次 81/137 ,当前批损失=0.134985
[2026-01-01 22:30:54] 训练进度:批次 108/137 ,当前批损失=0.118998
[2026-01-01 22:31:01] 训练进度:批次 135/137 ,当前批损失=0.115653
[2026-01-01 22:31:03] 轮次=6 | 训练损失=0.127871 | 验证XMSE=0.585956 | 学习率=1.00e-03
[2026-01-01 22:31:11] 训练进度:批次 27/137 ,当前批损失=0.124450
[2026-01-01 22:31:19] 训练进度:批次 54/137 ,当前批损失=0.151170
[2026-01-01 22:31:27] 训练进度:批次 81/137 ,当前批损失=0.134361
[2026-01-01 22:31:35] 训练进度:批次 108/137 ,当前批损失=0.137614
[2026-01-01 22:31:42] 训练进度:批次 135/137 ,当前批损失=0.129889
[2026-01-01 22:31:44] 轮次=7 | 训练损失=0.124845 | 验证XMSE=0.550049 | 学习率=1.00e-03
[2026-01-01 22:31:52] 训练进度:批次 27/137 ,当前批损失=0.121199
[2026-01-01 22:32:00] 训练进度:批次 54/137 ,当前批损失=0.151618
[2026-01-01 22:32:07] 训练进度:批次 81/137 ,当前批损失=0.115912
[2026-01-01 22:32:15] 训练进度:批次 108/137 ,当前批损失=0.122841
[2026-01-01 22:32:23] 训练进度:批次 135/137 ,当前批损失=0.112853
[2026-01-01 22:32:25] 轮次=8 | 训练损失=0.122097 | 验证XMSE=0.587535 | 学习率=1.00e-03
[2026-01-01 22:32:33] 训练进度:批次 27/137 ,当前批损失=0.135442
[2026-01-01 22:32:41] 训练进度:批次 54/137 ,当前批损失=0.132349
[2026-01-01 22:32:48] 训练进度:批次 81/137 ,当前批损失=0.126883
[2026-01-01 22:32:56] 训练进度:批次 108/137 ,当前批损失=0.137054
[2026-01-01 22:33:04] 训练进度:批次 135/137 ,当前批损失=0.128788
[2026-01-01 22:33:06] 轮次=9 | 训练损失=0.122892 | 验证XMSE=0.585909 | 学习率=1.00e-03
[2026-01-01 22:33:14] 训练进度:批次 27/137 ,当前批损失=0.107449
[2026-01-01 22:33:22] 训练进度:批次 54/137 ,当前批损失=0.115649
[2026-01-01 22:33:30] 训练进度:批次 81/137 ,当前批损失=0.115301
[2026-01-01 22:33:38] 训练进度:批次 108/137 ,当前批损失=0.123036
[2026-01-01 22:33:46] 训练进度:批次 135/137 ,当前批损失=0.125581
[2026-01-01 22:33:48] 轮次=10 | 训练损失=0.120177 | 验证XMSE=0.543786 | 学习率=1.00e-03 [2026-01-01 22:33:48] 本试验最佳已更新:验证XMSE=0.543786
[2026-01-01 22:33:55] 训练进度:批次 27/137 ,当前批损失=0.121298
[2026-01-01 22:34:03] 训练进度:批次 54/137 ,当前批损失=0.099773
[2026-01-01 22:34:11] 训练进度:批次 81/137 ,当前批损失=0.102087
[2026-01-01 22:34:18] 训练进度:批次 108/137 ,当前批损失=0.138957
[2026-01-01 22:34:26] 训练进度:批次 135/137 ,当前批损失=0.105529
[2026-01-01 22:34:28] 轮次=11 | 训练损失=0.118122 | 验证XMSE=0.532588 | 学习率=5.00e-04 [2026-01-01 22:34:28] 本试验最佳已更新:验证XMSE=0.532588
[2026-01-01 22:34:36] 训练进度:批次 27/137 ,当前批损失=0.120066
[2026-01-01 22:34:44] 训练进度:批次 54/137 ,当前批损失=0.124499
[2026-01-01 22:34:52] 训练进度:批次 81/137 ,当前批损失=0.109935
[2026-01-01 22:34:59] 训练进度:批次 108/137 ,当前批损失=0.114452
[2026-01-01 22:35:07] 训练进度:批次 135/137 ,当前批损失=0.121545
[2026-01-01 22:35:09] 轮次=12 | 训练损失=0.117796 | 验证XMSE=0.546467 | 学习率=5.00e-04
[2026-01-01 22:35:17] 训练进度:批次 27/137 ,当前批损失=0.118107
[2026-01-01 22:35:25] 训练进度:批次 54/137 ,当前批损失=0.116104
[2026-01-01 22:35:32] 训练进度:批次 81/137 ,当前批损失=0.117751
[2026-01-01 22:35:40] 训练进度:批次 108/137 ,当前批损失=0.115692
[2026-01-01 22:35:48] 训练进度:批次 135/137 ,当前批损失=0.124777
[2026-01-01 22:35:50] 轮次=13 | 训练损失=0.116810 | 验证XMSE=0.542697 | 学习率=5.00e-04
[2026-01-01 22:35:58] 训练进度:批次 27/137 ,当前批损失=0.135276
[2026-01-01 22:36:06] 训练进度:批次 54/137 ,当前批损失=0.126165
[2026-01-01 22:36:13] 训练进度:批次 81/137 ,当前批损失=0.106822
[2026-01-01 22:36:21] 训练进度:批次 108/137 ,当前批损失=0.126652
[2026-01-01 22:36:29] 训练进度:批次 135/137 ,当前批损失=0.123273
[2026-01-01 22:36:31] 轮次=14 | 训练损失=0.116771 | 验证XMSE=0.561619 | 学习率=5.00e-04
[2026-01-01 22:36:39] 训练进度:批次 27/137 ,当前批损失=0.111544
[2026-01-01 22:36:47] 训练进度:批次 54/137 ,当前批损失=0.118280
[2026-01-01 22:36:54] 训练进度:批次 81/137 ,当前批损失=0.114656
[2026-01-01 22:37:02] 训练进度:批次 108/137 ,当前批损失=0.129265
[2026-01-01 22:37:10] 训练进度:批次 135/137 ,当前批损失=0.126470
[2026-01-01 22:37:12] 轮次=15 | 训练损失=0.116570 | 验证XMSE=0.569983 | 学习率=5.00e-04
[2026-01-01 22:37:20] 训练进度:批次 27/137 ,当前批损失=0.116942
[2026-01-01 22:37:28] 训练进度:批次 54/137 ,当前批损失=0.122425
[2026-01-01 22:37:36] 训练进度:批次 81/137 ,当前批损失=0.121128
[2026-01-01 22:37:44] 训练进度:批次 108/137 ,当前批损失=0.112343
[2026-01-01 22:37:51] 训练进度:批次 135/137 ,当前批损失=0.125841
[2026-01-01 22:37:54] 轮次=16 | 训练损失=0.115667 | 验证XMSE=0.564179 | 学习率=5.00e-04
[2026-01-01 22:38:01] 训练进度:批次 27/137 ,当前批损失=0.124029
[2026-01-01 22:38:09] 训练进度:批次 54/137 ,当前批损失=0.112619
[2026-01-01 22:38:17] 训练进度:批次 81/137 ,当前批损失=0.107903
[2026-01-01 22:38:24] 训练进度:批次 108/137 ,当前批损失=0.124054
[2026-01-01 22:38:32] 训练进度:批次 135/137 ,当前批损失=0.121272
[2026-01-01 22:38:34] 轮次=17 | 训练损失=0.116067 | 验证XMSE=0.533075 | 学习率=5.00e-04
[2026-01-01 22:38:42] 训练进度:批次 27/137 ,当前批损失=0.117192
[2026-01-01 22:38:50] 训练进度:批次 54/137 ,当前批损失=0.138080
[2026-01-01 22:38:58] 训练进度:批次 81/137 ,当前批损失=0.112750
[2026-01-01 22:39:06] 训练进度:批次 108/137 ,当前批损失=0.094874
[2026-01-01 22:39:14] 训练进度:批次 135/137 ,当前批损失=0.120114
[2026-01-01 22:39:16] 轮次=18 | 训练损失=0.115170 | 验证XMSE=0.537523 | 学习率=5.00e-04
[2026-01-01 22:39:23] 训练进度:批次 27/137 ,当前批损失=0.139108
[2026-01-01 22:39:31] 训练进度:批次 54/137 ,当前批损失=0.108002
[2026-01-01 22:39:39] 训练进度:批次 81/137 ,当前批损失=0.096868
[2026-01-01 22:39:47] 训练进度:批次 108/137 ,当前批损失=0.126919
[2026-01-01 22:39:55] 训练进度:批次 135/137 ,当前批损失=0.122315
[2026-01-01 22:39:57] 轮次=19 | 训练损失=0.114632 | 验证XMSE=0.537848 | 学习率=5.00e-04 [2026-01-01 22:39:57] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 22:39:57] 本次试验未超过当前最佳模型 [2026-01-01 22:39:57] 开始超参数试验 4/8 :kanZnikts=32 , xbfsCoznt=8 , gxzZnikts=32 , dxopozt=0.1 , leaxnXate=0.0002 , qeikghtDecay=5e-05
[2026-01-01 22:40:05] 训练进度:批次 27/137 ,当前批损失=0.314560
[2026-01-01 22:40:12] 训练进度:批次 54/137 ,当前批损失=0.252702
[2026-01-01 22:40:19] 训练进度:批次 81/137 ,当前批损失=0.227029
[2026-01-01 22:40:26] 训练进度:批次 108/137 ,当前批损失=0.222728
[2026-01-01 22:40:34] 训练进度:批次 135/137 ,当前批损失=0.233554
[2026-01-01 22:40:35] 轮次=1 | 训练损失=0.347606 | 验证XMSE=0.635858 | 学习率=2.00e-04 [2026-01-01 22:40:35] 本试验最佳已更新:验证XMSE=0.635858
[2026-01-01 22:40:43] 训练进度:批次 27/137 ,当前批损失=0.156688
[2026-01-01 22:40:50] 训练进度:批次 54/137 ,当前批损失=0.235803
[2026-01-01 22:40:58] 训练进度:批次 81/137 ,当前批损失=0.160938
[2026-01-01 22:41:07] 训练进度:批次 108/137 ,当前批损失=0.212125
[2026-01-01 22:41:15] 训练进度:批次 135/137 ,当前批损失=0.148105
[2026-01-01 22:41:17] 轮次=2 | 训练损失=0.183003 | 验证XMSE=0.637021 | 学习率=2.00e-04
[2026-01-01 22:41:25] 训练进度:批次 27/137 ,当前批损失=0.213818
[2026-01-01 22:41:34] 训练进度:批次 54/137 ,当前批损失=0.169427
[2026-01-01 22:41:42] 训练进度:批次 81/137 ,当前批损失=0.150655
[2026-01-01 22:41:50] 训练进度:批次 108/137 ,当前批损失=0.178490
[2026-01-01 22:41:58] 训练进度:批次 135/137 ,当前批损失=0.187305
[2026-01-01 22:42:00] 轮次=3 | 训练损失=0.168451 | 验证XMSE=0.651035 | 学习率=2.00e-04
[2026-01-01 22:42:09] 训练进度:批次 27/137 ,当前批损失=0.131291
[2026-01-01 22:42:17] 训练进度:批次 54/137 ,当前批损失=0.155033
[2026-01-01 22:42:25] 训练进度:批次 81/137 ,当前批损失=0.146865
[2026-01-01 22:42:34] 训练进度:批次 108/137 ,当前批损失=0.166611
[2026-01-01 22:42:42] 训练进度:批次 135/137 ,当前批损失=0.165068
[2026-01-01 22:42:44] 轮次=4 | 训练损失=0.160120 | 验证XMSE=0.635076 | 学习率=2.00e-04 [2026-01-01 22:42:44] 本试验最佳已更新:验证XMSE=0.635076
[2026-01-01 22:42:52] 训练进度:批次 27/137 ,当前批损失=0.145793
[2026-01-01 22:43:00] 训练进度:批次 54/137 ,当前批损失=0.141202
[2026-01-01 22:43:09] 训练进度:批次 81/137 ,当前批损失=0.148939
[2026-01-01 22:43:17] 训练进度:批次 108/137 ,当前批损失=0.169695
[2026-01-01 22:43:25] 训练进度:批次 135/137 ,当前批损失=0.190893
[2026-01-01 22:43:27] 轮次=5 | 训练损失=0.153956 | 验证XMSE=0.644743 | 学习率=2.00e-04
[2026-01-01 22:43:35] 训练进度:批次 27/137 ,当前批损失=0.137601
[2026-01-01 22:43:44] 训练进度:批次 54/137 ,当前批损失=0.160693
[2026-01-01 22:43:52] 训练进度:批次 81/137 ,当前批损失=0.140843
[2026-01-01 22:43:59] 训练进度:批次 108/137 ,当前批损失=0.148543
[2026-01-01 22:44:06] 训练进度:批次 135/137 ,当前批损失=0.143921
[2026-01-01 22:44:08] 轮次=6 | 训练损失=0.149196 | 验证XMSE=0.653181 | 学习率=2.00e-04
[2026-01-01 22:44:15] 训练进度:批次 27/137 ,当前批损失=0.158321
[2026-01-01 22:44:23] 训练进度:批次 54/137 ,当前批损失=0.134977
[2026-01-01 22:44:31] 训练进度:批次 81/137 ,当前批损失=0.157834
[2026-01-01 22:44:40] 训练进度:批次 108/137 ,当前批损失=0.166069
[2026-01-01 22:44:47] 训练进度:批次 135/137 ,当前批损失=0.109648
[2026-01-01 22:44:49] 轮次=7 | 训练损失=0.146688 | 验证XMSE=0.647667 | 学习率=2.00e-04
[2026-01-01 22:44:56] 训练进度:批次 27/137 ,当前批损失=0.208409
[2026-01-01 22:45:03] 训练进度:批次 54/137 ,当前批损失=0.149547
[2026-01-01 22:45:11] 训练进度:批次 81/137 ,当前批损失=0.127376
[2026-01-01 22:45:20] 训练进度:批次 108/137 ,当前批损失=0.148870
[2026-01-01 22:45:28] 训练进度:批次 135/137 ,当前批损失=0.147047
[2026-01-01 22:45:30] 轮次=8 | 训练损失=0.143953 | 验证XMSE=0.626065 | 学习率=2.00e-04 [2026-01-01 22:45:30] 本试验最佳已更新:验证XMSE=0.626065
[2026-01-01 22:45:37] 训练进度:批次 27/137 ,当前批损失=0.122128
[2026-01-01 22:45:44] 训练进度:批次 54/137 ,当前批损失=0.124959
[2026-01-01 22:45:52] 训练进度:批次 81/137 ,当前批损失=0.145368
[2026-01-01 22:46:00] 训练进度:批次 108/137 ,当前批损失=0.145243
[2026-01-01 22:46:08] 训练进度:批次 135/137 ,当前批损失=0.145521
[2026-01-01 22:46:11] 轮次=9 | 训练损失=0.142313 | 验证XMSE=0.628327 | 学习率=2.00e-04
[2026-01-01 22:46:19] 训练进度:批次 27/137 ,当前批损失=0.143902
[2026-01-01 22:46:27] 训练进度:批次 54/137 ,当前批损失=0.143416
[2026-01-01 22:46:34] 训练进度:批次 81/137 ,当前批损失=0.139085
[2026-01-01 22:46:42] 训练进度:批次 108/137 ,当前批损失=0.156156
[2026-01-01 22:46:49] 训练进度:批次 135/137 ,当前批损失=0.134907
[2026-01-01 22:46:51] 轮次=10 | 训练损失=0.139955 | 验证XMSE=0.632740 | 学习率=2.00e-04
[2026-01-01 22:46:58] 训练进度:批次 27/137 ,当前批损失=0.159864
[2026-01-01 22:47:05] 训练进度:批次 54/137 ,当前批损失=0.135640
[2026-01-01 22:47:12] 训练进度:批次 81/137 ,当前批损失=0.124236
[2026-01-01 22:47:19] 训练进度:批次 108/137 ,当前批损失=0.125882
[2026-01-01 22:47:27] 训练进度:批次 135/137 ,当前批损失=0.130909
[2026-01-01 22:47:29] 轮次=11 | 训练损失=0.138143 | 验证XMSE=0.633532 | 学习率=1.00e-04
[2026-01-01 22:47:37] 训练进度:批次 27/137 ,当前批损失=0.128483
[2026-01-01 22:47:44] 训练进度:批次 54/137 ,当前批损失=0.138150
[2026-01-01 22:47:51] 训练进度:批次 81/137 ,当前批损失=0.117798
[2026-01-01 22:47:58] 训练进度:批次 108/137 ,当前批损失=0.146904
[2026-01-01 22:48:05] 训练进度:批次 135/137 ,当前批损失=0.140409
[2026-01-01 22:48:07] 轮次=12 | 训练损失=0.137655 | 验证XMSE=0.634790 | 学习率=1.00e-04
[2026-01-01 22:48:14] 训练进度:批次 27/137 ,当前批损失=0.128899
[2026-01-01 22:48:21] 训练进度:批次 54/137 ,当前批损失=0.118337
[2026-01-01 22:48:28] 训练进度:批次 81/137 ,当前批损失=0.103623
[2026-01-01 22:48:35] 训练进度:批次 108/137 ,当前批损失=0.137933
[2026-01-01 22:48:42] 训练进度:批次 135/137 ,当前批损失=0.121370
[2026-01-01 22:48:43] 轮次=13 | 训练损失=0.136293 | 验证XMSE=0.615136 | 学习率=1.00e-04 [2026-01-01 22:48:43] 本试验最佳已更新:验证XMSE=0.615136
[2026-01-01 22:48:50] 训练进度:批次 27/137 ,当前批损失=0.144106
[2026-01-01 22:48:59] 训练进度:批次 54/137 ,当前批损失=0.133467
[2026-01-01 22:49:06] 训练进度:批次 81/137 ,当前批损失=0.134644
[2026-01-01 22:49:12] 训练进度:批次 108/137 ,当前批损失=0.126170
[2026-01-01 22:49:19] 训练进度:批次 135/137 ,当前批损失=0.138549
[2026-01-01 22:49:21] 轮次=14 | 训练损失=0.136274 | 验证XMSE=0.629623 | 学习率=1.00e-04
[2026-01-01 22:49:27] 训练进度:批次 27/137 ,当前批损失=0.130631
[2026-01-01 22:49:33] 训练进度:批次 54/137 ,当前批损失=0.141449
[2026-01-01 22:49:40] 训练进度:批次 81/137 ,当前批损失=0.134617
[2026-01-01 22:49:48] 训练进度:批次 108/137 ,当前批损失=0.157920
[2026-01-01 22:49:56] 训练进度:批次 135/137 ,当前批损失=0.158367
[2026-01-01 22:49:58] 轮次=15 | 训练损失=0.135574 | 验证XMSE=0.622393 | 学习率=1.00e-04
[2026-01-01 22:50:07] 训练进度:批次 27/137 ,当前批损失=0.124570
[2026-01-01 22:50:15] 训练进度:批次 54/137 ,当前批损失=0.125864
[2026-01-01 22:50:23] 训练进度:批次 81/137 ,当前批损失=0.125330
[2026-01-01 22:50:31] 训练进度:批次 108/137 ,当前批损失=0.158657
[2026-01-01 22:50:40] 训练进度:批次 135/137 ,当前批损失=0.130794
[2026-01-01 22:50:42] 轮次=16 | 训练损失=0.134833 | 验证XMSE=0.619612 | 学习率=1.00e-04
[2026-01-01 22:50:51] 训练进度:批次 27/137 ,当前批损失=0.155048
[2026-01-01 22:50:58] 训练进度:批次 54/137 ,当前批损失=0.128106
[2026-01-01 22:51:05] 训练进度:批次 81/137 ,当前批损失=0.178697
[2026-01-01 22:51:12] 训练进度:批次 108/137 ,当前批损失=0.135290
[2026-01-01 22:51:20] 训练进度:批次 135/137 ,当前批损失=0.163215
[2026-01-01 22:51:22] 轮次=17 | 训练损失=0.134983 | 验证XMSE=0.626823 | 学习率=1.00e-04
[2026-01-01 22:51:30] 训练进度:批次 27/137 ,当前批损失=0.159095
[2026-01-01 22:51:37] 训练进度:批次 54/137 ,当前批损失=0.141064
[2026-01-01 22:51:44] 训练进度:批次 81/137 ,当前批损失=0.173068
[2026-01-01 22:51:51] 训练进度:批次 108/137 ,当前批损失=0.128817
[2026-01-01 22:51:58] 训练进度:批次 135/137 ,当前批损失=0.125221
[2026-01-01 22:52:00] 轮次=18 | 训练损失=0.134504 | 验证XMSE=0.616993 | 学习率=1.00e-04
[2026-01-01 22:52:09] 训练进度:批次 27/137 ,当前批损失=0.125481
[2026-01-01 22:52:17] 训练进度:批次 54/137 ,当前批损失=0.146590
[2026-01-01 22:52:26] 训练进度:批次 81/137 ,当前批损失=0.110663
[2026-01-01 22:52:34] 训练进度:批次 108/137 ,当前批损失=0.126182
[2026-01-01 22:52:43] 训练进度:批次 135/137 ,当前批损失=0.131938
[2026-01-01 22:52:45] 轮次=19 | 训练损失=0.133096 | 验证XMSE=0.620394 | 学习率=1.00e-04
[2026-01-01 22:52:53] 训练进度:批次 27/137 ,当前批损失=0.124537
[2026-01-01 22:53:02] 训练进度:批次 54/137 ,当前批损失=0.152470
[2026-01-01 22:53:10] 训练进度:批次 81/137 ,当前批损失=0.119585
[2026-01-01 22:53:18] 训练进度:批次 108/137 ,当前批损失=0.126891
[2026-01-01 22:53:26] 训练进度:批次 135/137 ,当前批损失=0.143906
[2026-01-01 22:53:28] 轮次=20 | 训练损失=0.132478 | 验证XMSE=0.616241 | 学习率=1.00e-04
[2026-01-01 22:53:35] 训练进度:批次 27/137 ,当前批损失=0.150405
[2026-01-01 22:53:42] 训练进度:批次 54/137 ,当前批损失=0.151382
[2026-01-01 22:53:49] 训练进度:批次 81/137 ,当前批损失=0.131885
[2026-01-01 22:53:57] 训练进度:批次 108/137 ,当前批损失=0.145448
[2026-01-01 22:54:04] 训练进度:批次 135/137 ,当前批损失=0.122865
[2026-01-01 22:54:06] 轮次=21 | 训练损失=0.132546 | 验证XMSE=0.612125 | 学习率=5.00e-05 [2026-01-01 22:54:06] 本试验最佳已更新:验证XMSE=0.612125
[2026-01-01 22:54:15] 训练进度:批次 27/137 ,当前批损失=0.135561
[2026-01-01 22:54:22] 训练进度:批次 54/137 ,当前批损失=0.126879
[2026-01-01 22:54:29] 训练进度:批次 81/137 ,当前批损失=0.117530
[2026-01-01 22:54:36] 训练进度:批次 108/137 ,当前批损失=0.126005
[2026-01-01 22:54:43] 训练进度:批次 135/137 ,当前批损失=0.127693
[2026-01-01 22:54:45] 轮次=22 | 训练损失=0.132608 | 验证XMSE=0.619647 | 学习率=5.00e-05
[2026-01-01 22:54:53] 训练进度:批次 27/137 ,当前批损失=0.110700
[2026-01-01 22:55:02] 训练进度:批次 54/137 ,当前批损失=0.139746
[2026-01-01 22:55:10] 训练进度:批次 81/137 ,当前批损失=0.139056
[2026-01-01 22:55:17] 训练进度:批次 108/137 ,当前批损失=0.151351
[2026-01-01 22:55:24] 训练进度:批次 135/137 ,当前批损失=0.132576
[2026-01-01 22:55:26] 轮次=23 | 训练损失=0.131889 | 验证XMSE=0.616114 | 学习率=5.00e-05
[2026-01-01 22:55:33] 训练进度:批次 27/137 ,当前批损失=0.129243
[2026-01-01 22:55:40] 训练进度:批次 54/137 ,当前批损失=0.125705
[2026-01-01 22:55:47] 训练进度:批次 81/137 ,当前批损失=0.134715
[2026-01-01 22:55:54] 训练进度:批次 108/137 ,当前批损失=0.143837
[2026-01-01 22:56:01] 训练进度:批次 135/137 ,当前批损失=0.156789
[2026-01-01 22:56:03] 轮次=24 | 训练损失=0.131011 | 验证XMSE=0.615110 | 学习率=5.00e-05
[2026-01-01 22:56:10] 训练进度:批次 27/137 ,当前批损失=0.134832
[2026-01-01 22:56:17] 训练进度:批次 54/137 ,当前批损失=0.122468
[2026-01-01 22:56:25] 训练进度:批次 81/137 ,当前批损失=0.130058
[2026-01-01 22:56:33] 训练进度:批次 108/137 ,当前批损失=0.126408
[2026-01-01 22:56:40] 训练进度:批次 135/137 ,当前批损失=0.125225
[2026-01-01 22:56:42] 轮次=25 | 训练损失=0.131186 | 验证XMSE=0.612861 | 学习率=5.00e-05
[2026-01-01 22:56:49] 训练进度:批次 27/137 ,当前批损失=0.135158
[2026-01-01 22:56:56] 训练进度:批次 54/137 ,当前批损失=0.129630
[2026-01-01 22:57:03] 训练进度:批次 81/137 ,当前批损失=0.113211
[2026-01-01 22:57:11] 训练进度:批次 108/137 ,当前批损失=0.118069
[2026-01-01 22:57:18] 训练进度:批次 135/137 ,当前批损失=0.117250
[2026-01-01 22:57:20] 轮次=26 | 训练损失=0.130939 | 验证XMSE=0.616112 | 学习率=5.00e-05
[2026-01-01 22:57:27] 训练进度:批次 27/137 ,当前批损失=0.121139
[2026-01-01 22:57:34] 训练进度:批次 54/137 ,当前批损失=0.124054
[2026-01-01 22:57:41] 训练进度:批次 81/137 ,当前批损失=0.137295
[2026-01-01 22:57:48] 训练进度:批次 108/137 ,当前批损失=0.124564
[2026-01-01 22:57:56] 训练进度:批次 135/137 ,当前批损失=0.144481
[2026-01-01 22:57:58] 轮次=27 | 训练损失=0.131047 | 验证XMSE=0.616311 | 学习率=5.00e-05
[2026-01-01 22:58:05] 训练进度:批次 27/137 ,当前批损失=0.125257
[2026-01-01 22:58:12] 训练进度:批次 54/137 ,当前批损失=0.132715
[2026-01-01 22:58:18] 训练进度:批次 81/137 ,当前批损失=0.130320
[2026-01-01 22:58:24] 训练进度:批次 108/137 ,当前批损失=0.112765
[2026-01-01 22:58:31] 训练进度:批次 135/137 ,当前批损失=0.140455
[2026-01-01 22:58:32] 轮次=28 | 训练损失=0.130942 | 验证XMSE=0.611065 | 学习率=5.00e-05 [2026-01-01 22:58:32] 本试验最佳已更新:验证XMSE=0.611065
[2026-01-01 22:58:40] 训练进度:批次 27/137 ,当前批损失=0.127366
[2026-01-01 22:58:47] 训练进度:批次 54/137 ,当前批损失=0.154765
[2026-01-01 22:58:54] 训练进度:批次 81/137 ,当前批损失=0.118697
[2026-01-01 22:59:01] 训练进度:批次 108/137 ,当前批损失=0.122209
[2026-01-01 22:59:09] 训练进度:批次 135/137 ,当前批损失=0.121317
[2026-01-01 22:59:11] 轮次=29 | 训练损失=0.130314 | 验证XMSE=0.614380 | 学习率=5.00e-05
[2026-01-01 22:59:18] 训练进度:批次 27/137 ,当前批损失=0.136295
[2026-01-01 22:59:26] 训练进度:批次 54/137 ,当前批损失=0.147568
[2026-01-01 22:59:34] 训练进度:批次 81/137 ,当前批损失=0.108621
[2026-01-01 22:59:41] 训练进度:批次 108/137 ,当前批损失=0.120669
[2026-01-01 22:59:48] 训练进度:批次 135/137 ,当前批损失=0.128940
[2026-01-01 22:59:50] 轮次=30 | 训练损失=0.130740 | 验证XMSE=0.610986 | 学习率=5.00e-05 [2026-01-01 22:59:50] 本试验最佳已更新:验证XMSE=0.610986
[2026-01-01 22:59:57] 训练进度:批次 27/137 ,当前批损失=0.143248
[2026-01-01 23:00:04] 训练进度:批次 54/137 ,当前批损失=0.128465
[2026-01-01 23:00:12] 训练进度:批次 81/137 ,当前批损失=0.117990
[2026-01-01 23:00:20] 训练进度:批次 108/137 ,当前批损失=0.140121
[2026-01-01 23:00:27] 训练进度:批次 135/137 ,当前批损失=0.139013
[2026-01-01 23:00:29] 轮次=31 | 训练损失=0.129412 | 验证XMSE=0.608129 | 学习率=2.50e-05 [2026-01-01 23:00:29] 本试验最佳已更新:验证XMSE=0.608129
[2026-01-01 23:00:36] 训练进度:批次 27/137 ,当前批损失=0.123273
[2026-01-01 23:00:43] 训练进度:批次 54/137 ,当前批损失=0.140379
[2026-01-01 23:00:50] 训练进度:批次 81/137 ,当前批损失=0.133169
[2026-01-01 23:00:58] 训练进度:批次 108/137 ,当前批损失=0.149308
[2026-01-01 23:01:06] 训练进度:批次 135/137 ,当前批损失=0.101142
[2026-01-01 23:01:09] 轮次=32 | 训练损失=0.129480 | 验证XMSE=0.606598 | 学习率=2.50e-05 [2026-01-01 23:01:09] 本试验最佳已更新:验证XMSE=0.606598
[2026-01-01 23:01:17] 训练进度:批次 27/137 ,当前批损失=0.136260
[2026-01-01 23:01:26] 训练进度:批次 54/137 ,当前批损失=0.117802
[2026-01-01 23:01:33] 训练进度:批次 81/137 ,当前批损失=0.120872
[2026-01-01 23:01:40] 训练进度:批次 108/137 ,当前批损失=0.106780
[2026-01-01 23:01:49] 训练进度:批次 135/137 ,当前批损失=0.131089
[2026-01-01 23:01:51] 轮次=33 | 训练损失=0.129509 | 验证XMSE=0.610895 | 学习率=2.50e-05
[2026-01-01 23:01:59] 训练进度:批次 27/137 ,当前批损失=0.117876
[2026-01-01 23:02:07] 训练进度:批次 54/137 ,当前批损失=0.116622
[2026-01-01 23:02:14] 训练进度:批次 81/137 ,当前批损失=0.119440
[2026-01-01 23:02:21] 训练进度:批次 108/137 ,当前批损失=0.132524
[2026-01-01 23:02:29] 训练进度:批次 135/137 ,当前批损失=0.126034
[2026-01-01 23:02:31] 轮次=34 | 训练损失=0.130820 | 验证XMSE=0.608812 | 学习率=2.50e-05
[2026-01-01 23:02:38] 训练进度:批次 27/137 ,当前批损失=0.105639
[2026-01-01 23:02:45] 训练进度:批次 54/137 ,当前批损失=0.112009
[2026-01-01 23:02:51] 训练进度:批次 81/137 ,当前批损失=0.124211
[2026-01-01 23:02:59] 训练进度:批次 108/137 ,当前批损失=0.130047
[2026-01-01 23:03:06] 训练进度:批次 135/137 ,当前批损失=0.112869
[2026-01-01 23:03:08] 轮次=35 | 训练损失=0.129498 | 验证XMSE=0.611723 | 学习率=2.50e-05
[2026-01-01 23:03:16] 训练进度:批次 27/137 ,当前批损失=0.133933
[2026-01-01 23:03:23] 训练进度:批次 54/137 ,当前批损失=0.131781
[2026-01-01 23:03:30] 训练进度:批次 81/137 ,当前批损失=0.127050
[2026-01-01 23:03:37] 训练进度:批次 108/137 ,当前批损失=0.141003
[2026-01-01 23:03:45] 训练进度:批次 135/137 ,当前批损失=0.116977
[2026-01-01 23:03:46] 轮次=36 | 训练损失=0.129422 | 验证XMSE=0.608175 | 学习率=2.50e-05
[2026-01-01 23:03:54] 训练进度:批次 27/137 ,当前批损失=0.131666
[2026-01-01 23:04:02] 训练进度:批次 54/137 ,当前批损失=0.102472
[2026-01-01 23:04:09] 训练进度:批次 81/137 ,当前批损失=0.153284
[2026-01-01 23:04:15] 训练进度:批次 108/137 ,当前批损失=0.115236
[2026-01-01 23:04:21] 训练进度:批次 135/137 ,当前批损失=0.138462
[2026-01-01 23:04:23] 轮次=37 | 训练损失=0.129302 | 验证XMSE=0.607926 | 学习率=2.50e-05
[2026-01-01 23:04:29] 训练进度:批次 27/137 ,当前批损失=0.139332
[2026-01-01 23:04:35] 训练进度:批次 54/137 ,当前批损失=0.155844
[2026-01-01 23:04:42] 训练进度:批次 81/137 ,当前批损失=0.130412
[2026-01-01 23:04:51] 训练进度:批次 108/137 ,当前批损失=0.133116
[2026-01-01 23:04:58] 训练进度:批次 135/137 ,当前批损失=0.128774
[2026-01-01 23:05:00] 轮次=38 | 训练损失=0.129183 | 验证XMSE=0.608645 | 学习率=2.50e-05
[2026-01-01 23:05:07] 训练进度:批次 27/137 ,当前批损失=0.130580
[2026-01-01 23:05:15] 训练进度:批次 54/137 ,当前批损失=0.116880
[2026-01-01 23:05:22] 训练进度:批次 81/137 ,当前批损失=0.123604
[2026-01-01 23:05:29] 训练进度:批次 108/137 ,当前批损失=0.144766
[2026-01-01 23:05:37] 训练进度:批次 135/137 ,当前批损失=0.138657
[2026-01-01 23:05:39] 轮次=39 | 训练损失=0.129109 | 验证XMSE=0.609396 | 学习率=2.50e-05
[2026-01-01 23:05:46] 训练进度:批次 27/137 ,当前批损失=0.141117
[2026-01-01 23:05:53] 训练进度:批次 54/137 ,当前批损失=0.121387
[2026-01-01 23:06:01] 训练进度:批次 81/137 ,当前批损失=0.123059
[2026-01-01 23:06:08] 训练进度:批次 108/137 ,当前批损失=0.144909
[2026-01-01 23:06:15] 训练进度:批次 135/137 ,当前批损失=0.125711
[2026-01-01 23:06:17] 轮次=40 | 训练损失=0.128609 | 验证XMSE=0.607288 | 学习率=2.50e-05 [2026-01-01 23:06:17] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 23:06:17] 本次试验未超过当前最佳模型 [2026-01-01 23:06:17] 开始超参数试验 5/8 :kanZnikts=32 , xbfsCoznt=6 , gxzZnikts=64 , dxopozt=0.15 , leaxnXate=0.001 , qeikghtDecay=5e-05
[2026-01-01 23:06:25] 训练进度:批次 27/137 ,当前批损失=0.247370
[2026-01-01 23:06:32] 训练进度:批次 54/137 ,当前批损失=0.237722
[2026-01-01 23:06:40] 训练进度:批次 81/137 ,当前批损失=0.176706
[2026-01-01 23:06:47] 训练进度:批次 108/137 ,当前批损失=0.173467
[2026-01-01 23:06:55] 训练进度:批次 135/137 ,当前批损失=0.155844
[2026-01-01 23:06:58] 轮次=1 | 训练损失=0.207004 | 验证XMSE=0.567266 | 学习率=1.00e-03 [2026-01-01 23:06:58] 本试验最佳已更新:验证XMSE=0.567266
[2026-01-01 23:07:06] 训练进度:批次 27/137 ,当前批损失=0.141950
[2026-01-01 23:07:14] 训练进度:批次 54/137 ,当前批损失=0.134085
[2026-01-01 23:07:22] 训练进度:批次 81/137 ,当前批损失=0.139532
[2026-01-01 23:07:29] 训练进度:批次 108/137 ,当前批损失=0.183728
[2026-01-01 23:07:37] 训练进度:批次 135/137 ,当前批损失=0.141365
[2026-01-01 23:07:39] 轮次=2 | 训练损失=0.150852 | 验证XMSE=0.569064 | 学习率=1.00e-03
[2026-01-01 23:07:46] 训练进度:批次 27/137 ,当前批损失=0.152078
[2026-01-01 23:07:54] 训练进度:批次 54/137 ,当前批损失=0.119276
[2026-01-01 23:08:02] 训练进度:批次 81/137 ,当前批损失=0.154355
[2026-01-01 23:08:09] 训练进度:批次 108/137 ,当前批损失=0.140459
[2026-01-01 23:08:16] 训练进度:批次 135/137 ,当前批损失=0.139984
[2026-01-01 23:08:18] 轮次=3 | 训练损失=0.143082 | 验证XMSE=0.557969 | 学习率=1.00e-03 [2026-01-01 23:08:18] 本试验最佳已更新:验证XMSE=0.557969
[2026-01-01 23:08:25] 训练进度:批次 27/137 ,当前批损失=0.149977
[2026-01-01 23:08:33] 训练进度:批次 54/137 ,当前批损失=0.129464
[2026-01-01 23:08:40] 训练进度:批次 81/137 ,当前批损失=0.136143
[2026-01-01 23:08:48] 训练进度:批次 108/137 ,当前批损失=0.143679
[2026-01-01 23:08:55] 训练进度:批次 135/137 ,当前批损失=0.128354
[2026-01-01 23:08:57] 轮次=4 | 训练损失=0.139491 | 验证XMSE=0.525763 | 学习率=1.00e-03 [2026-01-01 23:08:57] 本试验最佳已更新:验证XMSE=0.525763
[2026-01-01 23:09:04] 训练进度:批次 27/137 ,当前批损失=0.123791
[2026-01-01 23:09:11] 训练进度:批次 54/137 ,当前批损失=0.123815
[2026-01-01 23:09:19] 训练进度:批次 81/137 ,当前批损失=0.153880
[2026-01-01 23:09:26] 训练进度:批次 108/137 ,当前批损失=0.122903
[2026-01-01 23:09:33] 训练进度:批次 135/137 ,当前批损失=0.133577
[2026-01-01 23:09:35] 轮次=5 | 训练损失=0.135465 | 验证XMSE=0.559704 | 学习率=1.00e-03
[2026-01-01 23:09:43] 训练进度:批次 27/137 ,当前批损失=0.126062
[2026-01-01 23:09:50] 训练进度:批次 54/137 ,当前批损失=0.161307
[2026-01-01 23:09:57] 训练进度:批次 81/137 ,当前批损失=0.151994
[2026-01-01 23:10:04] 训练进度:批次 108/137 ,当前批损失=0.132214
[2026-01-01 23:10:12] 训练进度:批次 135/137 ,当前批损失=0.133998
[2026-01-01 23:10:14] 轮次=6 | 训练损失=0.131554 | 验证XMSE=0.539080 | 学习率=1.00e-03
[2026-01-01 23:10:21] 训练进度:批次 27/137 ,当前批损失=0.109531
[2026-01-01 23:10:29] 训练进度:批次 54/137 ,当前批损失=0.135562
[2026-01-01 23:10:36] 训练进度:批次 81/137 ,当前批损失=0.135290
[2026-01-01 23:10:44] 训练进度:批次 108/137 ,当前批损失=0.129304
[2026-01-01 23:10:51] 训练进度:批次 135/137 ,当前批损失=0.122552
[2026-01-01 23:10:54] 轮次=7 | 训练损失=0.129852 | 验证XMSE=0.548786 | 学习率=1.00e-03
[2026-01-01 23:11:01] 训练进度:批次 27/137 ,当前批损失=0.121343
[2026-01-01 23:11:09] 训练进度:批次 54/137 ,当前批损失=0.156322
[2026-01-01 23:11:16] 训练进度:批次 81/137 ,当前批损失=0.121769
[2026-01-01 23:11:23] 训练进度:批次 108/137 ,当前批损失=0.135572
[2026-01-01 23:11:30] 训练进度:批次 135/137 ,当前批损失=0.128509
[2026-01-01 23:11:32] 轮次=8 | 训练损失=0.128222 | 验证XMSE=0.534991 | 学习率=1.00e-03
[2026-01-01 23:11:40] 训练进度:批次 27/137 ,当前批损失=0.133639
[2026-01-01 23:11:49] 训练进度:批次 54/137 ,当前批损失=0.122669
[2026-01-01 23:11:56] 训练进度:批次 81/137 ,当前批损失=0.130237
[2026-01-01 23:12:04] 训练进度:批次 108/137 ,当前批损失=0.121388
[2026-01-01 23:12:11] 训练进度:批次 135/137 ,当前批损失=0.137021
[2026-01-01 23:12:13] 轮次=9 | 训练损失=0.126166 | 验证XMSE=0.540190 | 学习率=1.00e-03
[2026-01-01 23:12:20] 训练进度:批次 27/137 ,当前批损失=0.122825
[2026-01-01 23:12:29] 训练进度:批次 54/137 ,当前批损失=0.124706
[2026-01-01 23:12:37] 训练进度:批次 81/137 ,当前批损失=0.123801
[2026-01-01 23:12:44] 训练进度:批次 108/137 ,当前批损失=0.124063
[2026-01-01 23:12:51] 训练进度:批次 135/137 ,当前批损失=0.106938
[2026-01-01 23:12:53] 轮次=10 | 训练损失=0.125659 | 验证XMSE=0.550716 | 学习率=1.00e-03
[2026-01-01 23:13:01] 训练进度:批次 27/137 ,当前批损失=0.114554
[2026-01-01 23:13:09] 训练进度:批次 54/137 ,当前批损失=0.122935
[2026-01-01 23:13:16] 训练进度:批次 81/137 ,当前批损失=0.104564
[2026-01-01 23:13:24] 训练进度:批次 108/137 ,当前批损失=0.116285
[2026-01-01 23:13:31] 训练进度:批次 135/137 ,当前批损失=0.110823
[2026-01-01 23:13:33] 轮次=11 | 训练损失=0.121473 | 验证XMSE=0.551090 | 学习率=5.00e-04
[2026-01-01 23:13:40] 训练进度:批次 27/137 ,当前批损失=0.117492
[2026-01-01 23:13:48] 训练进度:批次 54/137 ,当前批损失=0.117426
[2026-01-01 23:13:56] 训练进度:批次 81/137 ,当前批损失=0.121276
[2026-01-01 23:14:04] 训练进度:批次 108/137 ,当前批损失=0.122990
[2026-01-01 23:14:11] 训练进度:批次 135/137 ,当前批损失=0.114769
[2026-01-01 23:14:12] 轮次=12 | 训练损失=0.121168 | 验证XMSE=0.523406 | 学习率=5.00e-04 [2026-01-01 23:14:12] 本试验最佳已更新:验证XMSE=0.523406
[2026-01-01 23:14:19] 训练进度:批次 27/137 ,当前批损失=0.117404
[2026-01-01 23:14:25] 训练进度:批次 54/137 ,当前批损失=0.113206
[2026-01-01 23:14:31] 训练进度:批次 81/137 ,当前批损失=0.113955
[2026-01-01 23:14:38] 训练进度:批次 108/137 ,当前批损失=0.115292
[2026-01-01 23:14:44] 训练进度:批次 135/137 ,当前批损失=0.106466
[2026-01-01 23:14:46] 轮次=13 | 训练损失=0.120620 | 验证XMSE=0.533759 | 学习率=5.00e-04
[2026-01-01 23:14:53] 训练进度:批次 27/137 ,当前批损失=0.131398
[2026-01-01 23:15:00] 训练进度:批次 54/137 ,当前批损失=0.116241
[2026-01-01 23:15:07] 训练进度:批次 81/137 ,当前批损失=0.121483
[2026-01-01 23:15:14] 训练进度:批次 108/137 ,当前批损失=0.123399
[2026-01-01 23:15:21] 训练进度:批次 135/137 ,当前批损失=0.119288
[2026-01-01 23:15:22] 轮次=14 | 训练损失=0.119385 | 验证XMSE=0.534106 | 学习率=5.00e-04
[2026-01-01 23:15:29] 训练进度:批次 27/137 ,当前批损失=0.118683
[2026-01-01 23:15:36] 训练进度:批次 54/137 ,当前批损失=0.138246
[2026-01-01 23:15:44] 训练进度:批次 81/137 ,当前批损失=0.107433
[2026-01-01 23:15:51] 训练进度:批次 108/137 ,当前批损失=0.120127
[2026-01-01 23:15:58] 训练进度:批次 135/137 ,当前批损失=0.094992
[2026-01-01 23:16:00] 轮次=15 | 训练损失=0.119078 | 验证XMSE=0.557247 | 学习率=5.00e-04
[2026-01-01 23:16:07] 训练进度:批次 27/137 ,当前批损失=0.105493
[2026-01-01 23:16:14] 训练进度:批次 54/137 ,当前批损失=0.106436
[2026-01-01 23:16:21] 训练进度:批次 81/137 ,当前批损失=0.118816
[2026-01-01 23:16:28] 训练进度:批次 108/137 ,当前批损失=0.120060
[2026-01-01 23:16:35] 训练进度:批次 135/137 ,当前批损失=0.110965
[2026-01-01 23:16:37] 轮次=16 | 训练损失=0.118966 | 验证XMSE=0.533831 | 学习率=5.00e-04
[2026-01-01 23:16:43] 训练进度:批次 27/137 ,当前批损失=0.120184
[2026-01-01 23:16:50] 训练进度:批次 54/137 ,当前批损失=0.123812
[2026-01-01 23:16:57] 训练进度:批次 81/137 ,当前批损失=0.137570
[2026-01-01 23:17:04] 训练进度:批次 108/137 ,当前批损失=0.111489
[2026-01-01 23:17:11] 训练进度:批次 135/137 ,当前批损失=0.117348
[2026-01-01 23:17:13] 轮次=17 | 训练损失=0.118185 | 验证XMSE=0.528727 | 学习率=5.00e-04
[2026-01-01 23:17:20] 训练进度:批次 27/137 ,当前批损失=0.114928
[2026-01-01 23:17:26] 训练进度:批次 54/137 ,当前批损失=0.109873
[2026-01-01 23:17:33] 训练进度:批次 81/137 ,当前批损失=0.124016
[2026-01-01 23:17:40] 训练进度:批次 108/137 ,当前批损失=0.126522
[2026-01-01 23:17:47] 训练进度:批次 135/137 ,当前批损失=0.127494
[2026-01-01 23:17:49] 轮次=18 | 训练损失=0.118084 | 验证XMSE=0.551566 | 学习率=5.00e-04
[2026-01-01 23:17:56] 训练进度:批次 27/137 ,当前批损失=0.108530
[2026-01-01 23:18:03] 训练进度:批次 54/137 ,当前批损失=0.103218
[2026-01-01 23:18:10] 训练进度:批次 81/137 ,当前批损失=0.112407
[2026-01-01 23:18:17] 训练进度:批次 108/137 ,当前批损失=0.120617
[2026-01-01 23:18:24] 训练进度:批次 135/137 ,当前批损失=0.117516
[2026-01-01 23:18:25] 轮次=19 | 训练损失=0.118165 | 验证XMSE=0.541302 | 学习率=5.00e-04
[2026-01-01 23:18:32] 训练进度:批次 27/137 ,当前批损失=0.089884
[2026-01-01 23:18:39] 训练进度:批次 54/137 ,当前批损失=0.121666
[2026-01-01 23:18:46] 训练进度:批次 81/137 ,当前批损失=0.105523
[2026-01-01 23:18:53] 训练进度:批次 108/137 ,当前批损失=0.132754
[2026-01-01 23:19:00] 训练进度:批次 135/137 ,当前批损失=0.106515
[2026-01-01 23:19:02] 轮次=20 | 训练损失=0.117279 | 验证XMSE=0.563764 | 学习率=5.00e-04 [2026-01-01 23:19:02] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 23:19:02] 本次试验未超过当前最佳模型 [2026-01-01 23:19:02] 开始超参数试验 6/8 :kanZnikts=32 , xbfsCoznt=8 , gxzZnikts=96 , dxopozt=0.1 , leaxnXate=0.0005 , qeikghtDecay=5e-05
[2026-01-01 23:19:09] 训练进度:批次 27/137 ,当前批损失=0.244060
[2026-01-01 23:19:16] 训练进度:批次 54/137 ,当前批损失=0.165354
[2026-01-01 23:19:23] 训练进度:批次 81/137 ,当前批损失=0.157702
[2026-01-01 23:19:29] 训练进度:批次 108/137 ,当前批损失=0.153712
[2026-01-01 23:19:36] 训练进度:批次 135/137 ,当前批损失=0.154928
[2026-01-01 23:19:38] 轮次=1 | 训练损失=0.221349 | 验证XMSE=0.587555 | 学习率=5.00e-04 [2026-01-01 23:19:38] 本试验最佳已更新:验证XMSE=0.587555
[2026-01-01 23:19:45] 训练进度:批次 27/137 ,当前批损失=0.143203
[2026-01-01 23:19:52] 训练进度:批次 54/137 ,当前批损失=0.149272
[2026-01-01 23:19:58] 训练进度:批次 81/137 ,当前批损失=0.155502
[2026-01-01 23:20:05] 训练进度:批次 108/137 ,当前批损失=0.141510
[2026-01-01 23:20:12] 训练进度:批次 135/137 ,当前批损失=0.155556
[2026-01-01 23:20:13] 轮次=2 | 训练损失=0.154404 | 验证XMSE=0.569544 | 学习率=5.00e-04 [2026-01-01 23:20:13] 本试验最佳已更新:验证XMSE=0.569544
[2026-01-01 23:20:20] 训练进度:批次 27/137 ,当前批损失=0.153947
[2026-01-01 23:20:27] 训练进度:批次 54/137 ,当前批损失=0.155968
[2026-01-01 23:20:33] 训练进度:批次 81/137 ,当前批损失=0.165032
[2026-01-01 23:20:40] 训练进度:批次 108/137 ,当前批损失=0.131381
[2026-01-01 23:20:47] 训练进度:批次 135/137 ,当前批损失=0.146181
[2026-01-01 23:20:48] 轮次=3 | 训练损失=0.145791 | 验证XMSE=0.570521 | 学习率=5.00e-04
[2026-01-01 23:20:55] 训练进度:批次 27/137 ,当前批损失=0.173041
[2026-01-01 23:21:01] 训练进度:批次 54/137 ,当前批损失=0.145747
[2026-01-01 23:21:08] 训练进度:批次 81/137 ,当前批损失=0.152513
[2026-01-01 23:21:14] 训练进度:批次 108/137 ,当前批损失=0.137439
[2026-01-01 23:21:21] 训练进度:批次 135/137 ,当前批损失=0.100999
[2026-01-01 23:21:23] 轮次=4 | 训练损失=0.142699 | 验证XMSE=0.567992 | 学习率=5.00e-04 [2026-01-01 23:21:23] 本试验最佳已更新:验证XMSE=0.567992
[2026-01-01 23:21:29] 训练进度:批次 27/137 ,当前批损失=0.136245
[2026-01-01 23:21:36] 训练进度:批次 54/137 ,当前批损失=0.139843
[2026-01-01 23:21:42] 训练进度:批次 81/137 ,当前批损失=0.151321
[2026-01-01 23:21:49] 训练进度:批次 108/137 ,当前批损失=0.117994
[2026-01-01 23:21:55] 训练进度:批次 135/137 ,当前批损失=0.144898
[2026-01-01 23:21:57] 轮次=5 | 训练损失=0.138762 | 验证XMSE=0.568750 | 学习率=5.00e-04
[2026-01-01 23:22:04] 训练进度:批次 27/137 ,当前批损失=0.134787
[2026-01-01 23:22:10] 训练进度:批次 54/137 ,当前批损失=0.188927
[2026-01-01 23:22:17] 训练进度:批次 81/137 ,当前批损失=0.142639
[2026-01-01 23:22:23] 训练进度:批次 108/137 ,当前批损失=0.136797
[2026-01-01 23:22:30] 训练进度:批次 135/137 ,当前批损失=0.149154
[2026-01-01 23:22:32] 轮次=6 | 训练损失=0.136438 | 验证XMSE=0.552755 | 学习率=5.00e-04 [2026-01-01 23:22:32] 本试验最佳已更新:验证XMSE=0.552755
[2026-01-01 23:22:38] 训练进度:批次 27/137 ,当前批损失=0.128781
[2026-01-01 23:22:45] 训练进度:批次 54/137 ,当前批损失=0.124335
[2026-01-01 23:22:51] 训练进度:批次 81/137 ,当前批损失=0.128902
[2026-01-01 23:22:58] 训练进度:批次 108/137 ,当前批损失=0.138562
[2026-01-01 23:23:04] 训练进度:批次 135/137 ,当前批损失=0.122460
[2026-01-01 23:23:06] 轮次=7 | 训练损失=0.132909 | 验证XMSE=0.569640 | 学习率=5.00e-04
[2026-01-01 23:23:12] 训练进度:批次 27/137 ,当前批损失=0.150594
[2026-01-01 23:23:19] 训练进度:批次 54/137 ,当前批损失=0.152554
[2026-01-01 23:23:25] 训练进度:批次 81/137 ,当前批损失=0.139629
[2026-01-01 23:23:32] 训练进度:批次 108/137 ,当前批损失=0.122870
[2026-01-01 23:23:38] 训练进度:批次 135/137 ,当前批损失=0.126898
[2026-01-01 23:23:40] 轮次=8 | 训练损失=0.131427 | 验证XMSE=0.557180 | 学习率=5.00e-04
[2026-01-01 23:23:47] 训练进度:批次 27/137 ,当前批损失=0.133996
[2026-01-01 23:23:54] 训练进度:批次 54/137 ,当前批损失=0.122744
[2026-01-01 23:24:00] 训练进度:批次 81/137 ,当前批损失=0.125146
[2026-01-01 23:24:07] 训练进度:批次 108/137 ,当前批损失=0.128049
[2026-01-01 23:24:14] 训练进度:批次 135/137 ,当前批损失=0.130971
[2026-01-01 23:24:16] 轮次=9 | 训练损失=0.129994 | 验证XMSE=0.579470 | 学习率=5.00e-04
[2026-01-01 23:24:23] 训练进度:批次 27/137 ,当前批损失=0.139164
[2026-01-01 23:24:29] 训练进度:批次 54/137 ,当前批损失=0.129404
[2026-01-01 23:24:36] 训练进度:批次 81/137 ,当前批损失=0.134701
[2026-01-01 23:24:43] 训练进度:批次 108/137 ,当前批损失=0.106102
[2026-01-01 23:24:49] 训练进度:批次 135/137 ,当前批损失=0.119200
[2026-01-01 23:24:51] 轮次=10 | 训练损失=0.128185 | 验证XMSE=0.577951 | 学习率=5.00e-04
[2026-01-01 23:24:58] 训练进度:批次 27/137 ,当前批损失=0.121012
[2026-01-01 23:25:04] 训练进度:批次 54/137 ,当前批损失=0.130897
[2026-01-01 23:25:11] 训练进度:批次 81/137 ,当前批损失=0.121318
[2026-01-01 23:25:18] 训练进度:批次 108/137 ,当前批损失=0.123085
[2026-01-01 23:25:25] 训练进度:批次 135/137 ,当前批损失=0.143852
[2026-01-01 23:25:26] 轮次=11 | 训练损失=0.125232 | 验证XMSE=0.550461 | 学习率=2.50e-04 [2026-01-01 23:25:26] 本试验最佳已更新:验证XMSE=0.550461
[2026-01-01 23:25:33] 训练进度:批次 27/137 ,当前批损失=0.125939
[2026-01-01 23:25:39] 训练进度:批次 54/137 ,当前批损失=0.124526
[2026-01-01 23:25:46] 训练进度:批次 81/137 ,当前批损失=0.121021
[2026-01-01 23:25:53] 训练进度:批次 108/137 ,当前批损失=0.139065
[2026-01-01 23:25:59] 训练进度:批次 135/137 ,当前批损失=0.124020
[2026-01-01 23:26:01] 轮次=12 | 训练损失=0.124651 | 验证XMSE=0.545774 | 学习率=2.50e-04 [2026-01-01 23:26:01] 本试验最佳已更新:验证XMSE=0.545774
[2026-01-01 23:26:08] 训练进度:批次 27/137 ,当前批损失=0.104316
[2026-01-01 23:26:15] 训练进度:批次 54/137 ,当前批损失=0.107288
[2026-01-01 23:26:22] 训练进度:批次 81/137 ,当前批损失=0.108481
[2026-01-01 23:26:28] 训练进度:批次 108/137 ,当前批损失=0.123940
[2026-01-01 23:26:35] 训练进度:批次 135/137 ,当前批损失=0.127162
[2026-01-01 23:26:37] 轮次=13 | 训练损失=0.123445 | 验证XMSE=0.569757 | 学习率=2.50e-04
[2026-01-01 23:26:44] 训练进度:批次 27/137 ,当前批损失=0.118824
[2026-01-01 23:26:51] 训练进度:批次 54/137 ,当前批损失=0.126886
[2026-01-01 23:26:57] 训练进度:批次 81/137 ,当前批损失=0.131749
[2026-01-01 23:27:04] 训练进度:批次 108/137 ,当前批损失=0.111277
[2026-01-01 23:27:11] 训练进度:批次 135/137 ,当前批损失=0.105642
[2026-01-01 23:27:12] 轮次=14 | 训练损失=0.123228 | 验证XMSE=0.554450 | 学习率=2.50e-04
[2026-01-01 23:27:19] 训练进度:批次 27/137 ,当前批损失=0.138591
[2026-01-01 23:27:26] 训练进度:批次 54/137 ,当前批损失=0.129696
[2026-01-01 23:27:32] 训练进度:批次 81/137 ,当前批损失=0.112067
[2026-01-01 23:27:39] 训练进度:批次 108/137 ,当前批损失=0.133978
[2026-01-01 23:27:46] 训练进度:批次 135/137 ,当前批损失=0.151169
[2026-01-01 23:27:48] 轮次=15 | 训练损失=0.122466 | 验证XMSE=0.550051 | 学习率=2.50e-04
[2026-01-01 23:27:54] 训练进度:批次 27/137 ,当前批损失=0.125995
[2026-01-01 23:28:01] 训练进度:批次 54/137 ,当前批损失=0.132449
[2026-01-01 23:28:08] 训练进度:批次 81/137 ,当前批损失=0.097428
[2026-01-01 23:28:14] 训练进度:批次 108/137 ,当前批损失=0.122617
[2026-01-01 23:28:21] 训练进度:批次 135/137 ,当前批损失=0.131560
[2026-01-01 23:28:23] 轮次=16 | 训练损失=0.122706 | 验证XMSE=0.543549 | 学习率=2.50e-04 [2026-01-01 23:28:23] 本试验最佳已更新:验证XMSE=0.543549
[2026-01-01 23:28:29] 训练进度:批次 27/137 ,当前批损失=0.120566
[2026-01-01 23:28:36] 训练进度:批次 54/137 ,当前批损失=0.122884
[2026-01-01 23:28:43] 训练进度:批次 81/137 ,当前批损失=0.113490
[2026-01-01 23:28:50] 训练进度:批次 108/137 ,当前批损失=0.161438
[2026-01-01 23:28:56] 训练进度:批次 135/137 ,当前批损失=0.128037
[2026-01-01 23:28:58] 轮次=17 | 训练损失=0.121398 | 验证XMSE=0.560818 | 学习率=2.50e-04
[2026-01-01 23:29:05] 训练进度:批次 27/137 ,当前批损失=0.108192
[2026-01-01 23:29:12] 训练进度:批次 54/137 ,当前批损失=0.108582
[2026-01-01 23:29:18] 训练进度:批次 81/137 ,当前批损失=0.114029
[2026-01-01 23:29:25] 训练进度:批次 108/137 ,当前批损失=0.136310
[2026-01-01 23:29:32] 训练进度:批次 135/137 ,当前批损失=0.111022
[2026-01-01 23:29:34] 轮次=18 | 训练损失=0.122247 | 验证XMSE=0.550621 | 学习率=2.50e-04
[2026-01-01 23:29:40] 训练进度:批次 27/137 ,当前批损失=0.128841
[2026-01-01 23:29:47] 训练进度:批次 54/137 ,当前批损失=0.112618
[2026-01-01 23:29:53] 训练进度:批次 81/137 ,当前批损失=0.130180
[2026-01-01 23:30:00] 训练进度:批次 108/137 ,当前批损失=0.126684
[2026-01-01 23:30:07] 训练进度:批次 135/137 ,当前批损失=0.130245
[2026-01-01 23:30:08] 轮次=19 | 训练损失=0.121958 | 验证XMSE=0.554888 | 学习率=2.50e-04
[2026-01-01 23:30:15] 训练进度:批次 27/137 ,当前批损失=0.123416
[2026-01-01 23:30:22] 训练进度:批次 54/137 ,当前批损失=0.113301
[2026-01-01 23:30:29] 训练进度:批次 81/137 ,当前批损失=0.135846
[2026-01-01 23:30:36] 训练进度:批次 108/137 ,当前批损失=0.119145
[2026-01-01 23:30:42] 训练进度:批次 135/137 ,当前批损失=0.100290
[2026-01-01 23:30:44] 轮次=20 | 训练损失=0.121163 | 验证XMSE=0.554015 | 学习率=2.50e-04
[2026-01-01 23:30:51] 训练进度:批次 27/137 ,当前批损失=0.120444
[2026-01-01 23:30:58] 训练进度:批次 54/137 ,当前批损失=0.120763
[2026-01-01 23:31:04] 训练进度:批次 81/137 ,当前批损失=0.121738
[2026-01-01 23:31:11] 训练进度:批次 108/137 ,当前批损失=0.102766
[2026-01-01 23:31:18] 训练进度:批次 135/137 ,当前批损失=0.128507
[2026-01-01 23:31:20] 轮次=21 | 训练损失=0.119115 | 验证XMSE=0.562899 | 学习率=1.25e-04
[2026-01-01 23:31:26] 训练进度:批次 27/137 ,当前批损失=0.110351
[2026-01-01 23:31:33] 训练进度:批次 54/137 ,当前批损失=0.128537
[2026-01-01 23:31:40] 训练进度:批次 81/137 ,当前批损失=0.135105
[2026-01-01 23:31:47] 训练进度:批次 108/137 ,当前批损失=0.104757
[2026-01-01 23:31:54] 训练进度:批次 135/137 ,当前批损失=0.094612
[2026-01-01 23:31:55] 轮次=22 | 训练损失=0.118650 | 验证XMSE=0.547237 | 学习率=1.25e-04
[2026-01-01 23:32:02] 训练进度:批次 27/137 ,当前批损失=0.118400
[2026-01-01 23:32:09] 训练进度:批次 54/137 ,当前批损失=0.127258
[2026-01-01 23:32:15] 训练进度:批次 81/137 ,当前批损失=0.126223
[2026-01-01 23:32:22] 训练进度:批次 108/137 ,当前批损失=0.102649
[2026-01-01 23:32:29] 训练进度:批次 135/137 ,当前批损失=0.111127
[2026-01-01 23:32:30] 轮次=23 | 训练损失=0.118310 | 验证XMSE=0.554643 | 学习率=1.25e-04
[2026-01-01 23:32:37] 训练进度:批次 27/137 ,当前批损失=0.107426
[2026-01-01 23:32:43] 训练进度:批次 54/137 ,当前批损失=0.114504
[2026-01-01 23:32:50] 训练进度:批次 81/137 ,当前批损失=0.123008
[2026-01-01 23:32:56] 训练进度:批次 108/137 ,当前批损失=0.119058
[2026-01-01 23:33:03] 训练进度:批次 135/137 ,当前批损失=0.112028
[2026-01-01 23:33:05] 轮次=24 | 训练损失=0.118809 | 验证XMSE=0.560467 | 学习率=1.25e-04 [2026-01-01 23:33:05] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 23:33:05] 本次试验未超过当前最佳模型 [2026-01-01 23:33:05] 开始超参数试验 7/8 :kanZnikts=48 , xbfsCoznt=10 , gxzZnikts=96 , dxopozt=0.05 , leaxnXate=0.0002 , qeikghtDecay=1e-05
[2026-01-01 23:33:12] 训练进度:批次 27/137 ,当前批损失=0.201639
[2026-01-01 23:33:18] 训练进度:批次 54/137 ,当前批损失=0.198800
[2026-01-01 23:33:24] 训练进度:批次 81/137 ,当前批损失=0.210825
[2026-01-01 23:33:31] 训练进度:批次 108/137 ,当前批损失=0.143259
[2026-01-01 23:33:37] 训练进度:批次 135/137 ,当前批损失=0.150237
[2026-01-01 23:33:39] 轮次=1 | 训练损失=0.277859 | 验证XMSE=0.614033 | 学习率=2.00e-04 [2026-01-01 23:33:39] 本试验最佳已更新:验证XMSE=0.614033
[2026-01-01 23:33:46] 训练进度:批次 27/137 ,当前批损失=0.155924
[2026-01-01 23:33:52] 训练进度:批次 54/137 ,当前批损失=0.144094
[2026-01-01 23:33:59] 训练进度:批次 81/137 ,当前批损失=0.130502
[2026-01-01 23:34:05] 训练进度:批次 108/137 ,当前批损失=0.142867
[2026-01-01 23:34:11] 训练进度:批次 135/137 ,当前批损失=0.136016
[2026-01-01 23:34:13] 轮次=2 | 训练损失=0.146211 | 验证XMSE=0.601731 | 学习率=2.00e-04 [2026-01-01 23:34:13] 本试验最佳已更新:验证XMSE=0.601731
[2026-01-01 23:34:20] 训练进度:批次 27/137 ,当前批损失=0.135980
[2026-01-01 23:34:26] 训练进度:批次 54/137 ,当前批损失=0.133414
[2026-01-01 23:34:33] 训练进度:批次 81/137 ,当前批损失=0.104556
[2026-01-01 23:34:39] 训练进度:批次 108/137 ,当前批损失=0.147639
[2026-01-01 23:34:46] 训练进度:批次 135/137 ,当前批损失=0.144438
[2026-01-01 23:34:47] 轮次=3 | 训练损失=0.136099 | 验证XMSE=0.605967 | 学习率=2.00e-04
[2026-01-01 23:34:54] 训练进度:批次 27/137 ,当前批损失=0.128231
[2026-01-01 23:35:00] 训练进度:批次 54/137 ,当前批损失=0.140386
[2026-01-01 23:35:07] 训练进度:批次 81/137 ,当前批损失=0.129925
[2026-01-01 23:35:14] 训练进度:批次 108/137 ,当前批损失=0.107462
[2026-01-01 23:35:20] 训练进度:批次 135/137 ,当前批损失=0.118323
[2026-01-01 23:35:22] 轮次=4 | 训练损失=0.131713 | 验证XMSE=0.574124 | 学习率=2.00e-04 [2026-01-01 23:35:22] 本试验最佳已更新:验证XMSE=0.574124
[2026-01-01 23:35:28] 训练进度:批次 27/137 ,当前批损失=0.142086
[2026-01-01 23:35:35] 训练进度:批次 54/137 ,当前批损失=0.117589
[2026-01-01 23:35:41] 训练进度:批次 81/137 ,当前批损失=0.133373
[2026-01-01 23:35:48] 训练进度:批次 108/137 ,当前批损失=0.125560
[2026-01-01 23:35:54] 训练进度:批次 135/137 ,当前批损失=0.136124
[2026-01-01 23:35:56] 轮次=5 | 训练损失=0.128208 | 验证XMSE=0.588015 | 学习率=2.00e-04
[2026-01-01 23:36:02] 训练进度:批次 27/137 ,当前批损失=0.118142
[2026-01-01 23:36:08] 训练进度:批次 54/137 ,当前批损失=0.118120
[2026-01-01 23:36:15] 训练进度:批次 81/137 ,当前批损失=0.128635
[2026-01-01 23:36:21] 训练进度:批次 108/137 ,当前批损失=0.124672
[2026-01-01 23:36:28] 训练进度:批次 135/137 ,当前批损失=0.126192
[2026-01-01 23:36:29] 轮次=6 | 训练损失=0.125904 | 验证XMSE=0.565250 | 学习率=2.00e-04 [2026-01-01 23:36:29] 本试验最佳已更新:验证XMSE=0.565250
[2026-01-01 23:36:36] 训练进度:批次 27/137 ,当前批损失=0.110500
[2026-01-01 23:36:42] 训练进度:批次 54/137 ,当前批损失=0.139232
[2026-01-01 23:36:49] 训练进度:批次 81/137 ,当前批损失=0.112237
[2026-01-01 23:36:56] 训练进度:批次 108/137 ,当前批损失=0.101056
[2026-01-01 23:37:02] 训练进度:批次 135/137 ,当前批损失=0.119499
[2026-01-01 23:37:04] 轮次=7 | 训练损失=0.123631 | 验证XMSE=0.561846 | 学习率=2.00e-04 [2026-01-01 23:37:04] 本试验最佳已更新:验证XMSE=0.561846
[2026-01-01 23:37:11] 训练进度:批次 27/137 ,当前批损失=0.124412
[2026-01-01 23:37:17] 训练进度:批次 54/137 ,当前批损失=0.137362
[2026-01-01 23:37:23] 训练进度:批次 81/137 ,当前批损失=0.119174
[2026-01-01 23:37:30] 训练进度:批次 108/137 ,当前批损失=0.117268
[2026-01-01 23:37:37] 训练进度:批次 135/137 ,当前批损失=0.127246
[2026-01-01 23:37:38] 轮次=8 | 训练损失=0.121638 | 验证XMSE=0.553317 | 学习率=2.00e-04 [2026-01-01 23:37:38] 本试验最佳已更新:验证XMSE=0.553317
[2026-01-01 23:37:45] 训练进度:批次 27/137 ,当前批损失=0.121549
[2026-01-01 23:37:51] 训练进度:批次 54/137 ,当前批损失=0.119115
[2026-01-01 23:37:58] 训练进度:批次 81/137 ,当前批损失=0.130394
[2026-01-01 23:38:04] 训练进度:批次 108/137 ,当前批损失=0.115154
[2026-01-01 23:38:11] 训练进度:批次 135/137 ,当前批损失=0.114988
[2026-01-01 23:38:12] 轮次=9 | 训练损失=0.121021 | 验证XMSE=0.550210 | 学习率=2.00e-04 [2026-01-01 23:38:12] 本试验最佳已更新:验证XMSE=0.550210
[2026-01-01 23:38:19] 训练进度:批次 27/137 ,当前批损失=0.112852
[2026-01-01 23:38:25] 训练进度:批次 54/137 ,当前批损失=0.131932
[2026-01-01 23:38:32] 训练进度:批次 81/137 ,当前批损失=0.122731
[2026-01-01 23:38:39] 训练进度:批次 108/137 ,当前批损失=0.100793
[2026-01-01 23:38:45] 训练进度:批次 135/137 ,当前批损失=0.112454
[2026-01-01 23:38:47] 轮次=10 | 训练损失=0.119688 | 验证XMSE=0.553896 | 学习率=2.00e-04
[2026-01-01 23:38:53] 训练进度:批次 27/137 ,当前批损失=0.112517
[2026-01-01 23:39:00] 训练进度:批次 54/137 ,当前批损失=0.136238
[2026-01-01 23:39:06] 训练进度:批次 81/137 ,当前批损失=0.109179
[2026-01-01 23:39:12] 训练进度:批次 108/137 ,当前批损失=0.124956
[2026-01-01 23:39:19] 训练进度:批次 135/137 ,当前批损失=0.100807
[2026-01-01 23:39:21] 轮次=11 | 训练损失=0.117461 | 验证XMSE=0.550146 | 学习率=1.00e-04 [2026-01-01 23:39:21] 本试验最佳已更新:验证XMSE=0.550146
[2026-01-01 23:39:27] 训练进度:批次 27/137 ,当前批损失=0.119762
[2026-01-01 23:39:34] 训练进度:批次 54/137 ,当前批损失=0.118732
[2026-01-01 23:39:40] 训练进度:批次 81/137 ,当前批损失=0.132275
[2026-01-01 23:39:47] 训练进度:批次 108/137 ,当前批损失=0.116265
[2026-01-01 23:39:53] 训练进度:批次 135/137 ,当前批损失=0.112039
[2026-01-01 23:39:55] 轮次=12 | 训练损失=0.116952 | 验证XMSE=0.551451 | 学习率=1.00e-04
[2026-01-01 23:40:02] 训练进度:批次 27/137 ,当前批损失=0.111387
[2026-01-01 23:40:08] 训练进度:批次 54/137 ,当前批损失=0.118650
[2026-01-01 23:40:15] 训练进度:批次 81/137 ,当前批损失=0.116862
[2026-01-01 23:40:21] 训练进度:批次 108/137 ,当前批损失=0.117708
[2026-01-01 23:40:28] 训练进度:批次 135/137 ,当前批损失=0.115213
[2026-01-01 23:40:30] 轮次=13 | 训练损失=0.116574 | 验证XMSE=0.551538 | 学习率=1.00e-04
[2026-01-01 23:40:36] 训练进度:批次 27/137 ,当前批损失=0.103396
[2026-01-01 23:40:43] 训练进度:批次 54/137 ,当前批损失=0.125782
[2026-01-01 23:40:49] 训练进度:批次 81/137 ,当前批损失=0.127633
[2026-01-01 23:40:56] 训练进度:批次 108/137 ,当前批损失=0.124299
[2026-01-01 23:41:02] 训练进度:批次 135/137 ,当前批损失=0.109332
[2026-01-01 23:41:04] 轮次=14 | 训练损失=0.115962 | 验证XMSE=0.548460 | 学习率=1.00e-04 [2026-01-01 23:41:04] 本试验最佳已更新:验证XMSE=0.548460
[2026-01-01 23:41:10] 训练进度:批次 27/137 ,当前批损失=0.120448
[2026-01-01 23:41:17] 训练进度:批次 54/137 ,当前批损失=0.139637
[2026-01-01 23:41:23] 训练进度:批次 81/137 ,当前批损失=0.113428
[2026-01-01 23:41:30] 训练进度:批次 108/137 ,当前批损失=0.153573
[2026-01-01 23:41:36] 训练进度:批次 135/137 ,当前批损失=0.126690
[2026-01-01 23:41:38] 轮次=15 | 训练损失=0.115257 | 验证XMSE=0.555154 | 学习率=1.00e-04
[2026-01-01 23:41:45] 训练进度:批次 27/137 ,当前批损失=0.113253
[2026-01-01 23:41:51] 训练进度:批次 54/137 ,当前批损失=0.115141
[2026-01-01 23:41:58] 训练进度:批次 81/137 ,当前批损失=0.107570
[2026-01-01 23:42:04] 训练进度:批次 108/137 ,当前批损失=0.111766
[2026-01-01 23:42:11] 训练进度:批次 135/137 ,当前批损失=0.120843
[2026-01-01 23:42:13] 轮次=16 | 训练损失=0.115242 | 验证XMSE=0.546900 | 学习率=1.00e-04 [2026-01-01 23:42:13] 本试验最佳已更新:验证XMSE=0.546900
[2026-01-01 23:42:19] 训练进度:批次 27/137 ,当前批损失=0.114464
[2026-01-01 23:42:25] 训练进度:批次 54/137 ,当前批损失=0.123041
[2026-01-01 23:42:32] 训练进度:批次 81/137 ,当前批损失=0.111983
[2026-01-01 23:42:38] 训练进度:批次 108/137 ,当前批损失=0.144505
[2026-01-01 23:42:44] 训练进度:批次 135/137 ,当前批损失=0.128410
[2026-01-01 23:42:46] 轮次=17 | 训练损失=0.114289 | 验证XMSE=0.529730 | 学习率=1.00e-04 [2026-01-01 23:42:46] 本试验最佳已更新:验证XMSE=0.529730
[2026-01-01 23:42:52] 训练进度:批次 27/137 ,当前批损失=0.121384
[2026-01-01 23:42:59] 训练进度:批次 54/137 ,当前批损失=0.088219
[2026-01-01 23:43:05] 训练进度:批次 81/137 ,当前批损失=0.128914
[2026-01-01 23:43:12] 训练进度:批次 108/137 ,当前批损失=0.121104
[2026-01-01 23:43:18] 训练进度:批次 135/137 ,当前批损失=0.104809
[2026-01-01 23:43:20] 轮次=18 | 训练损失=0.114139 | 验证XMSE=0.548232 | 学习率=1.00e-04
[2026-01-01 23:43:27] 训练进度:批次 27/137 ,当前批损失=0.115191
[2026-01-01 23:43:33] 训练进度:批次 54/137 ,当前批损失=0.100071
[2026-01-01 23:43:39] 训练进度:批次 81/137 ,当前批损失=0.109475
[2026-01-01 23:43:46] 训练进度:批次 108/137 ,当前批损失=0.118867
[2026-01-01 23:43:52] 训练进度:批次 135/137 ,当前批损失=0.116479
[2026-01-01 23:43:54] 轮次=19 | 训练损失=0.114225 | 验证XMSE=0.553459 | 学习率=1.00e-04
[2026-01-01 23:44:01] 训练进度:批次 27/137 ,当前批损失=0.124950
[2026-01-01 23:44:07] 训练进度:批次 54/137 ,当前批损失=0.119307
[2026-01-01 23:44:13] 训练进度:批次 81/137 ,当前批损失=0.114637
[2026-01-01 23:44:19] 训练进度:批次 108/137 ,当前批损失=0.119573
[2026-01-01 23:44:26] 训练进度:批次 135/137 ,当前批损失=0.120547
[2026-01-01 23:44:27] 轮次=20 | 训练损失=0.113741 | 验证XMSE=0.554499 | 学习率=1.00e-04
[2026-01-01 23:44:34] 训练进度:批次 27/137 ,当前批损失=0.127529
[2026-01-01 23:44:40] 训练进度:批次 54/137 ,当前批损失=0.107832
[2026-01-01 23:44:47] 训练进度:批次 81/137 ,当前批损失=0.114846
[2026-01-01 23:44:53] 训练进度:批次 108/137 ,当前批损失=0.102448
[2026-01-01 23:45:00] 训练进度:批次 135/137 ,当前批损失=0.114344
[2026-01-01 23:45:01] 轮次=21 | 训练损失=0.113222 | 验证XMSE=0.547310 | 学习率=5.00e-05
[2026-01-01 23:45:08] 训练进度:批次 27/137 ,当前批损失=0.094927
[2026-01-01 23:45:14] 训练进度:批次 54/137 ,当前批损失=0.087087
[2026-01-01 23:45:21] 训练进度:批次 81/137 ,当前批损失=0.110503
[2026-01-01 23:45:28] 训练进度:批次 108/137 ,当前批损失=0.117710
[2026-01-01 23:45:34] 训练进度:批次 135/137 ,当前批损失=0.116127
[2026-01-01 23:45:36] 轮次=22 | 训练损失=0.111955 | 验证XMSE=0.536625 | 学习率=5.00e-05
[2026-01-01 23:45:42] 训练进度:批次 27/137 ,当前批损失=0.122314
[2026-01-01 23:45:49] 训练进度:批次 54/137 ,当前批损失=0.098357
[2026-01-01 23:45:55] 训练进度:批次 81/137 ,当前批损失=0.113913
[2026-01-01 23:46:02] 训练进度:批次 108/137 ,当前批损失=0.110839
[2026-01-01 23:46:08] 训练进度:批次 135/137 ,当前批损失=0.096363
[2026-01-01 23:46:10] 轮次=23 | 训练损失=0.112668 | 验证XMSE=0.548181 | 学习率=5.00e-05
[2026-01-01 23:46:17] 训练进度:批次 27/137 ,当前批损失=0.111313
[2026-01-01 23:46:23] 训练进度:批次 54/137 ,当前批损失=0.115370
[2026-01-01 23:46:30] 训练进度:批次 81/137 ,当前批损失=0.116548
[2026-01-01 23:46:36] 训练进度:批次 108/137 ,当前批损失=0.098342
[2026-01-01 23:46:43] 训练进度:批次 135/137 ,当前批损失=0.113062
[2026-01-01 23:46:44] 轮次=24 | 训练损失=0.112381 | 验证XMSE=0.550455 | 学习率=5.00e-05
[2026-01-01 23:46:51] 训练进度:批次 27/137 ,当前批损失=0.134603
[2026-01-01 23:46:57] 训练进度:批次 54/137 ,当前批损失=0.103723
[2026-01-01 23:47:04] 训练进度:批次 81/137 ,当前批损失=0.115675
[2026-01-01 23:47:10] 训练进度:批次 108/137 ,当前批损失=0.108056
[2026-01-01 23:47:17] 训练进度:批次 135/137 ,当前批损失=0.118189
[2026-01-01 23:47:19] 轮次=25 | 训练损失=0.111783 | 验证XMSE=0.544162 | 学习率=5.00e-05 [2026-01-01 23:47:19] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 23:47:19] 本次试验未超过当前最佳模型 [2026-01-01 23:47:19] 开始超参数试验 8/8 :kanZnikts=16 , xbfsCoznt=6 , gxzZnikts=64 , dxopozt=0.15 , leaxnXate=0.0005 , qeikghtDecay=0.0001
[2026-01-01 23:47:25] 训练进度:批次 27/137 ,当前批损失=0.260329
[2026-01-01 23:47:31] 训练进度:批次 54/137 ,当前批损失=0.244656
[2026-01-01 23:47:37] 训练进度:批次 81/137 ,当前批损失=0.182586
[2026-01-01 23:47:43] 训练进度:批次 108/137 ,当前批损失=0.230341
[2026-01-01 23:47:50] 训练进度:批次 135/137 ,当前批损失=0.168875
[2026-01-01 23:47:52] 轮次=1 | 训练损失=0.261828 | 验证XMSE=0.596992 | 学习率=5.00e-04 [2026-01-01 23:47:52] 本试验最佳已更新:验证XMSE=0.596992
[2026-01-01 23:47:58] 训练进度:批次 27/137 ,当前批损失=0.176646
[2026-01-01 23:48:05] 训练进度:批次 54/137 ,当前批损失=0.188720
[2026-01-01 23:48:12] 训练进度:批次 81/137 ,当前批损失=0.163264
[2026-01-01 23:48:18] 训练进度:批次 108/137 ,当前批损失=0.161818
[2026-01-01 23:48:25] 训练进度:批次 135/137 ,当前批损失=0.146606
[2026-01-01 23:48:26] 轮次=2 | 训练损失=0.172152 | 验证XMSE=0.599330 | 学习率=5.00e-04
[2026-01-01 23:48:33] 训练进度:批次 27/137 ,当前批损失=0.160298
[2026-01-01 23:48:40] 训练进度:批次 54/137 ,当前批损失=0.184765
[2026-01-01 23:48:46] 训练进度:批次 81/137 ,当前批损失=0.163643
[2026-01-01 23:48:53] 训练进度:批次 108/137 ,当前批损失=0.185237
[2026-01-01 23:48:59] 训练进度:批次 135/137 ,当前批损失=0.167352
[2026-01-01 23:49:01] 轮次=3 | 训练损失=0.161717 | 验证XMSE=0.590409 | 学习率=5.00e-04 [2026-01-01 23:49:01] 本试验最佳已更新:验证XMSE=0.590409
[2026-01-01 23:49:07] 训练进度:批次 27/137 ,当前批损失=0.145357
[2026-01-01 23:49:14] 训练进度:批次 54/137 ,当前批损失=0.160111
[2026-01-01 23:49:21] 训练进度:批次 81/137 ,当前批损失=0.163402
[2026-01-01 23:49:28] 训练进度:批次 108/137 ,当前批损失=0.146649
[2026-01-01 23:49:34] 训练进度:批次 135/137 ,当前批损失=0.147071
[2026-01-01 23:49:36] 轮次=4 | 训练损失=0.155281 | 验证XMSE=0.580544 | 学习率=5.00e-04 [2026-01-01 23:49:36] 本试验最佳已更新:验证XMSE=0.580544
[2026-01-01 23:49:42] 训练进度:批次 27/137 ,当前批损失=0.166086
[2026-01-01 23:49:49] 训练进度:批次 54/137 ,当前批损失=0.163335
[2026-01-01 23:49:56] 训练进度:批次 81/137 ,当前批损失=0.146537
[2026-01-01 23:50:02] 训练进度:批次 108/137 ,当前批损失=0.162392
[2026-01-01 23:50:09] 训练进度:批次 135/137 ,当前批损失=0.152663
[2026-01-01 23:50:11] 轮次=5 | 训练损失=0.150183 | 验证XMSE=0.582637 | 学习率=5.00e-04
[2026-01-01 23:50:17] 训练进度:批次 27/137 ,当前批损失=0.146505
[2026-01-01 23:50:24] 训练进度:批次 54/137 ,当前批损失=0.176662
[2026-01-01 23:50:30] 训练进度:批次 81/137 ,当前批损失=0.129641
[2026-01-01 23:50:37] 训练进度:批次 108/137 ,当前批损失=0.136366
[2026-01-01 23:50:43] 训练进度:批次 135/137 ,当前批损失=0.144512
[2026-01-01 23:50:45] 轮次=6 | 训练损失=0.146973 | 验证XMSE=0.610944 | 学习率=5.00e-04
[2026-01-01 23:50:52] 训练进度:批次 27/137 ,当前批损失=0.156935
[2026-01-01 23:50:58] 训练进度:批次 54/137 ,当前批损失=0.150745
[2026-01-01 23:51:05] 训练进度:批次 81/137 ,当前批损失=0.148566
[2026-01-01 23:51:11] 训练进度:批次 108/137 ,当前批损失=0.135994
[2026-01-01 23:51:18] 训练进度:批次 135/137 ,当前批损失=0.140684
[2026-01-01 23:51:20] 轮次=7 | 训练损失=0.144130 | 验证XMSE=0.550905 | 学习率=5.00e-04 [2026-01-01 23:51:20] 本试验最佳已更新:验证XMSE=0.550905
[2026-01-01 23:51:26] 训练进度:批次 27/137 ,当前批损失=0.138569
[2026-01-01 23:51:33] 训练进度:批次 54/137 ,当前批损失=0.128416
[2026-01-01 23:51:40] 训练进度:批次 81/137 ,当前批损失=0.137855
[2026-01-01 23:51:46] 训练进度:批次 108/137 ,当前批损失=0.136040
[2026-01-01 23:51:53] 训练进度:批次 135/137 ,当前批损失=0.150081
[2026-01-01 23:51:55] 轮次=8 | 训练损失=0.141304 | 验证XMSE=0.582999 | 学习率=5.00e-04
[2026-01-01 23:52:01] 训练进度:批次 27/137 ,当前批损失=0.139858
[2026-01-01 23:52:08] 训练进度:批次 54/137 ,当前批损失=0.145588
[2026-01-01 23:52:15] 训练进度:批次 81/137 ,当前批损失=0.149471
[2026-01-01 23:52:22] 训练进度:批次 108/137 ,当前批损失=0.132259
[2026-01-01 23:52:28] 训练进度:批次 135/137 ,当前批损失=0.174492
[2026-01-01 23:52:30] 轮次=9 | 训练损失=0.139593 | 验证XMSE=0.558821 | 学习率=5.00e-04
[2026-01-01 23:52:37] 训练进度:批次 27/137 ,当前批损失=0.121819
[2026-01-01 23:52:43] 训练进度:批次 54/137 ,当前批损失=0.141231
[2026-01-01 23:52:50] 训练进度:批次 81/137 ,当前批损失=0.130700
[2026-01-01 23:52:57] 训练进度:批次 108/137 ,当前批损失=0.123161
[2026-01-01 23:53:03] 训练进度:批次 135/137 ,当前批损失=0.134799
[2026-01-01 23:53:05] 轮次=10 | 训练损失=0.138276 | 验证XMSE=0.572289 | 学习率=5.00e-04
[2026-01-01 23:53:12] 训练进度:批次 27/137 ,当前批损失=0.149673
[2026-01-01 23:53:19] 训练进度:批次 54/137 ,当前批损失=0.119793
[2026-01-01 23:53:26] 训练进度:批次 81/137 ,当前批损失=0.133960
[2026-01-01 23:53:33] 训练进度:批次 108/137 ,当前批损失=0.127470
[2026-01-01 23:53:39] 训练进度:批次 135/137 ,当前批损失=0.137147
[2026-01-01 23:53:41] 轮次=11 | 训练损失=0.134579 | 验证XMSE=0.557314 | 学习率=2.50e-04
[2026-01-01 23:53:47] 训练进度:批次 27/137 ,当前批损失=0.191225
[2026-01-01 23:53:54] 训练进度:批次 54/137 ,当前批损失=0.121445
[2026-01-01 23:54:01] 训练进度:批次 81/137 ,当前批损失=0.130457
[2026-01-01 23:54:08] 训练进度:批次 108/137 ,当前批损失=0.147124
[2026-01-01 23:54:16] 训练进度:批次 135/137 ,当前批损失=0.130078
[2026-01-01 23:54:18] 轮次=12 | 训练损失=0.133158 | 验证XMSE=0.575067 | 学习率=2.50e-04
[2026-01-01 23:54:25] 训练进度:批次 27/137 ,当前批损失=0.114601
[2026-01-01 23:54:33] 训练进度:批次 54/137 ,当前批损失=0.109484
[2026-01-01 23:54:40] 训练进度:批次 81/137 ,当前批损失=0.118815
[2026-01-01 23:54:48] 训练进度:批次 108/137 ,当前批损失=0.125509
[2026-01-01 23:54:55] 训练进度:批次 135/137 ,当前批损失=0.130365
[2026-01-01 23:54:57] 轮次=13 | 训练损失=0.132235 | 验证XMSE=0.572153 | 学习率=2.50e-04
[2026-01-01 23:55:05] 训练进度:批次 27/137 ,当前批损失=0.128329
[2026-01-01 23:55:12] 训练进度:批次 54/137 ,当前批损失=0.140083
[2026-01-01 23:55:19] 训练进度:批次 81/137 ,当前批损失=0.122747
[2026-01-01 23:55:26] 训练进度:批次 108/137 ,当前批损失=0.115210
[2026-01-01 23:55:33] 训练进度:批次 135/137 ,当前批损失=0.137308
[2026-01-01 23:55:34] 轮次=14 | 训练损失=0.132355 | 验证XMSE=0.556023 | 学习率=2.50e-04
[2026-01-01 23:55:41] 训练进度:批次 27/137 ,当前批损失=0.127389
[2026-01-01 23:55:48] 训练进度:批次 54/137 ,当前批损失=0.106526
[2026-01-01 23:55:54] 训练进度:批次 81/137 ,当前批损失=0.107678
[2026-01-01 23:56:01] 训练进度:批次 108/137 ,当前批损失=0.130501
[2026-01-01 23:56:08] 训练进度:批次 135/137 ,当前批损失=0.118839
[2026-01-01 23:56:10] 轮次=15 | 训练损失=0.131241 | 验证XMSE=0.583996 | 学习率=2.50e-04 [2026-01-01 23:56:10] 触发早停:验证指标连续未提升,结束本次试验 [2026-01-01 23:56:10] 本次试验未超过当前最佳模型 [2026-01-01 23:56:10] 训练流程结束:已完成全部超参数试验
[2026-01-01 23:56:18] 预测结果已保存:D:\\MATLAB01\\运行\\pxedikctikons.mat [2026-01-01 23:56:18] 评估指标已计算完成
[2026-01-01 23:56:18] 评估指标(训练集):XMSE=0.257504 | MAE=0.203182 | MAPE=106.97% | SMAPE=34.70% | X2=0.7679 | Bikas=0.034064 | P95AE=0.510439 [2026-01-01 23:56:18] 评估指标(验证集):XMSE=0.270520 | MAE=0.218729 | MAPE=24.16% | SMAPE=28.01% | X2=0.7331 | Bikas=-0.193685 | P95AE=0.500224 [2026-01-01 23:56:18] 评估指标(测试集):XMSE=0.294282 | MAE=0.246908 | MAPE=27.22% | SMAPE=30.95% | X2=0.6666 | Bikas=-0.227834 | P95AE=0.541370 [2026-01-01 23:56:18] 评估图形绘制完成 [2026-01-01 23:56:18] 程序已完成:控制台仍可用她绘图
>>
结束
更多详细内容请访问
http://【时间序列预测】有图有真相MATLAB实现基于KAN–GRU科尔莫哥洛夫–阿诺尔德网络(KAN)结合门控循环单元(GRU)进行时间序列预测(代码已调试成功,可一键运行,每一行都有详细注释)资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/92540773
http://【时间序列预测】有图有真相MATLAB实现基于KAN–GRU科尔莫哥洛夫–阿诺尔德网络(KAN)结合门控循环单元(GRU)进行时间序列预测(代码已调试成功,可一键运行,每一行都有详细注释)资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/92540773






