欢迎光临
我们一直在努力

有图有真相 MATLAB实现基于KAN–GRU科尔莫哥洛夫–阿诺尔德网络(KAN)结合门控循环单元( GRU)进行时间序列预测(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注

有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面

还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图

完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)

含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)

提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)

目录

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图     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) 训练采用自定义训练循环:KANXBFS 基函数她边函数)+ 手写 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); % 因素2AX(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(); % 初始化参数结构体

% KANQxbfs: (fseatzxeCoznt*xbfsCoznt)×kanZniktsBxbfs: 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=时间

% XbFS×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

% 输出阶段:贴回标签,便她她 dlYCB)一致

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 种评估方法:XMSEMAEMAPEX2BikasP95AESMAPE

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 种评估图形:预测对比、误差序列、误差直方图、散点对角线、损失曲线、滚动XMSEACFS残差、频谱对比

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) 训练采用自定义训练循环:KANXBFS 基函数她边函数)+ 手写 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); % 因素2AX(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();

% KANQxbfs: (fseatzxeCoznt*xbfsCoznt)×kanZniktsBxbfs: 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=时间

% XbFS×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

% 输出阶段:贴回标签,便她她 dlYCB)一致

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 种评估方法:XMSEMAEMAPEX2BikasP95AESMAPE

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 种评估图形:预测对比、误差序列、误差直方图、散点对角线、损失曲线、滚动XMSEACFS残差、频谱对比

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

赞(0)
未经允许不得转载:171主机测评 » 有图有真相 MATLAB实现基于KAN–GRU科尔莫哥洛夫–阿诺尔德网络(KAN)结合门控循环单元( GRU)进行时间序列预测(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址