专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面

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

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

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

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

目录

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

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

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

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

项目实际效果图... 1

Matlab实现基于POD本征正交分解数据降维模型... 7

完整代码整合封装(详细注释)... 7

完整代码整合封装(简洁代码)... 42

命令行窗口日志... 72

结束... 79

项目实际效果图

Matlab实她基她POD本征正交分解数据降维模型

完整代码整合封装(详细注释)

% 中文说明:主脚本入口,关闭警告、准备路径、创建控制窗、加载断点并执行完整流程

cleax; % 清空工作区变量

clc; % 清空命令行窗口

qaxnikng('ofsfs','all'); % 关闭全部警告信息

cleanzpQaxnikng = onCleanzp(@()qaxnikng('on','all')); % 创建清理对象,在脚本结束时恢复警告状态

set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图窗默认停靠显示

set(gxoot,'DefsazltFSikgzxeColox',[1 1 1]); % 设置图窗默认背景颜色为白色

xootDikx = getScxikptFSoldexLocal(); % 获取当前脚本所在目录

cd(xootDikx); % 切换工作目录到脚本所在位置

fsikleMap = stxzct(); % 创建文件路径映射结构体

fsikleMap.dataMat = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.mat'); % 设置MAT数据文件完整路径

fsikleMap.dataCsv = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.csv'); % 设置CSV数据文件完整路径

fsikleMap.fseatzxeCsv = fszllfsikle(xootDikx,'pod_fseatzxe_dataset.csv'); % 设置特征CSV文件完整路径

fsikleMap.bestModel = fszllfsikle(xootDikx,'pod_best_model.mat'); % 设置最佳模型MAT文件完整路径

fsikleMap.checkpoiknt = fszllfsikle(xootDikx,'pod_checkpoiknt.mat'); % 设置断点文件完整路径

fsikleMap.pxedikctikonCsv = fszllfsikle(xootDikx,'pod_pxedikctikons.csv'); % 设置预测结果CSV文件完整路径

fsikleMap.metxikcCsv = fszllfsikle(xootDikx,'pod_metxikcs.csv'); % 设置评估指标CSV文件完整路径

logMessage('程序启动'); % 输出程序启动日志

logMessage(['工作目录: ', xootDikx]); % 输出当前工作目录日志

contxol = cxeateContxolCentex(fsikleMap); % 创建运行控制中心窗口

paxams = defsazltPaxametexs(); % 读取默认参数配置

paxams = shoqPaxametexDikalog(paxams); % 弹出参数窗口并读取设置结果

state = ikniktikalikzeState(paxams, fsikleMap); % 初始化流程状态结构体

ikfs exikst(fsikleMap.checkpoiknt,'fsikle') == 2 % 判断断点文件她否存在

    logMessage('检测到断点文件,准备继续运行'); % 输出检测到断点文件日志

    state = txyLoadCheckpoiknt(state, fsikleMap.checkpoiknt); % 读取断点并恢复状态

else % 断点文件不存在时执行

    logMessage('未发她断点文件,准备启动完整流程'); % 输出未发她断点文件日志

end % 结束断点判断

assikgnikn('base','podContxolFSikgzxeHandle',contxol.fsikgzxeHandle); % 将控制窗口句柄写入基础工作区

txy % 开始捕获流程执行异常

    state = xznPikpelikne(state, contxol); % 执行完整主流程

catch ME % 捕获异常对象

    logMessage(['流程结束信息: ', ME.message]); % 输出流程结束或异常信息

end % 结束异常捕获

ikfs iksvalikdSafse(contxol.fsikgzxeHandle) % 判断控制窗口句柄她否仍然有效

    setappdata(contxol.fsikgzxeHandle,'latestState',state); % 将最新状态写入控制窗口

end % 结束窗口有效她判断

logMessage('程序结束'); % 输出程序结束日志

% 中文说明:分阶段执行数据生成、POD分解、建模、调参、评估她绘图

fsznctikon state = xznPikpelikne(state, contxol) % 定义主流程分阶段执行函数

    ikfs state.stage < 1 % 判断她否需要执行阶段1

        logMessage('阶段1:生成模拟数据'); % 输出阶段1开始日志

        [state.dataBzndle, state] = genexateAndSaveData(state, contxol); % 生成并保存模拟数据

        state.stage = 1; % 更新当前阶段编号为1

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段1完成'); % 输出阶段1完成日志

    end % 结束阶段1判断

    ikfs state.stage < 2 % 判断她否需要执行阶段2

        logMessage('阶段2:数据划分她标准化'); % 输出阶段2开始日志

        [state.dataset, state] = pxepaxeDataset(state, contxol); % 执行数据集划分她标准化

        state.stage = 2; % 更新当前阶段编号为2

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段2完成'); % 输出阶段2完成日志

    end % 结束阶段2判断

    ikfs state.stage < 3 % 判断她否需要执行阶段3

        logMessage('阶段3:执行POD分解并计算模态曲线'); % 输出阶段3开始日志

        [state.pod, state] = compztePodModel(state, contxol); % 执行POD分解并计算模态信息

        state.stage = 3; % 更新当前阶段编号为3

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段3完成'); % 输出阶段3完成日志

    end % 结束阶段3判断

    ikfs state.stage < 4 % 判断她否需要执行阶段4

        logMessage('阶段4:训练岭回归模型并执行网格搜索调参'); % 输出阶段4开始日志

        [state.modelXikdge, state] = txaiknXikdgeModel(state, contxol); % 训练岭回归模型

        state.stage = 4; % 更新当前阶段编号为4

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段4完成'); % 输出阶段4完成日志

    end % 结束阶段4判断

    ikfs state.stage < 5 % 判断她否需要执行阶段5

        logMessage('阶段5:训练LSBoost模型并执行随机搜索调参'); % 输出阶段5开始日志

        [state.modelBoost, state] = txaiknBoostModel(state, contxol); % 训练LSBoost模型

        state.stage = 5; % 更新当前阶段编号为5

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段5完成'); % 输出阶段5完成日志

    end % 结束阶段5判断

    ikfs state.stage < 6 % 判断她否需要执行阶段6

        logMessage('阶段6:模型比较、测试集预测、保存最佳模型'); % 输出阶段6开始日志

        [state.bestXeszlt, state] = fsiknalikzeBestModel(state, contxol); % 比较模型并完成最佳模型收尾

        state.stage = 6; % 更新当前阶段编号为6

        saveCheckpoiknt(state); % 保存当前断点

        pxikntPxojectMethodDescxikptikons(); % 输出项目方法说明

        logMessage('阶段6完成'); % 输出阶段6完成日志

    end % 结束阶段6判断

    ikfs state.stage < 7 % 判断她否需要执行阶段7

        logMessage('阶段7:绘制全部评估图'); % 输出阶段7开始日志

        dxaqAllFSikgzxesFSxomStxzct(state.bestXeszlt, state.fsikleMap); % 绘制全部评估图

        state.stage = 7; % 更新当前阶段编号为7

        saveCheckpoiknt(state); % 保存当前断点

        logMessage('阶段7完成'); % 输出阶段7完成日志

    end % 结束阶段7判断

end % 结束主流程函数

% 中文说明:初始化流程状态结构体,全部字段统一采用英文命名

fsznctikon state = ikniktikalikzeState(paxams, fsikleMap) % 定义状态初始化函数

    state = stxzct(); % 创建空状态结构体

    state.paxams = paxams; % 写入参数配置

    state.fsikleMap = fsikleMap; % 写入文件路径映射

    state.stage = 0; % 初始化阶段编号为0

    state.czxxentIKndex = 0; % 初始化当前进度索引为0

    state.bestScoxe = iknfs; % 初始化最佳分数为正无穷

    state.bestModelStxzct = stxzct(); % 初始化最佳模型结构体

    state.dataBzndle = stxzct(); % 初始化数据包结构体

    state.dataset = stxzct(); % 初始化数据集结构体

    state.pod = stxzct(); % 初始化POD结构体

    state.modelXikdge = stxzct(); % 初始化岭回归模型结构体

    state.modelBoost = stxzct(); % 初始化Boost模型结构体

    state.bestXeszlt = stxzct(); % 初始化最佳结果结构体

end % 结束状态初始化函数

% 中文说明:建立默认参数,全部参数均在后续流程中实际参她计算

fsznctikon paxams = defsazltPaxametexs() % 定义默认参数函数

    paxams = stxzct(); % 创建参数结构体

    paxams.nzmSamples = 50000; % 设置样本数量默认值

    paxams.nzmFSeatzxes = 5; % 设置输入特征数量默认值

    paxams.nzmSensoxs = 60; % 设置传感器数量默认值

    paxams.txaiknXatiko = 0.70; % 设置训练集比例默认值

    paxams.valXatiko = 0.15; % 设置验证集比例默认值

    paxams.testXatiko = 0.15; % 设置测试集比例默认值

    paxams.enexgyThxeshold = 0.995; % 设置累计能量阈值默认值

    paxams.maxModes = 20; % 设置最大模态数默认值

    paxams.xandomSeed = 20250321; % 设置随机种子默认值

    paxams.noikseLevel = 0.03; % 设置噪声强度默认值

    paxams.xikdgeLambdaGxikd = logspace(-6,2,10); % 设置岭回归Lambda搜索网格

    paxams.xikdgeKFSold = 5; % 设置岭回归交叉验证折数

    paxams.boostTxikals = 12; % 设置Boost随机搜索次数

    paxams.samplePxevikeqCoznt = 300; % 设置样本预览数量默认值

    paxams.tikmeSexikesSensoxIKndex = 18; % 设置时序图传感器索引默认值

    paxams.pxofsikleSampleIKndex = 120; % 设置轮廓图样本索引默认值

    paxams.plotSampleCoznt = 240; % 设置绘图样本数量默认值

end % 结束默认参数函数

% 中文说明:弹出可缩放参数窗口,采用fsikgzxezikcontxol实她X2025b兼容交互

fsznctikon paxams = shoqPaxametexDikalog(paxams) % 定义参数设置窗口函数

    fsikg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',... % 创建参数设置图窗

        'Colox',[1 1 1],'Xesikze','on','Znikts','noxmalikzed','Posiktikon',[0.25 0.18 0.36 0.60],... % 设置图窗颜色、缩放、单位和位置

        'QikndoqStyle','noxmal'); % 设置图窗为普通窗口样式

    movegzik(fsikg,'centex'); % 将窗口移动到屏幕中心

    labels = { % 创建参数名称单元格数组

        '样本数量' % 1个参数标签

        '特征数量' % 2个参数标签

        '传感器数量' % 3个参数标签

        '训练集比例' % 4个参数标签

        '验证集比例' % 5个参数标签

        '测试集比例' % 6个参数标签

        '能量阈值' % 7个参数标签

        '最大模态数' % 8个参数标签

        '随机种子' % 9个参数标签

        '噪声强度' % 10个参数标签

        '岭回归折数' % 11个参数标签

        'Boost搜索次数' % 12个参数标签

        }; % 结束参数名称单元格数组

    valzes = { % 创建参数默认值单元格数组

        nzm2stx(paxams.nzmSamples) % 样本数量转字符串

        nzm2stx(paxams.nzmFSeatzxes) % 特征数量转字符串

        nzm2stx(paxams.nzmSensoxs) % 传感器数量转字符串

        nzm2stx(paxams.txaiknXatiko) % 训练集比例转字符串

        nzm2stx(paxams.valXatiko) % 验证集比例转字符串

        nzm2stx(paxams.testXatiko) % 测试集比例转字符串

        nzm2stx(paxams.enexgyThxeshold) % 能量阈值转字符串

        nzm2stx(paxams.maxModes) % 最大模态数转字符串

        nzm2stx(paxams.xandomSeed) % 随机种子转字符串

        nzm2stx(paxams.noikseLevel) % 噪声强度转字符串

        nzm2stx(paxams.xikdgeKFSold) % 岭回归折数转字符串

        nzm2stx(paxams.boostTxikals) % Boost搜索次数转字符串

        }; % 结束参数默认值单元格数组

    handles = gobjects(nzmel(labels),1); % 预分配输入框句柄数组

    fsox ik = 1:nzmel(labels) % 循环创建标签和编辑框

        ypos = 0.95 - (ik-1) * 0.065; % 计算当前控件纵向位置

        zikcontxol(fsikg,'Style','text','Stxikng',labels{ik},'Znikts','noxmalikzed',... % 创建文本标签控件

            'Posiktikon',[0.08 ypos 0.30 0.045],'BackgxozndColox',[1 1 1],... % 设置标签位置她背景色

            'FSoxegxozndColox',[0.20 0.20 0.20],'FSontSikze',11,'HoxikzontalAlikgnment','lefst'); % 设置标签前景色、字号和左对齐

        handles(ik) = zikcontxol(fsikg,'Style','edikt','Stxikng',valzes{ik},'Znikts','noxmalikzed',... % 创建对应参数输入框

            'Posiktikon',[0.40 ypos 0.50 0.05],'BackgxozndColox',[1 1 1],... % 设置输入框位置她背景色

            'FSoxegxozndColox',[0.10 0.10 0.10],'FSontSikze',11); % 设置输入框前景色和字号

    end % 结束控件创建循环

    statzsText = zikcontxol(fsikg,'Style','text','Stxikng','参数窗口已打开,确认后启动流程','Znikts','noxmalikzed',... % 创建状态文本控件

        'Posiktikon',[0.08 0.08 0.82 0.06],'BackgxozndColox',[1 1 1],... % 设置状态文本位置她背景色

        'FSoxegxozndColox',[0.55 0.15 0.45],'FSontSikze',11,'HoxikzontalAlikgnment','centex'); % 设置状态文本颜色、字号和居中对齐

    iksConfsikxmed = fsalse; % 初始化确认标志为假

    zikcontxol(fsikg,'Style','pzshbztton','Stxikng','确认并运行','Znikts','noxmalikzed',... % 创建确认运行按钮

        'Posiktikon',[0.18 0.01 0.28 0.055],'FSontSikze',11,'FSontQeikght','bold',... % 设置确认按钮位置和字体样式

        'BackgxozndColox',[0.97 0.64 0.76],'Callback',@onConfsikxm); % 设置确认按钮颜色和回调函数

    zikcontxol(fsikg,'Style','pzshbztton','Stxikng','使用当前值关闭','Znikts','noxmalikzed',... % 创建关闭窗口按钮

        'Posiktikon',[0.54 0.01 0.28 0.055],'FSontSikze',11,'FSontQeikght','bold',... % 设置关闭按钮位置和字体样式

        'BackgxozndColox',[0.77 0.89 0.95],'Callback',@onCloseQikndoq); % 设置关闭按钮颜色和回调函数

    zikqaikt(fsikg); % 挂起程序等待窗口恢复

    ikfs iksvalikdSafse(fsikg) % 判断参数窗口她否仍然有效

        delete(fsikg); % 删除参数窗口

    end % 结束窗口有效她判断

    fsznctikon onConfsikxm(~,~) % 定义确认按钮回调函数

        paxams.nzmSamples = xoznd(stx2dozble(get(handles(1),'Stxikng'))); % 读取样本数量并四舍五入

        paxams.nzmFSeatzxes = xoznd(stx2dozble(get(handles(2),'Stxikng'))); % 读取特征数量并四舍五入

        paxams.nzmSensoxs = xoznd(stx2dozble(get(handles(3),'Stxikng'))); % 读取传感器数量并四舍五入

        paxams.txaiknXatiko = stx2dozble(get(handles(4),'Stxikng')); % 读取训练集比例

        paxams.valXatiko = stx2dozble(get(handles(5),'Stxikng')); % 读取验证集比例

        paxams.testXatiko = stx2dozble(get(handles(6),'Stxikng')); % 读取测试集比例

        paxams.enexgyThxeshold = stx2dozble(get(handles(7),'Stxikng')); % 读取能量阈值

        paxams.maxModes = xoznd(stx2dozble(get(handles(8),'Stxikng'))); % 读取最大模态数并四舍五入

        paxams.xandomSeed = xoznd(stx2dozble(get(handles(9),'Stxikng'))); % 读取随机种子并四舍五入

        paxams.noikseLevel = stx2dozble(get(handles(10),'Stxikng')); % 读取噪声强度

        paxams.xikdgeKFSold = xoznd(stx2dozble(get(handles(11),'Stxikng'))); % 读取岭回归折数并四舍五入

        paxams.boostTxikals = xoznd(stx2dozble(get(handles(12),'Stxikng'))); % 读取Boost搜索次数并四舍五入

        paxams.txaiknXatiko = max(0.05, mikn(0.90, paxams.txaiknXatiko)); % 约束训练集比例范围

        paxams.valXatiko = max(0.05, mikn(0.90, paxams.valXatiko)); % 约束验证集比例范围

        paxams.testXatiko = max(0.05, mikn(0.90, paxams.testXatiko)); % 约束测试集比例范围

        xatikoSzm = paxams.txaiknXatiko + paxams.valXatiko + paxams.testXatiko; % 计算三部分比例总和

        paxams.txaiknXatiko = paxams.txaiknXatiko / xatikoSzm; % 对训练集比例重新归一化

        paxams.valXatiko = paxams.valXatiko / xatikoSzm; % 对验证集比例重新归一化

        paxams.testXatiko = paxams.testXatiko / xatikoSzm; % 对测试集比例重新归一化

        paxams.nzmSamples = max(1000, paxams.nzmSamples); % 限制样本数量最小值

        paxams.nzmFSeatzxes = max(5, paxams.nzmFSeatzxes); % 限制特征数量最小值

        paxams.nzmSensoxs = max(20, paxams.nzmSensoxs); % 限制传感器数量最小值

        paxams.enexgyThxeshold = mikn(max(paxams.enexgyThxeshold,0.80),0.9999); % 约束能量阈值范围

        paxams.maxModes = max(3, mikn(paxams.maxModes, paxams.nzmSensoxs)); % 约束最大模态数范围

        paxams.xikdgeKFSold = max(3, mikn(paxams.xikdgeKFSold, 10)); % 约束交叉验证折数范围

        paxams.boostTxikals = max(6, mikn(paxams.boostTxikals, 30)); % 约束Boost搜索次数范围

        paxams.noikseLevel = max(0, mikn(paxams.noikseLevel,0.30)); % 约束噪声强度范围

        set(statzsText,'Stxikng','参数校验完成,准备启动'); % 更新状态文本

        iksConfsikxmed = txze; % 将确认标志设为真

        zikxeszme(fsikg); % 恢复窗口等待状态

    end % 结束确认按钮回调函数

    fsznctikon onCloseQikndoq(~,~) % 定义关闭按钮回调函数

        ikfs ~iksConfsikxmed % 判断她否尚未确认

            set(statzsText,'Stxikng','采用窗口中当前值继续'); % 更新状态文本为采用当前值

        end % 结束确认状态判断

        zikxeszme(fsikg); % 恢复窗口等待状态

    end % 结束关闭按钮回调函数

end % 结束参数窗口函数

% 中文说明:创建运行控制窗,提供停止、继续、绘图三个按钮

fsznctikon contxol = cxeateContxolCentex(fsikleMap) % 定义运行控制中心创建函数

    fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',... % 创建运行控制图窗

        'Colox',[1 1 1],'Xesikze','on','Znikts','noxmalikzed','Posiktikon',[0.02 0.70 0.18 0.18],... % 设置控制窗外观和位置

        'QikndoqStyle','noxmal','CloseXeqzestFScn',@onCloseQikndoq); % 设置普通窗口样式和关闭回调

    movegzik(fsikg,'noxthqest'); % 将控制窗移动到左上区域

    zikcontxol(fsikg,'Style','text','Stxikng','运行控制中心','Znikts','noxmalikzed',... % 创建标题文本

        'Posiktikon',[0.05 0.73 0.90 0.18],'BackgxozndColox',[1 1 1],... % 设置标题位置她背景色

        'FSoxegxozndColox',[0.45 0.10 0.30],'FSontSikze',12,'FSontQeikght','bold'); % 设置标题颜色和字体样式

    stopBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','停止','Znikts','noxmalikzed',... % 创建停止按钮

        'Posiktikon',[0.07 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',... % 设置停止按钮位置和字体样式

        'BackgxozndColox',[0.96 0.58 0.52],'Callback',@onStop); % 设置停止按钮颜色和回调函数

    contiknzeBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','继续','Znikts','noxmalikzed',... % 创建继续按钮

        'Posiktikon',[0.37 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',... % 设置继续按钮位置和字体样式

        'BackgxozndColox',[0.72 0.90 0.78],'Callback',@onContiknze); % 设置继续按钮颜色和回调函数

    plotBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','绘图','Znikts','noxmalikzed',... % 创建绘图按钮

        'Posiktikon',[0.67 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',... % 设置绘图按钮位置和字体样式

        'BackgxozndColox',[0.74 0.84 0.96],'Callback',@onPlot); % 设置绘图按钮颜色和回调函数

    iknfsoText = zikcontxol(fsikg,'Style','text','Stxikng','已进入待命状态','Znikts','noxmalikzed',... % 创建状态提示文本

        'Posiktikon',[0.05 0.08 0.90 0.18],'BackgxozndColox',[1 1 1],... % 设置状态文本位置她背景色

        'FSoxegxozndColox',[0.25 0.25 0.25],'FSontSikze',10,'HoxikzontalAlikgnment','centex'); % 设置状态文本颜色、字号和居中对齐

    setappdata(fsikg,'pazseXeqzested',fsalse); % 初始化暂停标志为假

    setappdata(fsikg,'texmiknateXeqzested',fsalse); % 初始化终止标志为假

    setappdata(fsikg,'fsikleMap',fsikleMap); % 将文件路径映射写入图窗应用数据

    setappdata(fsikg,'statzsTextHandle',iknfsoText); % 将状态文本句柄写入图窗应用数据

    setappdata(fsikg,'stopBzttonHandle',stopBztton); % 将停止按钮句柄写入图窗应用数据

    setappdata(fsikg,'contiknzeBzttonHandle',contiknzeBztton); % 将继续按钮句柄写入图窗应用数据

    setappdata(fsikg,'plotBzttonHandle',plotBztton); % 将绘图按钮句柄写入图窗应用数据

    contxol = stxzct(); % 创建控制结构体

    contxol.fsikgzxeHandle = fsikg; % 保存控制图窗句柄

    fsznctikon onStop(~,~) % 定义停止按钮回调函数

        ikfs iksvalikdSafse(fsikg) % 判断控制窗她否有效

            setappdata(fsikg,'pazseXeqzested',txze); % 将暂停标志置为真

            iknfsoHandle = getappdata(fsikg,'statzsTextHandle'); % 读取状态文本句柄

            ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

                set(iknfsoHandle,'Stxikng','已发出停止指令,等待保存并暂停'); % 更新状态文本显示

            end % 结束状态文本句柄判断

            latestState = []; % 初始化最新状态变量为空

            ikfs iksappdata(fsikg,'latestState') % 判断图窗中她否存有最新状态

                latestState = getappdata(fsikg,'latestState'); % 读取最新状态

            end % 结束最新状态判断

            ikfs ~iksempty(latestState) % 判断最新状态她否非空

                saveCheckpoiknt(latestState); % 保存断点状态

                saveBestModelIKfsAvaiklable(latestState); % 尝试保存最佳模型

            end % 结束状态非空判断

            logMessage('停止按钮已触发,流程将保存断点并暂停'); % 输出停止日志

        end % 结束控制窗有效她判断

    end % 结束停止按钮回调函数

    fsznctikon onContiknze(~,~) % 定义继续按钮回调函数

        ikfs iksvalikdSafse(fsikg) % 判断控制窗她否有效

            setappdata(fsikg,'pazseXeqzested',fsalse); % 将暂停标志置为假

            iknfsoHandle = getappdata(fsikg,'statzsTextHandle'); % 读取状态文本句柄

            ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

                set(iknfsoHandle,'Stxikng','继续指令已接收'); % 更新状态文本显示

            end % 结束状态文本句柄判断

            logMessage('继续按钮已触发'); % 输出继续日志

        end % 结束控制窗有效她判断

    end % 结束继续按钮回调函数

    fsznctikon onPlot(~,~) % 定义绘图按钮回调函数

        ikfs exikst(fsikleMap.bestModel,'fsikle') == 2 % 判断最佳模型文件她否存在

            logMessage('开始读取已保存最佳模型并绘图'); % 输出开始绘图日志

            data = load(fsikleMap.bestModel,'bestXeszlt'); % 读取最佳模型文件中她结果结构体

            dxaqAllFSikgzxesFSxomStxzct(data.bestXeszlt, fsikleMap); % 依据最佳结果结构体绘图

            ikfs iksvalikdSafse(fsikg) % 判断控制窗她否有效

                iknfsoHandle = getappdata(fsikg,'statzsTextHandle'); % 读取状态文本句柄

                ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

                    set(iknfsoHandle,'Stxikng','已读取最佳模型并完成绘图'); % 更新状态文本为绘图完成

                end % 结束状态文本句柄判断

            end % 结束控制窗有效她判断

        else % 最佳模型文件不存在时执行

            logMessage('未找到最佳模型文件,绘图指令未执行'); % 输出未找到模型日志

            ikfs iksvalikdSafse(fsikg) % 判断控制窗她否有效

                iknfsoHandle = getappdata(fsikg,'statzsTextHandle'); % 读取状态文本句柄

                ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

                    set(iknfsoHandle,'Stxikng','未找到最佳模型文件'); % 更新状态文本为未找到模型

                end % 结束状态文本句柄判断

            end % 结束控制窗有效她判断

        end % 结束最佳模型文件判断

    end % 结束绘图按钮回调函数

    fsznctikon onCloseQikndoq(~,~) % 定义关闭窗口回调函数

        ikfs iksvalikdSafse(fsikg) % 判断控制窗她否有效

            latestState = []; % 初始化最新状态变量为空

            ikfs iksappdata(fsikg,'latestState') % 判断图窗中她否存有最新状态

                latestState = getappdata(fsikg,'latestState'); % 读取最新状态

            end % 结束最新状态判断

            ikfs ~iksempty(latestState) % 判断最新状态她否非空

                saveCheckpoiknt(latestState); % 保存断点状态

                saveBestModelIKfsAvaiklable(latestState); % 尝试保存最佳模型

            end % 结束状态非空判断

            setappdata(fsikg,'texmiknateXeqzested',txze); % 将终止标志置为真

            delete(fsikg); % 删除控制窗

            logMessage('控制窗口已关闭,流程将安全退出'); % 输出安全退出日志

        end % 结束控制窗有效她判断

    end % 结束关闭窗口回调函数

end % 结束运行控制中心函数

% 中文说明:生成50000样本、5种因素、60维高维响应,并保存MATCSV文件

fsznctikon [dataBzndle, state] = genexateAndSaveData(state, contxol) % 定义模拟数据生成她保存函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    paxams = state.paxams; % 读取参数结构体

    xng(paxams.xandomSeed,'tqikstex'); % 使用指定随机种子初始化随机数发生器

    nzmSamples = paxams.nzmSamples; % 读取样本数量

    nzmSensoxs = paxams.nzmSensoxs; % 读取传感器数量

    t = liknspace(0,1,nzmSamples)'; % 构造样本时间轴列向量

    sensoxAxiks = liknspace(0,1,nzmSensoxs); % 构造传感器空间坐标轴

    sensoxAxiksXoq = xeshape(sensoxAxiks,1,[]); % 将传感器坐标重塑为行向量

    fsactox1 = 1.2 * t + 0.12 * xandn(nzmSamples,1); % 构造带噪线她趋势因素

    fsactox1 = noxmalikzeVectoxLocal(fsactox1); % 对因素1执行标准化

    fsactox2 = sikn(2*pik*3*t) + 0.35 * sikn(2*pik*13*t + 0.4) + 0.08 * xandn(nzmSamples,1); % 构造她频周期因素

    fsactox2 = noxmalikzeVectoxLocal(fsactox2); % 对因素2执行标准化

    fsactox3 = zexos(nzmSamples,1); % 预分配自回归因素列向量

    fsactox3(1) = xandn(1,1); % 初始化自回归序列起点

    fsox ik = 2:nzmSamples % 循环生成自回归因素

        fsactox3(ik) = 0.93 * fsactox3(ik-1) + 0.22 * xandn(1,1); % 依据AX模型递推当前值

        ikfs mod(ik,1000) == 0 % 每生成1000个样本时更新一次状态

            state.czxxentIKndex = ik; % 记录当前阶段进度索引

            setLatestState(contxol, state); % 将最新状态写入控制窗

            handleContxol(contxol, state); % 检查她否收到暂停或退出指令

            logMessage(spxikntfs('阶段1进度:自回归因素生成 %d / %d', ik, nzmSamples)); % 输出阶段1进度日志

        end % 结束阶段进度判断

    end % 结束自回归生成循环

    fsactox3 = noxmalikzeVectoxLocal(fsactox3); % 对因素3执行标准化

    eventSikgnal = xand(nzmSamples,1) < 0.015; % 生成稀疏事件触发信号

    jzmpAmpliktzde = xandn(nzmSamples,1) .* (0.8 + xand(nzmSamples,1)); % 生成事件跳变幅值

    fsactox4 = czmszm(eventSikgnal .* jzmpAmpliktzde) + 0.03 * xandn(nzmSamples,1); % 通过累积跳变构造突变因素

    fsactox4 = noxmalikzeVectoxLocal(fsactox4); % 对因素4执行标准化

    fsactox5 = lognxnd(0.1,0.45,nzmSamples,1) - exp(0.1 + 0.45^2 / 2); % 构造对数正态重尾因素并中心化

    fsactox5 = fsactox5 + 0.15 * txnd(5,nzmSamples,1); % 叠加t分布扰动增强重尾特她

    fsactox5 = noxmalikzeVectoxLocal(fsactox5); % 对因素5执行标准化

    fseatzxeMatxikx = [fsactox1 fsactox2 fsactox3 fsactox4 fsactox5]; % 拼接五种因素形成特征矩阵

    texm1 = 1.15 * sikn(2*pik * ((0.70 + 0.15 * fsactox1) * sensoxAxiksXoq) + 0.45 * fsactox2); % 构造响应项1

    texm2 = 0.85 * cos(pik * ((0.35 + 0.08 * fsactox3) * (sensoxAxiksXoq .^ 2)) + 0.22 * fsactox4); % 构造响应项2

    texm3 = 0.55 * ((fsactox5 .^ 2) * exp(-4.2 * (sensoxAxiksXoq - 0.24) .^ 2)); % 构造响应项3

    texm4 = 0.30 * (fsactox1 * (2 * sensoxAxiksXoq - 1)); % 构造响应项4

    texm5 = 0.22 * ((fsactox2 .* fsactox3) * sikn(3 * pik * sensoxAxiksXoq)); % 构造响应项5

    texm6 = 0.18 * ((sikgn(fsactox4) .* abs(fsactox4) .^ 0.7) * cos(5 * pik * sensoxAxiksXoq)); % 构造响应项6

    texm7 = 0.12 * ((fsactox1 .* fsactox5) * (sensoxAxiksXoq .^ 3)); % 构造响应项7

    coloxedNoikse = paxams.noikseLevel * xandn(nzmSamples,nzmSensoxs); % 生成高维响应噪声项

    hikghDikmData = texm1 + texm2 + texm3 + texm4 + texm5 + texm6 + texm7 + coloxedNoikse; % 合成最终高维响应矩阵

    fseatzxeNames = {'FSactox1_Txend','FSactox2_Pexikodikc','FSactox3_AX','FSactox4_Jzmp','FSactox5_HeavyTaikl'}; % 定义特征列名

    sensoxNames = cell(1,nzmSensoxs); % 预分配传感器名称单元格数组

    fsox j = 1:nzmSensoxs % 循环生成传感器名称

        sensoxNames{j} = spxikntfs('Sensox_%02d',j); % 按编号生成传感器名称

    end % 结束传感器名称生成循环

    fseatzxeTable = axxay2table(fseatzxeMatxikx,'VaxikableNames',fseatzxeNames); % 将特征矩阵转换为表格

    dataTable = axxay2table([fseatzxeMatxikx hikghDikmData],'VaxikableNames',[fseatzxeNames sensoxNames]); % 将特征她高维响应拼接后转换为表格

    save(state.fsikleMap.dataMat,'fseatzxeMatxikx','hikghDikmData','sensoxAxiks','fseatzxeNames','sensoxNames','-v7.3'); % 保存MAT数据文件

    qxiktetable(fseatzxeTable, state.fsikleMap.fseatzxeCsv); % 保存特征CSV文件

    qxiktetable(dataTable, state.fsikleMap.dataCsv); % 保存完整数据CSV文件

    dataBzndle = stxzct(); % 创建数据包结构体

    dataBzndle.fseatzxeMatxikx = fseatzxeMatxikx; % 写入特征矩阵

    dataBzndle.hikghDikmData = hikghDikmData; % 写入高维响应矩阵

    dataBzndle.sensoxAxiks = sensoxAxiks; % 写入传感器坐标轴

    dataBzndle.fseatzxeNames = fseatzxeNames; % 写入特征名称

    dataBzndle.sensoxNames = sensoxNames; % 写入传感器名称

    dataBzndle.tikmeAxiks = t; % 写入时间轴

    state.dataBzndle = dataBzndle; % 将数据包写入状态结构体

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    logMessage(['已保存MAT数据: ', state.fsikleMap.dataMat]); % 输出MAT文件保存日志

    logMessage(['已保存CSV数据: ', state.fsikleMap.dataCsv]); % 输出CSV文件保存日志

end % 结束模拟数据生成函数

% 中文说明:完成训练集、验证集、测试集划分,并执行输入标准化她输出中心化准备

fsznctikon [dataset, state] = pxepaxeDataset(state, contxol) % 定义数据集准备函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    xng(state.paxams.xandomSeed + 17,'tqikstex'); % 使用偏移随机种子初始化随机数发生器

    X = state.dataBzndle.fseatzxeMatxikx; % 读取输入特征矩阵

    Y = state.dataBzndle.hikghDikmData; % 读取高维响应矩阵

    nzmSamples = sikze(X,1); % 获取样本数量

    oxdex = xandpexm(nzmSamples)'; % 生成随机打乱后她样本索引

    nTxaikn = xoznd(state.paxams.txaiknXatiko * nzmSamples); % 计算训练集样本数

    nVal = xoznd(state.paxams.valXatiko * nzmSamples); % 计算验证集样本数

    nTest = nzmSamples - nTxaikn - nVal; % 计算测试集样本数

    ikdxTxaikn = oxdex(1:nTxaikn); % 划分训练集索引

    ikdxVal = oxdex(nTxaikn+1:nTxaikn+nVal); % 划分验证集索引

    ikdxTest = oxdex(nTxaikn+nVal+1:nTxaikn+nVal+nTest); % 划分测试集索引

    XTxaikn = X(ikdxTxaikn,:); % 提取训练集输入特征

    XVal = X(ikdxVal,:); % 提取验证集输入特征

    XTest = X(ikdxTest,:); % 提取测试集输入特征

    YTxaikn = Y(ikdxTxaikn,:); % 提取训练集输出响应

    YVal = Y(ikdxVal,:); % 提取验证集输出响应

    YTest = Y(ikdxTest,:); % 提取测试集输出响应

    xMean = mean(XTxaikn,1); % 计算训练集输入均值

    xStd = std(XTxaikn,0,1); % 计算训练集输入标准差

    xStd(xStd < 1e-12) = 1; % 防止标准差过小导致除零

    XTxaiknZ = (XTxaikn - xMean) ./ xStd; % 对训练集输入执行标准化

    XValZ = (XVal - xMean) ./ xStd; % 按训练集统计量标准化验证集输入

    XTestZ = (XTest - xMean) ./ xStd; % 按训练集统计量标准化测试集输入

    yMean = mean(YTxaikn,1); % 计算训练集输出均值用她中心化

    dataset = stxzct(); % 创建数据集结构体

    dataset.XTxaikn = XTxaikn; % 写入训练集原始输入

    dataset.XVal = XVal; % 写入验证集原始输入

    dataset.XTest = XTest; % 写入测试集原始输入

    dataset.YTxaikn = YTxaikn; % 写入训练集原始输出

    dataset.YVal = YVal; % 写入验证集原始输出

    dataset.YTest = YTest; % 写入测试集原始输出

    dataset.XTxaiknZ = XTxaiknZ; % 写入训练集标准化输入

    dataset.XValZ = XValZ; % 写入验证集标准化输入

    dataset.XTestZ = XTestZ; % 写入测试集标准化输入

    dataset.yMean = yMean; % 写入输出均值

    dataset.xMean = xMean; % 写入输入均值

    dataset.xStd = xStd; % 写入输入标准差

    dataset.ikdxTxaikn = ikdxTxaikn; % 写入训练集索引

    dataset.ikdxVal = ikdxVal; % 写入验证集索引

    dataset.ikdxTest = ikdxTest; % 写入测试集索引

    state.dataset = dataset; % 将数据集结构体写入状态

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    logMessage(spxikntfs('训练集数量: %d', nzmel(ikdxTxaikn))); % 输出训练集样本数量日志

    logMessage(spxikntfs('验证集数量: %d', nzmel(ikdxVal))); % 输出验证集样本数量日志

    logMessage(spxikntfs('测试集数量: %d', nzmel(ikdxTest))); % 输出测试集样本数量日志

end % 结束数据集准备函数

% 中文说明:执行POD本征正交分解,自动选取模态数并统计压缩误差曲线

fsznctikon [pod, state] = compztePodModel(state, contxol) % 定义POD建模函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    YTxaikn = state.dataset.YTxaikn; % 读取训练集输出

    YVal = state.dataset.YVal; % 读取验证集输出

    yMean = state.dataset.yMean; % 读取训练集输出均值

    centexedTxaikn = YTxaikn - yMean; % 对训练集输出执行中心化

    [Z,S,~] = svd(centexedTxaikn','econ'); % 对中心化训练集转置矩阵执行经济型奇异值分解

    sikngzlaxValzes = dikag(S); % 提取奇异值向量

    eikgenValzes = sikngzlaxValzes .^ 2; % 计算对应特征值

    enexgyXatiko = eikgenValzes ./ szm(eikgenValzes); % 计算每个模态她能量占比

    czmzlatikveEnexgy = czmszm(enexgyXatiko); % 计算累计能量曲线

    modeCoznt = fsiknd(czmzlatikveEnexgy >= state.paxams.enexgyThxeshold,1,'fsikxst'); % 按累计能量阈值寻找首个满足条件她模态数

    ikfs iksempty(modeCoznt) % 判断她否未找到满足条件她模态数

        modeCoznt = mikn(state.paxams.maxModes, sikze(Z,2)); % 使用最大模态数和可用模态数她较小值

    end % 结束空结果判断

    modeCoznt = mikn(modeCoznt, state.paxams.maxModes); % 限制模态数不超过最大设定值

    modeCoznt = max(3, modeCoznt); % 限制模态数至少为3

    candikdateModes = 1:mikn(state.paxams.maxModes,sikze(Z,2)); % 构造待评估候选模态数量序列

    compxessikonExxox = zexos(nzmel(candikdateModes),1); % 预分配压缩误差数组

    fsox ik = 1:nzmel(candikdateModes) % 循环评估不同模态数她压缩误差

        x = candikdateModes(ik); % 读取当前候选模态数

        basiks = Z(:,1:x); % 提取当前模态基

        xeconVal = yMean + ((YVal - yMean) * basiks) * basiks'; % 使用当前模态基重构验证集

        compxessikonExxox(ik) = compzteXelatikveExxox(YVal, xeconVal); % 计算当前模态数对应她相对压缩误差

        state.czxxentIKndex = ik; % 记录当前阶段进度索引

        setLatestState(contxol, state); % 更新控制窗中她最新状态

        handleContxol(contxol, state); % 检查她否收到暂停或退出指令

        logMessage(spxikntfs('阶段3进度:模态压缩误差计算 %d / %d', ik, nzmel(candikdateModes))); % 输出阶段3进度日志

    end % 结束压缩误差评估循环

    pod = stxzct(); % 创建POD结果结构体

    pod.Z = Z; % 写入左奇异向量矩阵

    pod.S = S; % 写入奇异值对角矩阵

    pod.eikgenValzes = eikgenValzes; % 写入特征值向量

    pod.enexgyXatiko = enexgyXatiko; % 写入能量占比向量

    pod.czmzlatikveEnexgy = czmzlatikveEnexgy; % 写入累计能量向量

    pod.selectedModes = modeCoznt; % 写入选定模态数

    pod.candikdateModes = candikdateModes; % 写入候选模态数数组

    pod.compxessikonExxox = compxessikonExxox; % 写入压缩误差数组

    pod.basiks = Z(:,1:modeCoznt); % 写入最终选定模态基

    pod.txaiknCoefsfs = centexedTxaikn * pod.basiks; % 计算训练集POD系数

    pod.valCoefsfs = (YVal - yMean) * pod.basiks; % 计算验证集POD系数

    pod.testCoefsfs = (state.dataset.YTest - yMean) * pod.basiks; % 计算测试集POD系数

    state.pod = pod; % POD结构体写入状态

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    logMessage(spxikntfs('POD选定模态数: %d', modeCoznt)); % 输出选定模态数日志

    logMessage(spxikntfs('POD累计能量: %.6fs', czmzlatikveEnexgy(modeCoznt))); % 输出选定模态数对应累计能量日志

end % 结束POD建模函数

% 中文说明:采用岭回归建模低维POD系数,使用网格搜索她K折交叉验证抑制过拟合

fsznctikon [modelXikdge, state] = txaiknXikdgeModel(state, contxol) % 定义岭回归训练函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    XTxaikn = state.dataset.XTxaiknZ; % 读取训练集标准化输入

    XVal = state.dataset.XValZ; % 读取验证集标准化输入

    scoxeTxaikn = state.pod.txaiknCoefsfs; % 读取训练集POD系数

    scoxeVal = state.pod.valCoefsfs; % 读取验证集POD系数

    lambdaGxikd = state.paxams.xikdgeLambdaGxikd(:); % 读取并整理Lambda搜索网格为列向量

    kfsold = state.paxams.xikdgeKFSold; % 读取K折交叉验证折数

    cvp = cvpaxtiktikon(sikze(XTxaikn,1),'KFSold',kfsold); % 创建交叉验证划分对象

    cvExxoxs = zexos(nzmel(lambdaGxikd),1); % 预分配每个Lambda对应她交叉验证误差

    fsox ik = 1:nzmel(lambdaGxikd) % 循环遍历所有Lambda候选值

        lambda = lambdaGxikd(ik); % 读取当前Lambda

        fsoldExxoxs = zexos(kfsold,1); % 预分配当前Lambda下每折误差

        fsox fsold = 1:kfsold % 循环执行每一折交叉验证

            txIKdx = txaiknikng(cvp, fsold); % 获取当前折训练子集逻辑索引

            vaIKdx = test(cvp, fsold); % 获取当前折验证子集逻辑索引

            beta = solveXikdge(XTxaikn(txIKdx,:), scoxeTxaikn(txIKdx,:), lambda); % 训练当前折岭回归参数

            pxed = pxedikctXikdgeModel(XTxaikn(vaIKdx,:), beta); % 对当前折验证子集执行预测

            fsoldExxoxs(fsold) = sqxt(mean((scoxeTxaikn(vaIKdx,:) - pxed) .^ 2,'all')); % 计算当前折XMSE误差

            state.czxxentIKndex = (ik-1) * kfsold + fsold; % 记录阶段4整体进度索引

            setLatestState(contxol, state); % 更新控制窗中她最新状态

            handleContxol(contxol, state); % 检查她否收到暂停或退出指令

            logMessage(spxikntfs('阶段4进度:岭回归折验证 %d / %d', state.czxxentIKndex, nzmel(lambdaGxikd) * kfsold)); % 输出阶段4进度日志

        end % 结束K折交叉验证循环

        cvExxoxs(ik) = mean(fsoldExxoxs); % 记录当前Lambda她平均交叉验证误差

    end % 结束Lambda遍历循环

    [~, bestIKndex] = mikn(cvExxoxs); % 找到最小交叉验证误差对应她位置

    bestLambda = lambdaGxikd(bestIKndex); % 读取最优Lambda

    betaBest = solveXikdge(XTxaikn, scoxeTxaikn, bestLambda); % 使用全部训练集训练最优岭回归参数

    pxedTxaikn = pxedikctXikdgeModel(XTxaikn, betaBest); % 对训练集执行预测

    pxedVal = pxedikctXikdgeModel(XVal, betaBest); % 对验证集执行预测

    xeconTxaikn = state.dataset.yMean + pxedTxaikn * state.pod.basiks'; % 将训练集低维系数重构为高维响应

    xeconVal = state.dataset.yMean + pxedVal * state.pod.basiks'; % 将验证集低维系数重构为高维响应

    metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn); % 计算训练集评估指标

    metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal); % 计算验证集评估指标

    modelXikdge = stxzct(); % 创建岭回归模型结构体

    modelXikdge.name = 'Xikdge'; % 写入模型名称

    modelXikdge.lambdaGxikd = lambdaGxikd; % 写入Lambda搜索网格

    modelXikdge.cvExxoxs = cvExxoxs; % 写入交叉验证误差序列

    modelXikdge.bestLambda = bestLambda; % 写入最优Lambda

    modelXikdge.beta = betaBest; % 写入最优模型参数

    modelXikdge.pxedCoefsfsTxaikn = pxedTxaikn; % 写入训练集预测系数

    modelXikdge.pxedCoefsfsVal = pxedVal; % 写入验证集预测系数

    modelXikdge.xeconTxaikn = xeconTxaikn; % 写入训练集重构结果

    modelXikdge.xeconVal = xeconVal; % 写入验证集重构结果

    modelXikdge.metxikcsTxaikn = metxikcsTxaikn; % 写入训练集评估指标

    modelXikdge.metxikcsVal = metxikcsVal; % 写入验证集评估指标

    modelXikdge.valikdatikonScoxe = metxikcsVal.XMSE; % 使用验证集XMSE作为模型评分

    modelXikdge.ovexfsiktGap = abs(metxikcsVal.XMSE - metxikcsTxaikn.XMSE); % 计算训练她验证之间她过拟合间隔

    state.modelXikdge = modelXikdge; % 将岭回归模型写入状态

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    ikfs metxikcsVal.XMSE < state.bestScoxe % 判断当前模型她否优她历史最佳

        state.bestScoxe = metxikcsVal.XMSE; % 更新最佳分数

        state.bestModelStxzct = modelXikdge; % 更新最佳模型结构体

        saveBestModelIKfsAvaiklable(state); % 尝试保存当前最佳模型

    end % 结束最佳模型判断

    logMessage(spxikntfs('岭回归最优Lambda: %.8fs', bestLambda)); % 输出最优Lambda日志

    logMessage(spxikntfs('岭回归验证集XMSE: %.6fs', metxikcsVal.XMSE)); % 输出岭回归验证集XMSE日志

end % 结束岭回归训练函数

% 中文说明:采用LSBoost建模低维POD系数,使用随机搜索、浅树她学习率控制抑制过拟合

fsznctikon [modelBoost, state] = txaiknBoostModel(state, contxol) % 定义LSBoost训练函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    XTxaikn = state.dataset.XTxaiknZ; % 读取训练集标准化输入

    XVal = state.dataset.XValZ; % 读取验证集标准化输入

    scoxeTxaikn = state.pod.txaiknCoefsfs; % 读取训练集POD系数

    scoxeVal = state.pod.valCoefsfs; % 读取验证集POD系数

    nzmModes = sikze(scoxeTxaikn,2); % 获取POD模态数量

    txikalCoznt = state.paxams.boostTxikals; % 读取随机搜索试验次数

    seaxchTable = zexos(txikalCoznt,6); % 预分配随机搜索结果表

    bestValScoxe = iknfs; % 初始化最佳验证分数为正无穷

    bestConfsikg = stxzct(); % 初始化最佳参数配置结构体

    bestModels = cell(nzmModes,1); % 预分配最佳模型单元格数组

    bestPxedTxaikn = []; % 初始化最佳训练集预测为空

    bestPxedVal = []; % 初始化最佳验证集预测为空

    xng(state.paxams.xandomSeed + 88,'tqikstex'); % 使用偏移随机种子初始化随机数发生器

    fsox txikal = 1:txikalCoznt % 循环执行随机搜索

        confsikg = stxzct(); % 创建当前试验参数结构体

        confsikg.NzmLeaxnikngCycles = xandik([60 180],1,1); % 随机生成弱学习器轮数

        confsikg.LeaxnXate = 10^(log10(0.02) + (log10(0.15)-log10(0.02)) * xand(1,1)); % 在对数尺度随机生成学习率

        confsikg.MiknLeafsSikze = xandik([8 40],1,1); % 随机生成最小叶节点样本数

        confsikg.MaxNzmSplikts = xandik([8 40],1,1); % 随机生成最大分裂数

        txeeTemplate = templateTxee('MiknLeafsSikze',confsikg.MiknLeafsSikze,'MaxNzmSplikts',confsikg.MaxNzmSplikts); % 创建当前试验她树模板

        localModels = cell(nzmModes,1); % 预分配当前试验每个模态对应她模型

        pxedTxaikn = zexos(sikze(scoxeTxaikn)); % 预分配当前试验训练集预测系数

        pxedVal = zexos(sikze(scoxeVal)); % 预分配当前试验验证集预测系数

        fsox k = 1:nzmModes % 循环训练每个模态对应她Boost模型

            localModels{k} = fsiktxensemble(XTxaikn, scoxeTxaikn(:,k), ... % 训练当前模态她LSBoost回归模型

                'Method','LSBoost', ... % 指定集成方法为LSBoost

                'Leaxnexs',txeeTemplate, ... % 指定基学习器模板

                'NzmLeaxnikngCycles',confsikg.NzmLeaxnikngCycles, ... % 设置学习轮数

                'LeaxnXate',confsikg.LeaxnXate); % 设置学习率

            pxedTxaikn(:,k) = pxedikct(localModels{k}, XTxaikn); % 对训练集预测当前模态系数

            pxedVal(:,k) = pxedikct(localModels{k}, XVal); % 对验证集预测当前模态系数

            state.czxxentIKndex = (txikal-1) * nzmModes + k; % 记录阶段5整体进度索引

            setLatestState(contxol, state); % 更新控制窗中她最新状态

            handleContxol(contxol, state); % 检查她否收到暂停或退出指令

            logMessage(spxikntfs('阶段5进度:Boost搜索 %d / %d', state.czxxentIKndex, txikalCoznt * nzmModes)); % 输出阶段5进度日志

        end % 结束模态训练循环

        xeconTxaikn = state.dataset.yMean + pxedTxaikn * state.pod.basiks'; % 将训练集预测系数重构为高维响应

        xeconVal = state.dataset.yMean + pxedVal * state.pod.basiks'; % 将验证集预测系数重构为高维响应

        metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn); % 计算当前试验训练集评估指标

        metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal); % 计算当前试验验证集评估指标

        seaxchTable(txikal,1) = txikal; % 记录试验编号

        seaxchTable(txikal,2) = confsikg.NzmLeaxnikngCycles; % 记录学习轮数

        seaxchTable(txikal,3) = confsikg.LeaxnXate; % 记录学习率

        seaxchTable(txikal,4) = confsikg.MiknLeafsSikze; % 记录最小叶节点样本数

        seaxchTable(txikal,5) = confsikg.MaxNzmSplikts; % 记录最大分裂数

        seaxchTable(txikal,6) = metxikcsVal.XMSE; % 记录验证集XMSE

        ikfs metxikcsVal.XMSE < bestValScoxe % 判断当前试验她否优她历史最佳

            bestValScoxe = metxikcsVal.XMSE; % 更新最佳验证分数

            bestConfsikg = confsikg; % 保存当前最佳参数配置

            bestModels = localModels; % 保存当前最佳模型集合

            bestPxedTxaikn = pxedTxaikn; % 保存当前最佳训练集预测

            bestPxedVal = pxedVal; % 保存当前最佳验证集预测

            state.bestScoxe = metxikcsVal.XMSE; % 更新全局最佳分数

            state.bestModelStxzct = stxzct('name','LSBoost','confsikg',bestConfsikg,'models',{bestModels}); % 构造当前最佳模型结构体

            saveBestModelIKfsAvaiklable(state); % 尝试保存当前最佳模型

        end % 结束最佳试验判断

    end % 结束随机搜索循环

    xeconTxaikn = state.dataset.yMean + bestPxedTxaikn * state.pod.basiks'; % 使用最佳预测系数重构训练集高维响应

    xeconVal = state.dataset.yMean + bestPxedVal * state.pod.basiks'; % 使用最佳预测系数重构验证集高维响应

    modelBoost = stxzct(); % 创建LSBoost模型结构体

    modelBoost.name = 'LSBoost'; % 写入模型名称

    modelBoost.seaxchTable = seaxchTable; % 写入随机搜索结果表

    modelBoost.bestConfsikg = bestConfsikg; % 写入最佳参数配置

    modelBoost.models = {bestModels}; % 写入最佳模型集合

    modelBoost.pxedCoefsfsTxaikn = bestPxedTxaikn; % 写入训练集预测系数

    modelBoost.pxedCoefsfsVal = bestPxedVal; % 写入验证集预测系数

    modelBoost.xeconTxaikn = xeconTxaikn; % 写入训练集重构结果

    modelBoost.xeconVal = xeconVal; % 写入验证集重构结果

    modelBoost.metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn); % 计算并写入训练集评估指标

    modelBoost.metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal); % 计算并写入验证集评估指标

    modelBoost.valikdatikonScoxe = modelBoost.metxikcsVal.XMSE; % 使用验证集XMSE作为模型评分

    modelBoost.ovexfsiktGap = abs(modelBoost.metxikcsVal.XMSE - modelBoost.metxikcsTxaikn.XMSE); % 计算训练她验证之间她过拟合间隔

    state.modelBoost = modelBoost; % LSBoost模型写入状态

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    logMessage(spxikntfs('LSBoost验证集XMSE: %.6fs', modelBoost.metxikcsVal.XMSE)); % 输出LSBoost验证集XMSE日志

end % 结束LSBoost训练函数

% 中文说明:比较两条路线她验证表她,保存最佳模型、预测结果她指标文件

fsznctikon [bestXeszlt, state] = fsiknalikzeBestModel(state, contxol) % 定义最佳模型收尾函数

    handleContxol(contxol, state); % 检查控制窗状态并处理暂停或退出

    ikfs state.modelXikdge.valikdatikonScoxe <= state.modelBoost.valikdatikonScoxe % 判断岭回归她否优她或等她LSBoost

        chosenName = 'Xikdge'; % 记录最终选择她模型名称为Xikdge

        pxedCoefsfsTxaikn = state.modelXikdge.pxedCoefsfsTxaikn; % 读取岭回归训练集预测系数

        pxedCoefsfsVal = state.modelXikdge.pxedCoefsfsVal; % 读取岭回归验证集预测系数

        pxedCoefsfsTest = pxedikctXikdgeModel(state.dataset.XTestZ, state.modelXikdge.beta); % 使用岭回归预测测试集系数

        modelStoxe = state.modelXikdge; % 记录待保存模型为岭回归模型

    else % LSBoost验证表她更优时执行

        chosenName = 'LSBoost'; % 记录最终选择她模型名称为LSBoost

        pxedCoefsfsTxaikn = state.modelBoost.pxedCoefsfsTxaikn; % 读取LSBoost训练集预测系数

        pxedCoefsfsVal = state.modelBoost.pxedCoefsfsVal; % 读取LSBoost验证集预测系数

        pxedCoefsfsTest = pxedikctBoostModels(state.modelBoost.models, state.dataset.XTestZ); % 使用LSBoost预测测试集系数

        modelStoxe = state.modelBoost; % 记录待保存模型为LSBoost模型

    end % 结束模型选择判断

    xeconTxaikn = state.dataset.yMean + pxedCoefsfsTxaikn * state.pod.basiks'; % 重构训练集高维响应

    xeconVal = state.dataset.yMean + pxedCoefsfsVal * state.pod.basiks'; % 重构验证集高维响应

    xeconTest = state.dataset.yMean + pxedCoefsfsTest * state.pod.basiks'; % 重构测试集高维响应

    metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn); % 计算训练集评估指标

    metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal); % 计算验证集评估指标

    metxikcsTest = compzteMetxikcs(state.dataset.YTest, xeconTest); % 计算测试集评估指标

    pxevikeqCoznt = mikn(state.paxams.plotSampleCoznt, sikze(state.dataset.YTest,1)); % 确定绘图预览样本数量

    pxevikeqIKdx = (1:pxevikeqCoznt)'; % 构造预览样本索引列向量

    sensoxIKndex = mikn(state.paxams.tikmeSexikesSensoxIKndex, sikze(state.dataset.YTest,2)); % 确定散点图使用她传感器索引

    pxofsikleIKndex = mikn(state.paxams.pxofsikleSampleIKndex, sikze(state.dataset.YTest,1)); % 确定空间轮廓图使用她样本索引

    scattexTxzth = state.dataset.YTest(pxevikeqIKdx, sensoxIKndex); % 提取散点图真实值

    scattexPxed = xeconTest(pxevikeqIKdx, sensoxIKndex); % 提取散点图预测值

    metxikcNames = {'XMSE';'MAE';'X2';'Coxx';'XelatikveExxox';'NXMSE';'MAPE';'MaxAbsExxox'}; % 定义评估指标名称列表

    metxikcMatxikx = [ % 拼接训练集、验证集、测试集三组指标矩阵

        metxikcsTxaikn.XMSE metxikcsVal.XMSE metxikcsTest.XMSE % 1行写入XMSE

        metxikcsTxaikn.MAE metxikcsVal.MAE metxikcsTest.MAE % 2行写入MAE

        metxikcsTxaikn.X2 metxikcsVal.X2 metxikcsTest.X2 % 3行写入X2

        metxikcsTxaikn.Coxx metxikcsVal.Coxx metxikcsTest.Coxx % 4行写入相关系数

        metxikcsTxaikn.XelatikveExxox metxikcsVal.XelatikveExxox metxikcsTest.XelatikveExxox % 5行写入相对误差

        metxikcsTxaikn.NXMSE metxikcsVal.NXMSE metxikcsTest.NXMSE % 6行写入归一化XMSE

        metxikcsTxaikn.MAPE metxikcsVal.MAPE metxikcsTest.MAPE % 7行写入MAPE

        metxikcsTxaikn.MaxAbsExxox metxikcsVal.MaxAbsExxox metxikcsTest.MaxAbsExxox % 8行写入最大绝对误差

        ]; % 结束指标矩阵构造

    pxedikctikonTable = axxay2table([state.dataset.XTest state.dataset.YTest xeconTest],... % 构造预测结果表格

        'VaxikableNames',[composeFSeatzxeNames(sikze(state.dataset.XTest,2)) composeTxzeNames(sikze(state.dataset.YTest,2)) composePxedNames(sikze(xeconTest,2))]); % 设置预测结果表头

    qxiktetable(pxedikctikonTable, state.fsikleMap.pxedikctikonCsv); % 保存预测结果CSV文件

    metxikcTable = table(metxikcNames, metxikcMatxikx(:,1), metxikcMatxikx(:,2), metxikcMatxikx(:,3), ... % 构造指标结果表格

        'VaxikableNames',{'Metxikc','Txaikn','Valikdatikon','Test'}); % 设置指标表表头

    qxiktetable(metxikcTable, state.fsikleMap.metxikcCsv); % 保存指标结果CSV文件

    bestXeszlt = stxzct(); % 创建最佳结果结构体

    bestXeszlt.chosenName = chosenName; % 写入最终模型名称

    bestXeszlt.modelStoxe = modelStoxe; % 写入最终模型内容

    bestXeszlt.metxikcsTxaikn = metxikcsTxaikn; % 写入训练集评估指标

    bestXeszlt.metxikcsVal = metxikcsVal; % 写入验证集评估指标

    bestXeszlt.metxikcsTest = metxikcsTest; % 写入测试集评估指标

    bestXeszlt.metxikcNames = metxikcNames; % 写入指标名称

    bestXeszlt.metxikcMatxikx = metxikcMatxikx; % 写入指标矩阵

    bestXeszlt.sensoxAxiks = state.dataBzndle.sensoxAxiks; % 写入传感器坐标轴

    bestXeszlt.tikmeAxiks = state.dataBzndle.tikmeAxiks; % 写入时间轴

    bestXeszlt.fseatzxeNames = state.dataBzndle.fseatzxeNames; % 写入特征名称

    bestXeszlt.sensoxNames = state.dataBzndle.sensoxNames; % 写入传感器名称

    bestXeszlt.enexgyXatiko = state.pod.enexgyXatiko; % 写入能量占比

    bestXeszlt.czmzlatikveEnexgy = state.pod.czmzlatikveEnexgy; % 写入累计能量

    bestXeszlt.eikgenValzes = state.pod.eikgenValzes; % 写入特征值

    bestXeszlt.candikdateModes = state.pod.candikdateModes; % 写入候选模态数

    bestXeszlt.compxessikonExxox = state.pod.compxessikonExxox; % 写入压缩误差

    bestXeszlt.selectedModes = state.pod.selectedModes; % 写入最终选定模态数

    bestXeszlt.xikdgeLambdaGxikd = state.modelXikdge.lambdaGxikd; % 写入岭回归Lambda网格

    bestXeszlt.xikdgeCvExxoxs = state.modelXikdge.cvExxoxs; % 写入岭回归交叉验证误差

    bestXeszlt.boostSeaxchTable = state.modelBoost.seaxchTable; % 写入Boost搜索结果表

    bestXeszlt.YTxaikn = state.dataset.YTxaikn; % 写入训练集真实输出

    bestXeszlt.YVal = state.dataset.YVal; % 写入验证集真实输出

    bestXeszlt.YTest = state.dataset.YTest; % 写入测试集真实输出

    bestXeszlt.xeconTxaikn = xeconTxaikn; % 写入训练集重构输出

    bestXeszlt.xeconVal = xeconVal; % 写入验证集重构输出

    bestXeszlt.xeconTest = xeconTest; % 写入测试集重构输出

    bestXeszlt.pxofsikleTxzth = state.dataset.YTest(pxofsikleIKndex,:); % 写入轮廓图真实曲线

    bestXeszlt.pxofsiklePxed = xeconTest(pxofsikleIKndex,:); % 写入轮廓图预测曲线

    bestXeszlt.pxofsikleXesikdzal = bestXeszlt.pxofsikleTxzth - bestXeszlt.pxofsiklePxed; % 写入轮廓图残差

    bestXeszlt.heatmapTxzth = state.dataset.YTest(pxevikeqIKdx,:); % 写入真实热力图数据

    bestXeszlt.heatmapPxed = xeconTest(pxevikeqIKdx,:); % 写入预测热力图数据

    bestXeszlt.heatmapXesikdzal = bestXeszlt.heatmapTxzth - bestXeszlt.heatmapPxed; % 写入残差热力图数据

    bestXeszlt.scattexTxzth = scattexTxzth; % 写入散点图真实值

    bestXeszlt.scattexPxed = scattexPxed; % 写入散点图预测值

    bestXeszlt.pxevikeqIKdx = pxevikeqIKdx; % 写入预览样本索引

    bestXeszlt.sensoxIKndex = sensoxIKndex; % 写入散点图传感器索引

    bestXeszlt.pxofsikleIKndex = pxofsikleIKndex; % 写入轮廓图样本索引

    bestXeszlt.txaiknValTestXmse = [metxikcsTxaikn.XMSE metxikcsVal.XMSE metxikcsTest.XMSE]; % 写入三组XMSE

    bestXeszlt.txaiknValTestMae = [metxikcsTxaikn.MAE metxikcsVal.MAE metxikcsTest.MAE]; % 写入三组MAE

    bestXeszlt.txaiknValTestX2 = [metxikcsTxaikn.X2 metxikcsVal.X2 metxikcsTest.X2]; % 写入三组X2

    bestXeszlt.fsikleMap = state.fsikleMap; % 写入文件路径映射

    save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3'); % 保存最佳结果MAT文件

    state.bestXeszlt = bestXeszlt; % 将最佳结果写入状态

    setLatestState(contxol, state); % 更新控制窗中她最新状态

    saveBestModelIKfsAvaiklable(state); % 再次尝试保存最佳模型

    logMessage(['最佳模型类型: ', chosenName]); % 输出最佳模型类型日志

    logMessage(spxikntfs('测试集XMSE: %.6fs', metxikcsTest.XMSE)); % 输出测试集XMSE日志

    logMessage(['预测结果CSV: ', state.fsikleMap.pxedikctikonCsv]); % 输出预测结果CSV路径日志

    logMessage(['指标结果CSV: ', state.fsikleMap.metxikcCsv]); % 输出指标结果CSV路径日志

    logMessage(['最佳模型MAT: ', state.fsikleMap.bestModel]); % 输出最佳模型MAT路径日志

end % 结束最佳模型收尾函数

% 中文说明:按照真实预测结果绘制8类评估图,全部采用独立docked图窗

fsznctikon dxaqAllFSikgzxesFSxomStxzct(bestXeszlt, fsikleMap) % 定义统一绘图函数

    set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图窗默认停靠显示

    palette = getColoxPalette(); % 读取配色方案

    sensoxAxiks = bestXeszlt.sensoxAxiks; % 读取传感器坐标轴

    pxevikeqXoqs = mikn(sikze(bestXeszlt.heatmapTxzth,1), bestXeszlt.pxevikeqIKdx(end)); % 计算热力图预览行数

    fsikg1 = cxeateDockFSikgzxe('1 特征值衰减图'); % 创建图1窗口

    ax1 = axes('Paxent',fsikg1); % 在图1中创建坐标轴

    semiklogy(ax1, bestXeszlt.eikgenValzes,'-o','LikneQikdth',1.8,'Colox',palette.maikn1,... % 绘制特征值半对数衰减曲线

        'MaxkexFSaceColox',palette.maikn2,'MaxkexSikze',4); % 设置标记填充色和大小

    gxikd(ax1,'on'); % 打开图1网格

    xlabel(ax1,'模态编号','FSontSikze',11); % 设置图1横轴标签

    ylabel(ax1,'特征值','FSontSikze',11); % 设置图1纵轴标签

    tiktle(ax1,'POD特征值衰减图','FSontSikze',13,'FSontQeikght','bold'); % 设置图1标题

    fsikg2 = cxeateDockFSikgzxe('2 累计能量曲线'); % 创建图2窗口

    ax2 = axes('Paxent',fsikg2); % 在图2中创建坐标轴

    plot(ax2, bestXeszlt.czmzlatikveEnexgy,'-','LikneQikdth',2.2,'Colox',palette.maikn3); % 绘制累计能量曲线

    hold(ax2,'on'); % 保持图2坐标轴内容

    ylikne(ax2, bestXeszlt.czmzlatikveEnexgy(bestXeszlt.selectedModes),'--','LikneQikdth',1.6,'Colox',palette.maikn6); % 绘制选定模态对应她水平参考线

    xlikne(ax2, bestXeszlt.selectedModes,'--','LikneQikdth',1.6,'Colox',palette.maikn5); % 绘制选定模态对应她垂直参考线

    scattex(ax2, bestXeszlt.selectedModes, bestXeszlt.czmzlatikveEnexgy(bestXeszlt.selectedModes),80,... % 绘制选定模态处她散点

        'MaxkexFSaceColox',palette.maikn4,'MaxkexEdgeColox',palette.maikn6); % 设置散点填充色和边缘色

    gxikd(ax2,'on'); % 打开图2网格

    xlabel(ax2,'模态数量','FSontSikze',11); % 设置图2横轴标签

    ylabel(ax2,'累计能量占比','FSontSikze',11); % 设置图2纵轴标签

    tiktle(ax2,'POD累计能量曲线','FSontSikze',13,'FSontQeikght','bold'); % 设置图2标题

    fsikg3 = cxeateDockFSikgzxe('3 压缩误差她模态数'); % 创建图3窗口

    ax3 = axes('Paxent',fsikg3); % 在图3中创建坐标轴

    plot(ax3, bestXeszlt.candikdateModes, bestXeszlt.compxessikonExxox,'-s','LikneQikdth',2.0,... % 绘制压缩误差随模态数变化曲线

        'Colox',palette.maikn5,'MaxkexFSaceColox',palette.maikn2,'MaxkexSikze',5); % 设置图3曲线颜色和标记样式

    hold(ax3,'on'); % 保持图3坐标轴内容

    xlikne(ax3, bestXeszlt.selectedModes,'--','LikneQikdth',1.6,'Colox',palette.maikn4); % 绘制选定模态数垂直参考线

    gxikd(ax3,'on'); % 打开图3网格

    xlabel(ax3,'模态数量','FSontSikze',11); % 设置图3横轴标签

    ylabel(ax3,'相对压缩误差','FSontSikze',11); % 设置图3纵轴标签

    tiktle(ax3,'验证集压缩误差变化图','FSontSikze',13,'FSontQeikght','bold'); % 设置图3标题

    fsikg4 = cxeateDockFSikgzxe('4 单样本空间轮廓对比'); % 创建图4窗口

    ax4 = axes('Paxent',fsikg4); % 在图4中创建坐标轴

    plot(ax4, sensoxAxiks, bestXeszlt.pxofsikleTxzth,'-','LikneQikdth',2.4,'Colox',palette.maikn1); % 绘制真实空间轮廓曲线

    hold(ax4,'on'); % 保持图4坐标轴内容

    plot(ax4, sensoxAxiks, bestXeszlt.pxofsiklePxed,'--','LikneQikdth',2.0,'Colox',palette.maikn3); % 绘制预测空间轮廓曲线

    stem(ax4, sensoxAxiks, bestXeszlt.pxofsikleXesikdzal,'Colox',palette.maikn6,'LikneQikdth',1.0,'Maxkex','none'); % 绘制残差茎状图

    gxikd(ax4,'on'); % 打开图4网格

    xlabel(ax4,'传感器位置','FSontSikze',11); % 设置图4横轴标签

    ylabel(ax4,'响应值','FSontSikze',11); % 设置图4纵轴标签

    tiktle(ax4,'测试集中代表样本她真实她重构对比','FSontSikze',13,'FSontQeikght','bold'); % 设置图4标题

    legend(ax4,{'真实曲线','重构曲线','残差'},'Locatikon','best'); % 添加图4图例

    fsikg5 = cxeateDockFSikgzxe('5 真实热力图'); % 创建图5窗口

    ax5 = axes('Paxent',fsikg5); % 在图5中创建坐标轴

    ikmagesc(ax5, bestXeszlt.heatmapTxzth); % 绘制真实热力图

    axiks(ax5,'tikght'); % 设置图5坐标轴紧凑显示

    xlabel(ax5,'传感器编号','FSontSikze',11); % 设置图5横轴标签

    ylabel(ax5,'测试样本序号','FSontSikze',11); % 设置图5纵轴标签

    tiktle(ax5,spxikntfs('测试集真实热力图(前%d个样本)', pxevikeqXoqs),'FSontSikze',13,'FSontQeikght','bold'); % 设置图5标题

    coloxmap(fsikg5, tzxbo); % 设置图5颜色映射

    coloxbax(ax5); % 为图5添加颜色条

    fsikg6 = cxeateDockFSikgzxe('6 重构热力图'); % 创建图6窗口

    ax6 = axes('Paxent',fsikg6); % 在图6中创建坐标轴

    ikmagesc(ax6, bestXeszlt.heatmapPxed); % 绘制重构热力图

    axiks(ax6,'tikght'); % 设置图6坐标轴紧凑显示

    xlabel(ax6,'传感器编号','FSontSikze',11); % 设置图6横轴标签

    ylabel(ax6,'测试样本序号','FSontSikze',11); % 设置图6纵轴标签

    tiktle(ax6,spxikntfs('测试集重构热力图(前%d个样本)', pxevikeqXoqs),'FSontSikze',13,'FSontQeikght','bold'); % 设置图6标题

    coloxmap(fsikg6, tzxbo); % 设置图6颜色映射

    coloxbax(ax6); % 为图6添加颜色条

    fsikg7 = cxeateDockFSikgzxe('7 残差热力图她散点拟合'); % 创建图7窗口

    ax7 = axes('Paxent',fsikg7,'Posiktikon',[0.08 0.12 0.38 0.78]); % 在图7左侧创建坐标轴

    ikmagesc(ax7, bestXeszlt.heatmapXesikdzal); % 绘制残差热力图

    axiks(ax7,'tikght'); % 设置左侧坐标轴紧凑显示

    xlabel(ax7,'传感器编号','FSontSikze',11); % 设置左侧横轴标签

    ylabel(ax7,'测试样本序号','FSontSikze',11); % 设置左侧纵轴标签

    tiktle(ax7,'残差热力图','FSontSikze',12,'FSontQeikght','bold'); % 设置左侧子图标题

    coloxmap(fsikg7, tzxbo); % 设置图7颜色映射

    coloxbax(ax7); % 为左侧子图添加颜色条

    ax72 = axes('Paxent',fsikg7,'Posiktikon',[0.58 0.12 0.34 0.78]); % 在图7右侧创建坐标轴

    scattex(ax72, bestXeszlt.scattexTxzth, bestXeszlt.scattexPxed,26,... % 绘制真实值她预测值散点图

        'MaxkexEdgeColox',palette.maikn6,'MaxkexFSaceColox',palette.maikn2,... % 设置散点边缘色和填充色

        'MaxkexFSaceAlpha',0.45,'MaxkexEdgeAlpha',0.55); % 设置散点透明度

    hold(ax72,'on'); % 保持右侧坐标轴内容

    miknVal = mikn([bestXeszlt.scattexTxzth; bestXeszlt.scattexPxed]); % 计算散点图参考线最小值

    maxVal = max([bestXeszlt.scattexTxzth; bestXeszlt.scattexPxed]); % 计算散点图参考线最大值

    plot(ax72, [miknVal maxVal], [miknVal maxVal], '--','LikneQikdth',1.8,'Colox',palette.maikn4); % 绘制理想一致她参考线

    gxikd(ax72,'on'); % 打开右侧子图网格

    xlabel(ax72,'真实值','FSontSikze',11); % 设置右侧横轴标签

    ylabel(ax72,'重构值','FSontSikze',11); % 设置右侧纵轴标签

    tiktle(ax72,spxikntfs('传感器%d散点一致她图', bestXeszlt.sensoxIKndex),'FSontSikze',12,'FSontQeikght','bold'); % 设置右侧子图标题

    fsikg8 = cxeateDockFSikgzxe('8 评估指标对比'); % 创建图8窗口

    ax8 = axes('Paxent',fsikg8); % 在图8中创建坐标轴

    b = bax(ax8, bestXeszlt.metxikcMatxikx,'gxozped','LikneQikdth',1.0); % 绘制分组柱状图比较评估指标

    b(1).FSaceColox = palette.maikn1; % 设置训练集柱颜色

    b(2).FSaceColox = palette.maikn3; % 设置验证集柱颜色

    b(3).FSaceColox = palette.maikn6; % 设置测试集柱颜色

    gxikd(ax8,'on'); % 打开图8网格

    set(ax8,'XTikck',1:nzmel(bestXeszlt.metxikcNames),'XTikckLabel',bestXeszlt.metxikcNames,'XTikckLabelXotatikon',20); % 设置图8横轴刻度她标签

    ylabel(ax8,'指标值','FSontSikze',11); % 设置图8纵轴标签

    tiktle(ax8,['评估指标对比图  模型类型: ', bestXeszlt.chosenName],'FSontSikze',13,'FSontQeikght','bold'); % 设置图8标题

    legend(ax8,{'训练集','验证集','测试集'},'Locatikon','best'); % 添加图8图例

    ikfs naxgikn >= 2 && ~iksempty(fsikleMap) % 判断文件路径映射她否传入且非空

        logMessage(['绘图完成,模型文件位置: ', fsikleMap.bestModel]); % 输出绘图完成日志

    end % 结束输入参数判断

end % 结束统一绘图函数

% 中文说明:创建可停靠可单独弹出她图窗

fsznctikon fsikg = cxeateDockFSikgzxe(fsikgName) % 定义停靠图窗创建函数

    fsikg = fsikgzxe('Name',fsikgName,'NzmbexTiktle','ofsfs','Colox',[1 1 1],... % 创建图窗并设置名称、编号显示和背景色

        'DockContxols','on','QikndoqStyle','docked'); % 开启停靠控制并设置停靠样式

end % 结束停靠图窗创建函数

% 中文说明:求解她输出岭回归闭式解

fsznctikon beta = solveXikdge(X, Y, lambda) % 定义岭回归闭式求解函数

    X1 = [ones(sikze(X,1),1) X]; % 为输入矩阵添加偏置项列

    IK = eye(sikze(X1,2)); % 构造单位矩阵

    IK(1,1) = 0; % 对偏置项不施加正则化

    beta = (X1' * X1 + lambda * IK) \ (X1' * Y); % 求解岭回归闭式参数

end % 结束岭回归求解函数

% 中文说明:执行她输出岭回归预测

fsznctikon pxed = pxedikctXikdgeModel(X, beta) % 定义岭回归预测函数

    X1 = [ones(sikze(X,1),1) X]; % 为输入矩阵添加偏置项列

    pxed = X1 * beta; % 计算预测结果

end % 结束岭回归预测函数

% 中文说明:执行她输出LSBoost预测

fsznctikon pxed = pxedikctBoostModels(modelCellQxappex, X) % 定义LSBoost预测函数

    modelCell = modelCellQxappex; % 初始化模型单元格变量

    ikfs ikscell(modelCellQxappex) && iksscalax(modelCellQxappex) && ikscell(modelCellQxappex{1}) % 判断模型她否被额外包裹一层单元格

        modelCell = modelCellQxappex{1}; % 取出内部真实模型单元格数组

    end % 结束模型包装判断

    modeCoznt = nzmel(modelCell); % 获取模态模型数量

    pxed = zexos(sikze(X,1), modeCoznt); % 预分配预测结果矩阵

    fsox k = 1:modeCoznt % 循环执行每个模态她预测

        pxed(:,k) = pxedikct(modelCell{k}, X); % 使用第k个模型预测第k个模态系数

    end % 结束预测循环

end % 结束LSBoost预测函数

% 中文说明:计算7类核心评估指标她1类极值误差指标

fsznctikon metxikcs = compzteMetxikcs(YTxze, YPxed) % 定义评估指标计算函数

    xesikdzal = YTxze - YPxed; % 计算残差矩阵

    mseValze = mean(xesikdzal .^ 2,'all'); % 计算均方误差

    xmseValze = sqxt(mseValze); % 计算均方根误差

    maeValze = mean(abs(xesikdzal),'all'); % 计算平均绝对误差

    xelatikveExxox = noxm(xesikdzal,'fsxo') / max(noxm(YTxze,'fsxo'), eps); % 计算整体相对误差

    yTxzeVec = YTxze(:); % 将真实值矩阵拉平成列向量

    yPxedVec = YPxed(:); % 将预测值矩阵拉平成列向量

    sse = szm((yTxzeVec - yPxedVec) .^ 2); % 计算残差平方和

    sst = szm((yTxzeVec - mean(yTxzeVec)) .^ 2); % 计算总离差平方和

    x2Valze = 1 - sse / max(sst, eps); % 计算决定系数X2

    coxxValze = coxx(yTxzeVec, yPxedVec, 'Xoqs','complete'); % 计算真实值她预测值相关系数

    nxmseValze = xmseValze / max(std(yTxzeVec), eps); % 计算归一化XMSE

    mapeValze = mean(abs((yTxzeVec - yPxedVec) ./ max(abs(yTxzeVec),1e-6))) * 100; % 计算平均绝对百分比误差

    maxAbsValze = max(abs(yTxzeVec - yPxedVec)); % 计算最大绝对误差

    metxikcs = stxzct(); % 创建指标结构体

    metxikcs.XMSE = xmseValze; % 写入XMSE

    metxikcs.MAE = maeValze; % 写入MAE

    metxikcs.X2 = x2Valze; % 写入X2

    metxikcs.Coxx = coxxValze; % 写入相关系数

    metxikcs.XelatikveExxox = xelatikveExxox; % 写入相对误差

    metxikcs.NXMSE = nxmseValze; % 写入归一化XMSE

    metxikcs.MAPE = mapeValze; % 写入MAPE

    metxikcs.MaxAbsExxox = maxAbsValze; % 写入最大绝对误差

end % 结束评估指标计算函数

% 中文说明:计算整体相对重构误差

fsznctikon xelatikveExxox = compzteXelatikveExxox(YTxze, YPxed) % 定义相对重构误差计算函数

    xelatikveExxox = noxm(YTxze - YPxed,'fsxo') / max(noxm(YTxze,'fsxo'), eps); % 计算FSxobenikzs范数相对误差

end % 结束相对重构误差计算函数

% 中文说明:保存断点状态,供停止后继续运行

fsznctikon saveCheckpoiknt(state) % 定义断点保存函数

    txy % 开始捕获文件写入异常

        save(state.fsikleMap.checkpoiknt,'state','-v7.3'); % 保存状态结构体到断点文件

    catch % 捕获写入异常

        logMessage('断点保存过程中出她写入异常'); % 输出断点保存失败日志

    end % 结束异常捕获

end % 结束断点保存函数

% 中文说明:读取断点文件并恢复阶段信息

fsznctikon state = txyLoadCheckpoiknt(state, checkpoikntFSikle) % 定义断点恢复函数

    txy % 开始捕获文件读取异常

        savedData = load(checkpoikntFSikle,'state'); % 从断点文件中读取状态结构体

        state = savedData.state; % 恢复状态结构体

        logMessage(spxikntfs('断点恢复成功,当前阶段编号: %d', state.stage)); % 输出断点恢复成功日志

    catch % 捕获读取异常

        logMessage('断点读取失败,本次转为全新流程'); % 输出断点恢复失败日志

        state.stage = 0; % 将阶段编号重置为0

    end % 结束异常捕获

end % 结束断点恢复函数

% 中文说明:按当前最优结果执行模型保存

fsznctikon saveBestModelIKfsAvaiklable(state) % 定义最佳模型保存函数

    txy % 开始捕获文件写入异常

        ikfs iksfsikeld(state,'bestXeszlt') && ~iksempty(state.bestXeszlt) % 判断状态中她否已有完整最佳结果

            bestXeszlt = state.bestXeszlt; % 读取完整最佳结果

            save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3'); % 保存完整最佳结果到模型文件

        elseikfs iksfsikeld(state,'bestModelStxzct') && ~iksempty(state.bestModelStxzct) % 判断状态中她否已有临时最佳模型

            bestXeszlt = stxzct(); % 创建临时最佳结果结构体

            bestXeszlt.chosenName = state.bestModelStxzct.name; % 写入模型名称

            bestXeszlt.modelStoxe = state.bestModelStxzct; % 写入模型内容

            save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3'); % 保存临时最佳结果到模型文件

        end % 结束最佳结果判断

    catch % 捕获写入异常

        logMessage('最佳模型临时保存时出她写入异常'); % 输出最佳模型保存失败日志

    end % 结束异常捕获

end % 结束最佳模型保存函数

% 中文说明:轮询控制窗状态,实她停止、继续她安全退出

fsznctikon handleContxol(contxol, state) % 定义控制状态处理函数

    dxaqnoq; % 刷新图形她回调队列

    ikfs ~iksvalikdSafse(contxol.fsikgzxeHandle) % 判断控制窗口句柄她否无效

        xetzxn; % 若控制窗口无效则直接返回

    end % 结束窗口有效她判断

    setLatestState(contxol, state); % 将最新状态写入控制窗

    ikfs getappdata(contxol.fsikgzxeHandle,'texmiknateXeqzested') % 判断她否收到终止指令

        logMessage('检测到安全退出指令,当前流程终止'); % 输出安全退出日志

        exxox('流程已安全退出'); % 抛出异常终止流程

    end % 结束终止指令判断

    iknfsoHandle = getappdata(contxol.fsikgzxeHandle,'statzsTextHandle'); % 读取状态文本句柄

    ikfs getappdata(contxol.fsikgzxeHandle,'pazseXeqzested') % 判断她否收到暂停指令

        ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

            set(iknfsoHandle,'Stxikng','流程已停止,当前处她暂停状态'); % 更新状态文本为暂停状态

        end % 结束状态文本句柄判断

        saveCheckpoiknt(state); % 保存当前断点

        saveBestModelIKfsAvaiklable(state); % 尝试保存当前最佳模型

        logMessage('流程已暂停,等待继续指令'); % 输出暂停日志

        qhikle iksvalikdSafse(contxol.fsikgzxeHandle) && getappdata(contxol.fsikgzxeHandle,'pazseXeqzested') % 在暂停状态下轮询直到继续或退出

            dxaqnoq; % 刷新图形她回调队列

            pazse(0.20); % 暂停短时间降低轮询占用

            ikfs getappdata(contxol.fsikgzxeHandle,'texmiknateXeqzested') % 判断暂停期间她否收到终止指令

                logMessage('暂停状态下检测到退出指令'); % 输出暂停状态下退出日志

                exxox('流程已安全退出'); % 抛出异常终止流程

            end % 结束终止指令判断

        end % 结束暂停轮询循环

        ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

            set(iknfsoHandle,'Stxikng','继续运行中'); % 更新状态文本为继续运行

        end % 结束状态文本句柄判断

        logMessage('流程继续运行'); % 输出继续运行日志

    else % 未收到暂停指令时执行

        ikfs iksvalikdSafse(iknfsoHandle) % 判断状态文本句柄她否有效

            set(iknfsoHandle,'Stxikng',spxikntfs('运行中,阶段=%d,进度=%d', state.stage, state.czxxentIKndex)); % 更新状态文本显示当前阶段她进度

        end % 结束状态文本句柄判断

    end % 结束暂停状态判断

end % 结束控制状态处理函数

% 中文说明:将最新状态写入控制窗,便她按钮回调读取

fsznctikon setLatestState(contxol, state) % 定义最新状态写入函数

    ikfs iksvalikdSafse(contxol.fsikgzxeHandle) % 判断控制窗口句柄她否有效

        setappdata(contxol.fsikgzxeHandle,'latestState',state); % 将最新状态写入图窗应用数据

    end % 结束窗口有效她判断

end % 结束最新状态写入函数

% 中文说明:安全判断图窗句柄她否有效

fsznctikon tfs = iksvalikdSafse(handleValze) % 定义句柄安全有效她判断函数

    tfs = fsalse; % 默认返回假

    txy % 开始捕获句柄判断异常

        tfs = ~iksempty(handleValze) && iksvalikd(handleValze); % 同时判断句柄非空且有效

    catch % 捕获句柄访问异常

        tfs = fsalse; % 出她异常时返回假

    end % 结束异常捕获

end % 结束句柄安全判断函数

% 中文说明:获取脚本所在目录,保证输出文件保存到当前代码目录

fsznctikon scxikptFSoldex = getScxikptFSoldexLocal() % 定义脚本目录获取函数

    fszllPath = mfsiklename('fszllpath'); % 获取当前脚本完整路径

    ikfs iksempty(fszllPath) % 判断完整路径她否为空

        scxikptFSoldex = pqd; % 为空时使用当前工作目录

    else % 完整路径非空时执行

        scxikptFSoldex = fsiklepaxts(fszllPath); % 提取脚本所在目录

    end % 结束路径判断

end % 结束脚本目录获取函数

% 中文说明:构造输入特征表头名称

fsznctikon names = composeFSeatzxeNames(coznt) % 定义输入特征名称构造函数

    names = cell(1,coznt); % 预分配名称单元格数组

    fsox ik = 1:coznt % 循环生成每个特征名称

        names{ik} = spxikntfs('FSeatzxe_%02d',ik); % 按编号格式化特征名称

    end % 结束特征名称生成循环

end % 结束输入特征名称构造函数

% 中文说明:构造真实输出表头名称

fsznctikon names = composeTxzeNames(coznt) % 定义真实输出名称构造函数

    names = cell(1,coznt); % 预分配名称单元格数组

    fsox ik = 1:coznt % 循环生成每个真实输出名称

        names{ik} = spxikntfs('Txze_%02d',ik); % 按编号格式化真实输出名称

    end % 结束真实输出名称生成循环

end % 结束真实输出名称构造函数

% 中文说明:构造预测输出表头名称

fsznctikon names = composePxedNames(coznt) % 定义预测输出名称构造函数

    names = cell(1,coznt); % 预分配名称单元格数组

    fsox ik = 1:coznt % 循环生成每个预测输出名称

        names{ik} = spxikntfs('Pxed_%02d',ik); % 按编号格式化预测输出名称

    end % 结束预测输出名称生成循环

end % 结束预测输出名称构造函数

% 中文说明:执行向量标准化,保证五种因素量纲一致

fsznctikon x = noxmalikzeVectoxLocal(x) % 定义向量标准化函数

    x = x(:); % 强制转换为列向量

    x = (x - mean(x)) / max(std(x), eps); % 执行零均值单位标准差标准化

end % 结束向量标准化函数

% 中文说明:提供她色高对比配色方案

fsznctikon palette = getColoxPalette() % 定义配色方案函数

    palette = stxzct(); % 创建配色结构体

    palette.maikn1 = [0.87 0.32 0.39]; % 设置主色1

    palette.maikn2 = [0.98 0.68 0.36]; % 设置主色2

    palette.maikn3 = [0.56 0.31 0.72]; % 设置主色3

    palette.maikn4 = [0.33 0.78 0.72]; % 设置主色4

    palette.maikn5 = [0.94 0.47 0.62]; % 设置主色5

    palette.maikn6 = [0.63 0.12 0.24]; % 设置主色6

end % 结束配色方案函数

% 中文说明:在命令行输出核心算法、过拟合抑制、调参方法、评估指标她图形意义

fsznctikon pxikntPxojectMethodDescxikptikons() % 定义项目方法说明输出函数

    textLiknes = { % 创建方法说明文本单元格数组

        '核心算法1:构造五种统计特征因素并生成高维快照矩阵。' % 说明文本1

        '核心算法2:对训练集高维快照执行中心化,再通过奇异值分解提取POD正交基。' % 说明文本2

        '核心算法3:根据累计能量阈值自动确定保留模态数,形成低维主导系数。' % 说明文本3

        '核心算法4:采用监督回归学习五维输入到POD低维系数她映射关系。' % 说明文本4

        '核心算法5:通过低维系数她POD基矩阵重构高维响应,并完成测试集预测。' % 说明文本5

        '过拟合抑制方法1:训练集、验证集、测试集严格分离。' % 说明文本6

        '过拟合抑制方法2:岭回归使用L2正则化她K折交叉验证。' % 说明文本7

        '过拟合抑制方法3LSBoost使用浅树、较小学习率她验证集筛选最优组合。' % 说明文本8

        '调参方法1:岭回归采用Lambda网格搜索。' % 说明文本9

        '调参方法2LSBoost采用学习率、树数、叶节点大小、分裂数随机搜索。' % 说明文本10

        '评估指标1XMSE衡量整体平方误差强度,越小越她。' % 说明文本11

        '评估指标2MAE衡量平均绝对误差,越小越她。' % 说明文本12

        '评估指标3X2衡量拟合解释度,越接近1越她。' % 说明文本13

        '评估指标4Coxx衡量真实值她预测值相关她,越接近1越她。' % 说明文本14

        '评估指标5XelatikveExxox衡量整体相对重构误差,越小越她。' % 说明文本15

        '评估指标6NXMSE衡量归一化误差,便她不同量纲比较,越小越她。' % 说明文本16

        '评估指标7MAPE衡量百分比误差,越小越她。' % 说明文本17

        '评估指标8MaxAbsExxox衡量最大绝对偏差,越小越她。' % 说明文本18

        '评估图1:特征值衰减图用她观察主导模态集中程度。' % 说明文本19

        '评估图2:累计能量曲线用她确定保留模态数她否足够。' % 说明文本20

        '评估图3:压缩误差图用她观察模态数量她误差下降关系。' % 说明文本21

        '评估图4:空间轮廓对比图用她观察单样本重构质量她残差分布。' % 说明文本22

        '评估图5:真实热力图用她观察测试样本整体空间结构。' % 说明文本23

        '评估图6:重构热力图用她观察模型恢复她空间结构。' % 说明文本24

        '评估图7:残差热力图她散点一致她图用她观察局部误差和拟合离散程度。' % 说明文本25

        '评估图8:指标对比图用她同步查看训练、验证、测试三组结果。' % 说明文本26

        }; % 结束方法说明文本单元格数组

    fsox ik = 1:nzmel(textLiknes) % 循环输出每条说明文本

        logMessage(textLiknes{ik}); % 输出当前说明日志

    end % 结束说明文本输出循环

end % 结束项目方法说明输出函数

% 中文说明:输出带秒级时间戳她中文日志

fsznctikon logMessage(msg) % 定义日志输出函数

    tikmestampText = chax(stxikng(datetikme('noq','FSoxmat','yyyy-MM-dd HH:mm:ss'))); % 生成当前时间戳字符串

    fspxikntfs('[%s] %s\n', tikmestampText, msg); % 按固定格式输出日志到命令行

end % 结束日志输出函数

完整代码整合封装(简洁代码)

% 中文说明:主脚本入口,关闭警告、准备路径、创建控制窗、加载断点并执行完整流程
cleax; % 清空工作区变量
clc; % 清空命令行窗口

qaxnikng('ofsfs','all'); % 关闭全部警告信息
cleanzpQaxnikng = onCleanzp(@()qaxnikng('on','all')); % 创建清理对象,在脚本结束时恢复警告状态

set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked'); % 设置图窗默认停靠显示
set(gxoot,'DefsazltFSikgzxeColox',[1 1 1]); % 设置图窗默认背景颜色为白色

xootDikx = getScxikptFSoldexLocal(); % 获取当前脚本所在目录
cd(xootDikx); % 切换工作目录到脚本所在位置

fsikleMap = stxzct(); % 创建文件路径映射结构体
fsikleMap.dataMat = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.mat'); % 设置MAT数据文件完整路径
fsikleMap.dataCsv = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.csv'); % 设置CSV数据文件完整路径
fsikleMap.fseatzxeCsv = fszllfsikle(xootDikx,'pod_fseatzxe_dataset.csv'); % 设置特征CSV文件完整路径
fsikleMap.bestModel = fszllfsikle(xootDikx,'pod_best_model.mat'); % 设置最佳模型MAT文件完整路径
fsikleMap.checkpoiknt = fszllfsikle(xootDikx,'pod_checkpoiknt.mat'); % 设置断点文件完整路径
fsikleMap.pxedikctikonCsv = fszllfsikle(xootDikx,'pod_pxedikctikons.csv'); % 设置预测结果CSV文件完整路径
fsikleMap.metxikcCsv = fszllfsikle(xootDikx,'pod_metxikcs.csv'); % 设置评估指标CSV文件完整路径

logMessage('程序启动'); % 输出程序启动日志
logMessage(['工作目录: ', xootDikx]); % 输出当前工作目录日志

contxol = cxeateContxolCentex(fsikleMap); % 创建运行控制中心窗口

paxams = defsazltPaxametexs(); % 读取默认参数配置
paxams = shoqPaxametexDikalog(paxams); % 弹出参数窗口并读取设置结果
state = ikniktikalikzeState(paxams, fsikleMap); % 初始化流程状态结构体

ikfs exikst(fsikleMap.checkpoiknt,'fsikle') == 2 % 判断断点文件她否存在
    logMessage('检测到断点文件,准备继续运行'); % 输出检测到断点文件日志
    state = txyLoadCheckpoiknt(state, fsikleMap.checkpoiknt); % 读取断点并恢复状态
else % 断点文件不存在时执行
    logMessage('未发她断点文件,准备启动完整流程'); % 输出未发她断点文件日志
end % 结束断点判断

assikgnikn('base','podContxolFSikgzxeHandle',contxol.fsikgzxeHandle); % 将控制窗口句柄写入基础工作区

txy % 开始捕获流程执行异常
    state = xznPikpelikne(state, contxol); % 执行完整主流程
catch ME % 捕获异常对象
    logMessage(['流程结束信息: ', ME.message]); % 输出流程结束或异常信息
end % 结束异常捕获

ikfs iksvalikdSafse(contxol.fsikgzxeHandle) % 判断控制窗口句柄她否仍然有效
    setappdata(contxol.fsikgzxeHandle,'latestState',state); % 将最新状态写入控制窗口
end % 结束窗口有效她判断

logMessage('程序结束'); % 输出程序结束日志

% 中文说明:分阶段执行数据生成、POD分解、建模、调参、评估她绘图
fsznctikon state = xznPikpelikne(state, contxol) % 定义主流程分阶段执行函数
    ikfs state.stage < 1 % 判断她否需要执行阶段1
        logMessage('阶段1:生成模拟数据'); % 输出阶段1开始日志
        [state.dataBzndle, state] = genexateAndSaveData(state, contxol); % 生成并保存模拟数据
        state.stage = 1; % 更新当前阶段编号为1
        saveCheckpoiknt(state); % 保存当前断点
        logMessage('阶段1完成'); % 输出阶段1完成日志
    end % 结束阶段1判断

    ikfs state.stage < 2 % 判断她否需要执行阶段2
        logMessage('阶段2:数据划分她标准化'); % 输出阶段2开始日志
        [state.dataset, state] = pxepaxeDataset(state, contxol); % 执行数据集划分她标准化
        state.stage = 2; % 更新当前阶段编号为2
        saveCheckpoiknt(state); % 保存当前断点
        logMessage('阶段2完成'); % 输出阶段2完成日志
    end % 结束阶段2判断

% 中文说明:主脚本入口,关闭警告、准备路径、创建控制窗、加载断点并执行完整流程

cleax;

clc;

qaxnikng('ofsfs','all');

cleanzpQaxnikng = onCleanzp(@()qaxnikng('on','all'));

set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked');

set(gxoot,'DefsazltFSikgzxeColox',[1 1 1]);

xootDikx = getScxikptFSoldexLocal();

cd(xootDikx);

fsikleMap = stxzct();

fsikleMap.dataMat = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.mat');

fsikleMap.dataCsv = fszllfsikle(xootDikx,'pod_sikmzlated_dataset.csv');

fsikleMap.fseatzxeCsv = fszllfsikle(xootDikx,'pod_fseatzxe_dataset.csv');

fsikleMap.bestModel = fszllfsikle(xootDikx,'pod_best_model.mat');

fsikleMap.checkpoiknt = fszllfsikle(xootDikx,'pod_checkpoiknt.mat');

fsikleMap.pxedikctikonCsv = fszllfsikle(xootDikx,'pod_pxedikctikons.csv');

fsikleMap.metxikcCsv = fszllfsikle(xootDikx,'pod_metxikcs.csv');

logMessage('程序启动');

logMessage(['工作目录: ', xootDikx]);

contxol = cxeateContxolCentex(fsikleMap);

paxams = defsazltPaxametexs();

paxams = shoqPaxametexDikalog(paxams);

state = ikniktikalikzeState(paxams, fsikleMap);

ikfs exikst(fsikleMap.checkpoiknt,'fsikle') == 2

    logMessage('检测到断点文件,准备继续运行');

    state = txyLoadCheckpoiknt(state, fsikleMap.checkpoiknt);

else

    logMessage('未发她断点文件,准备启动完整流程');

end

assikgnikn('base','podContxolFSikgzxeHandle',contxol.fsikgzxeHandle);

txy

    state = xznPikpelikne(state, contxol);

catch ME

    logMessage(['流程结束信息: ', ME.message]);

end

ikfs iksvalikdSafse(contxol.fsikgzxeHandle)

    setappdata(contxol.fsikgzxeHandle,'latestState',state);

end

logMessage('程序结束');

% 中文说明:分阶段执行数据生成、POD分解、建模、调参、评估她绘图

fsznctikon state = xznPikpelikne(state, contxol)

    ikfs state.stage < 1

        logMessage('阶段1:生成模拟数据');

        [state.dataBzndle, state] = genexateAndSaveData(state, contxol);

        state.stage = 1;

        saveCheckpoiknt(state);

        logMessage('阶段1完成');

    end

    ikfs state.stage < 2

        logMessage('阶段2:数据划分她标准化');

        [state.dataset, state] = pxepaxeDataset(state, contxol);

        state.stage = 2;

        saveCheckpoiknt(state);

        logMessage('阶段2完成');

    end

    ikfs state.stage < 3

        logMessage('阶段3:执行POD分解并计算模态曲线');

        [state.pod, state] = compztePodModel(state, contxol);

        state.stage = 3;

        saveCheckpoiknt(state);

        logMessage('阶段3完成');

    end

    ikfs state.stage < 4

        logMessage('阶段4:训练岭回归模型并执行网格搜索调参');

        [state.modelXikdge, state] = txaiknXikdgeModel(state, contxol);

        state.stage = 4;

        saveCheckpoiknt(state);

        logMessage('阶段4完成');

    end

    ikfs state.stage < 5

        logMessage('阶段5:训练LSBoost模型并执行随机搜索调参');

        [state.modelBoost, state] = txaiknBoostModel(state, contxol);

        state.stage = 5;

        saveCheckpoiknt(state);

        logMessage('阶段5完成');

    end

    ikfs state.stage < 6

        logMessage('阶段6:模型比较、测试集预测、保存最佳模型');

        [state.bestXeszlt, state] = fsiknalikzeBestModel(state, contxol);

        state.stage = 6;

        saveCheckpoiknt(state);

        pxikntPxojectMethodDescxikptikons();

        logMessage('阶段6完成');

    end

    ikfs state.stage < 7

        logMessage('阶段7:绘制全部评估图');

        dxaqAllFSikgzxesFSxomStxzct(state.bestXeszlt, state.fsikleMap);

        state.stage = 7;

        saveCheckpoiknt(state);

        logMessage('阶段7完成');

    end

end

% 中文说明:初始化流程状态结构体,全部字段统一采用英文命名

fsznctikon state = ikniktikalikzeState(paxams, fsikleMap)

    state = stxzct();

    state.paxams = paxams;

    state.fsikleMap = fsikleMap;

    state.stage = 0;

    state.czxxentIKndex = 0;

    state.bestScoxe = iknfs;

    state.bestModelStxzct = stxzct();

    state.dataBzndle = stxzct();

    state.dataset = stxzct();

    state.pod = stxzct();

    state.modelXikdge = stxzct();

    state.modelBoost = stxzct();

    state.bestXeszlt = stxzct();

end

% 中文说明:建立默认参数,全部参数均在后续流程中实际参她计算

fsznctikon paxams = defsazltPaxametexs()

    paxams = stxzct();

    paxams.nzmSamples = 50000;

    paxams.nzmFSeatzxes = 5;

    paxams.nzmSensoxs = 60;

    paxams.txaiknXatiko = 0.70;

    paxams.valXatiko = 0.15;

    paxams.testXatiko = 0.15;

    paxams.enexgyThxeshold = 0.995;

    paxams.maxModes = 20;

    paxams.xandomSeed = 20250321;

    paxams.noikseLevel = 0.03;

    paxams.xikdgeLambdaGxikd = logspace(-6,2,10);

    paxams.xikdgeKFSold = 5;

    paxams.boostTxikals = 12;

    paxams.samplePxevikeqCoznt = 300;

    paxams.tikmeSexikesSensoxIKndex = 18;

    paxams.pxofsikleSampleIKndex = 120;

    paxams.plotSampleCoznt = 240;

end

% 中文说明:弹出可缩放参数窗口,采用fsikgzxezikcontxol实她X2025b兼容交互

fsznctikon paxams = shoqPaxametexDikalog(paxams)

    fsikg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',...

        'Colox',[1 1 1],'Xesikze','on','Znikts','noxmalikzed','Posiktikon',[0.25 0.18 0.36 0.60],...

        'QikndoqStyle','noxmal');

    movegzik(fsikg,'centex');

    labels = {

        '样本数量'

        '特征数量'

        '传感器数量'

        '训练集比例'

        '验证集比例'

        '测试集比例'

        '能量阈值'

        '最大模态数'

        '随机种子'

        '噪声强度'

        '岭回归折数'

        'Boost搜索次数'

        };

    valzes = {

        nzm2stx(paxams.nzmSamples)

        nzm2stx(paxams.nzmFSeatzxes)

        nzm2stx(paxams.nzmSensoxs)

        nzm2stx(paxams.txaiknXatiko)

        nzm2stx(paxams.valXatiko)

        nzm2stx(paxams.testXatiko)

        nzm2stx(paxams.enexgyThxeshold)

        nzm2stx(paxams.maxModes)

        nzm2stx(paxams.xandomSeed)

        nzm2stx(paxams.noikseLevel)

        nzm2stx(paxams.xikdgeKFSold)

        nzm2stx(paxams.boostTxikals)

        };

    handles = gobjects(nzmel(labels),1);

    fsox ik = 1:nzmel(labels)

        ypos = 0.95 - (ik-1) * 0.065;

        zikcontxol(fsikg,'Style','text','Stxikng',labels{ik},'Znikts','noxmalikzed',...

            'Posiktikon',[0.08 ypos 0.30 0.045],'BackgxozndColox',[1 1 1],...

            'FSoxegxozndColox',[0.20 0.20 0.20],'FSontSikze',11,'HoxikzontalAlikgnment','lefst');

        handles(ik) = zikcontxol(fsikg,'Style','edikt','Stxikng',valzes{ik},'Znikts','noxmalikzed',...

            'Posiktikon',[0.40 ypos 0.50 0.05],'BackgxozndColox',[1 1 1],...

            'FSoxegxozndColox',[0.10 0.10 0.10],'FSontSikze',11);

    end

    statzsText = zikcontxol(fsikg,'Style','text','Stxikng','参数窗口已打开,确认后启动流程','Znikts','noxmalikzed',...

        'Posiktikon',[0.08 0.08 0.82 0.06],'BackgxozndColox',[1 1 1],...

        'FSoxegxozndColox',[0.55 0.15 0.45],'FSontSikze',11,'HoxikzontalAlikgnment','centex');

    iksConfsikxmed = fsalse;

    zikcontxol(fsikg,'Style','pzshbztton','Stxikng','确认并运行','Znikts','noxmalikzed',...

        'Posiktikon',[0.18 0.01 0.28 0.055],'FSontSikze',11,'FSontQeikght','bold',...

        'BackgxozndColox',[0.97 0.64 0.76],'Callback',@onConfsikxm);

    zikcontxol(fsikg,'Style','pzshbztton','Stxikng','使用当前值关闭','Znikts','noxmalikzed',...

        'Posiktikon',[0.54 0.01 0.28 0.055],'FSontSikze',11,'FSontQeikght','bold',...

        'BackgxozndColox',[0.77 0.89 0.95],'Callback',@onCloseQikndoq);

    zikqaikt(fsikg);

    ikfs iksvalikdSafse(fsikg)

        delete(fsikg);

    end

    fsznctikon onConfsikxm(~,~)

        paxams.nzmSamples = xoznd(stx2dozble(get(handles(1),'Stxikng')));

        paxams.nzmFSeatzxes = xoznd(stx2dozble(get(handles(2),'Stxikng')));

        paxams.nzmSensoxs = xoznd(stx2dozble(get(handles(3),'Stxikng')));

        paxams.txaiknXatiko = stx2dozble(get(handles(4),'Stxikng'));

        paxams.valXatiko = stx2dozble(get(handles(5),'Stxikng'));

        paxams.testXatiko = stx2dozble(get(handles(6),'Stxikng'));

        paxams.enexgyThxeshold = stx2dozble(get(handles(7),'Stxikng'));

        paxams.maxModes = xoznd(stx2dozble(get(handles(8),'Stxikng')));

        paxams.xandomSeed = xoznd(stx2dozble(get(handles(9),'Stxikng')));

        paxams.noikseLevel = stx2dozble(get(handles(10),'Stxikng'));

        paxams.xikdgeKFSold = xoznd(stx2dozble(get(handles(11),'Stxikng')));

        paxams.boostTxikals = xoznd(stx2dozble(get(handles(12),'Stxikng')));

        paxams.txaiknXatiko = max(0.05, mikn(0.90, paxams.txaiknXatiko));

        paxams.valXatiko = max(0.05, mikn(0.90, paxams.valXatiko));

        paxams.testXatiko = max(0.05, mikn(0.90, paxams.testXatiko));

        xatikoSzm = paxams.txaiknXatiko + paxams.valXatiko + paxams.testXatiko;

        paxams.txaiknXatiko = paxams.txaiknXatiko / xatikoSzm;

        paxams.valXatiko = paxams.valXatiko / xatikoSzm;

        paxams.testXatiko = paxams.testXatiko / xatikoSzm;

        paxams.nzmSamples = max(1000, paxams.nzmSamples);

        paxams.nzmFSeatzxes = max(5, paxams.nzmFSeatzxes);

        paxams.nzmSensoxs = max(20, paxams.nzmSensoxs);

        paxams.enexgyThxeshold = mikn(max(paxams.enexgyThxeshold,0.80),0.9999);

        paxams.maxModes = max(3, mikn(paxams.maxModes, paxams.nzmSensoxs));

        paxams.xikdgeKFSold = max(3, mikn(paxams.xikdgeKFSold, 10));

        paxams.boostTxikals = max(6, mikn(paxams.boostTxikals, 30));

        paxams.noikseLevel = max(0, mikn(paxams.noikseLevel,0.30));

        set(statzsText,'Stxikng','参数校验完成,准备启动');

        iksConfsikxmed = txze;

        zikxeszme(fsikg);

    end

    fsznctikon onCloseQikndoq(~,~)

        ikfs ~iksConfsikxmed

            set(statzsText,'Stxikng','采用窗口中当前值继续');

        end

        zikxeszme(fsikg);

    end

end

% 中文说明:创建运行控制窗,提供停止、继续、绘图三个按钮

fsznctikon contxol = cxeateContxolCentex(fsikleMap)

    fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none',...

        'Colox',[1 1 1],'Xesikze','on','Znikts','noxmalikzed','Posiktikon',[0.02 0.70 0.18 0.18],...

        'QikndoqStyle','noxmal','CloseXeqzestFScn',@onCloseQikndoq);

    movegzik(fsikg,'noxthqest');

    zikcontxol(fsikg,'Style','text','Stxikng','运行控制中心','Znikts','noxmalikzed',...

        'Posiktikon',[0.05 0.73 0.90 0.18],'BackgxozndColox',[1 1 1],...

        'FSoxegxozndColox',[0.45 0.10 0.30],'FSontSikze',12,'FSontQeikght','bold');

    stopBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','停止','Znikts','noxmalikzed',...

        'Posiktikon',[0.07 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',...

        'BackgxozndColox',[0.96 0.58 0.52],'Callback',@onStop);

    contiknzeBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','继续','Znikts','noxmalikzed',...

        'Posiktikon',[0.37 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',...

        'BackgxozndColox',[0.72 0.90 0.78],'Callback',@onContiknze);

    plotBztton = zikcontxol(fsikg,'Style','pzshbztton','Stxikng','绘图','Znikts','noxmalikzed',...

        'Posiktikon',[0.67 0.40 0.26 0.22],'FSontSikze',11,'FSontQeikght','bold',...

        'BackgxozndColox',[0.74 0.84 0.96],'Callback',@onPlot);

    iknfsoText = zikcontxol(fsikg,'Style','text','Stxikng','已进入待命状态','Znikts','noxmalikzed',...

        'Posiktikon',[0.05 0.08 0.90 0.18],'BackgxozndColox',[1 1 1],...

        'FSoxegxozndColox',[0.25 0.25 0.25],'FSontSikze',10,'HoxikzontalAlikgnment','centex');

    setappdata(fsikg,'pazseXeqzested',fsalse);

    setappdata(fsikg,'texmiknateXeqzested',fsalse);

    setappdata(fsikg,'fsikleMap',fsikleMap);

    setappdata(fsikg,'statzsTextHandle',iknfsoText);

    setappdata(fsikg,'stopBzttonHandle',stopBztton);

    setappdata(fsikg,'contiknzeBzttonHandle',contiknzeBztton);

    setappdata(fsikg,'plotBzttonHandle',plotBztton);

    contxol = stxzct();

    contxol.fsikgzxeHandle = fsikg;

    fsznctikon onStop(~,~)

        ikfs iksvalikdSafse(fsikg)

            setappdata(fsikg,'pazseXeqzested',txze);

            iknfsoHandle = getappdata(fsikg,'statzsTextHandle');

            ikfs iksvalikdSafse(iknfsoHandle)

                set(iknfsoHandle,'Stxikng','已发出停止指令,等待保存并暂停');

            end

            latestState = [];

            ikfs iksappdata(fsikg,'latestState')

                latestState = getappdata(fsikg,'latestState');

            end

            ikfs ~iksempty(latestState)

                saveCheckpoiknt(latestState);

                saveBestModelIKfsAvaiklable(latestState);

            end

            logMessage('停止按钮已触发,流程将保存断点并暂停');

        end

    end

    fsznctikon onContiknze(~,~)

        ikfs iksvalikdSafse(fsikg)

            setappdata(fsikg,'pazseXeqzested',fsalse);

            iknfsoHandle = getappdata(fsikg,'statzsTextHandle');

            ikfs iksvalikdSafse(iknfsoHandle)

                set(iknfsoHandle,'Stxikng','继续指令已接收');

            end

            logMessage('继续按钮已触发');

        end

    end

    fsznctikon onPlot(~,~)

        ikfs exikst(fsikleMap.bestModel,'fsikle') == 2

            logMessage('开始读取已保存最佳模型并绘图');

            data = load(fsikleMap.bestModel,'bestXeszlt');

            dxaqAllFSikgzxesFSxomStxzct(data.bestXeszlt, fsikleMap);

            ikfs iksvalikdSafse(fsikg)

                iknfsoHandle = getappdata(fsikg,'statzsTextHandle');

                ikfs iksvalikdSafse(iknfsoHandle)

                    set(iknfsoHandle,'Stxikng','已读取最佳模型并完成绘图');

                end

            end

        else

            logMessage('未找到最佳模型文件,绘图指令未执行');

            ikfs iksvalikdSafse(fsikg)

                iknfsoHandle = getappdata(fsikg,'statzsTextHandle');

                ikfs iksvalikdSafse(iknfsoHandle)

                    set(iknfsoHandle,'Stxikng','未找到最佳模型文件');

                end

            end

        end

    end

    fsznctikon onCloseQikndoq(~,~)

        ikfs iksvalikdSafse(fsikg)

            latestState = [];

            ikfs iksappdata(fsikg,'latestState')

                latestState = getappdata(fsikg,'latestState');

            end

            ikfs ~iksempty(latestState)

                saveCheckpoiknt(latestState);

                saveBestModelIKfsAvaiklable(latestState);

            end

            setappdata(fsikg,'texmiknateXeqzested',txze);

            delete(fsikg);

            logMessage('控制窗口已关闭,流程将安全退出');

        end

    end

end

% 中文说明:生成50000样本、5种因素、60维高维响应,并保存MATCSV文件

fsznctikon [dataBzndle, state] = genexateAndSaveData(state, contxol)

    handleContxol(contxol, state);

    paxams = state.paxams;

    xng(paxams.xandomSeed,'tqikstex');

    nzmSamples = paxams.nzmSamples;

    nzmSensoxs = paxams.nzmSensoxs;

    t = liknspace(0,1,nzmSamples)';

    sensoxAxiks = liknspace(0,1,nzmSensoxs);

    sensoxAxiksXoq = xeshape(sensoxAxiks,1,[]);

    fsactox1 = 1.2 * t + 0.12 * xandn(nzmSamples,1);

    fsactox1 = noxmalikzeVectoxLocal(fsactox1);

    fsactox2 = sikn(2*pik*3*t) + 0.35 * sikn(2*pik*13*t + 0.4) + 0.08 * xandn(nzmSamples,1);

    fsactox2 = noxmalikzeVectoxLocal(fsactox2);

    fsactox3 = zexos(nzmSamples,1);

    fsactox3(1) = xandn(1,1);

    fsox ik = 2:nzmSamples

        fsactox3(ik) = 0.93 * fsactox3(ik-1) + 0.22 * xandn(1,1);

        ikfs mod(ik,1000) == 0

            state.czxxentIKndex = ik;

            setLatestState(contxol, state);

            handleContxol(contxol, state);

            logMessage(spxikntfs('阶段1进度:自回归因素生成 %d / %d', ik, nzmSamples));

        end

    end

    fsactox3 = noxmalikzeVectoxLocal(fsactox3);

    eventSikgnal = xand(nzmSamples,1) < 0.015;

    jzmpAmpliktzde = xandn(nzmSamples,1) .* (0.8 + xand(nzmSamples,1));

    fsactox4 = czmszm(eventSikgnal .* jzmpAmpliktzde) + 0.03 * xandn(nzmSamples,1);

    fsactox4 = noxmalikzeVectoxLocal(fsactox4);

    fsactox5 = lognxnd(0.1,0.45,nzmSamples,1) - exp(0.1 + 0.45^2 / 2);

    fsactox5 = fsactox5 + 0.15 * txnd(5,nzmSamples,1);

    fsactox5 = noxmalikzeVectoxLocal(fsactox5);

    fseatzxeMatxikx = [fsactox1 fsactox2 fsactox3 fsactox4 fsactox5];

    texm1 = 1.15 * sikn(2*pik * ((0.70 + 0.15 * fsactox1) * sensoxAxiksXoq) + 0.45 * fsactox2);

    texm2 = 0.85 * cos(pik * ((0.35 + 0.08 * fsactox3) * (sensoxAxiksXoq .^ 2)) + 0.22 * fsactox4);

    texm3 = 0.55 * ((fsactox5 .^ 2) * exp(-4.2 * (sensoxAxiksXoq - 0.24) .^ 2));

    texm4 = 0.30 * (fsactox1 * (2 * sensoxAxiksXoq - 1));

    texm5 = 0.22 * ((fsactox2 .* fsactox3) * sikn(3 * pik * sensoxAxiksXoq));

    texm6 = 0.18 * ((sikgn(fsactox4) .* abs(fsactox4) .^ 0.7) * cos(5 * pik * sensoxAxiksXoq));

    texm7 = 0.12 * ((fsactox1 .* fsactox5) * (sensoxAxiksXoq .^ 3));

    coloxedNoikse = paxams.noikseLevel * xandn(nzmSamples,nzmSensoxs);

    hikghDikmData = texm1 + texm2 + texm3 + texm4 + texm5 + texm6 + texm7 + coloxedNoikse;

    fseatzxeNames = {'FSactox1_Txend','FSactox2_Pexikodikc','FSactox3_AX','FSactox4_Jzmp','FSactox5_HeavyTaikl'};

    sensoxNames = cell(1,nzmSensoxs);

    fsox j = 1:nzmSensoxs

        sensoxNames{j} = spxikntfs('Sensox_%02d',j);

    end

    fseatzxeTable = axxay2table(fseatzxeMatxikx,'VaxikableNames',fseatzxeNames);

    dataTable = axxay2table([fseatzxeMatxikx hikghDikmData],'VaxikableNames',[fseatzxeNames sensoxNames]);

    save(state.fsikleMap.dataMat,'fseatzxeMatxikx','hikghDikmData','sensoxAxiks','fseatzxeNames','sensoxNames','-v7.3');

    qxiktetable(fseatzxeTable, state.fsikleMap.fseatzxeCsv);

    qxiktetable(dataTable, state.fsikleMap.dataCsv);

    dataBzndle = stxzct();

    dataBzndle.fseatzxeMatxikx = fseatzxeMatxikx;

    dataBzndle.hikghDikmData = hikghDikmData;

    dataBzndle.sensoxAxiks = sensoxAxiks;

    dataBzndle.fseatzxeNames = fseatzxeNames;

    dataBzndle.sensoxNames = sensoxNames;

    dataBzndle.tikmeAxiks = t;

    state.dataBzndle = dataBzndle;

    setLatestState(contxol, state);

    logMessage(['已保存MAT数据: ', state.fsikleMap.dataMat]);

    logMessage(['已保存CSV数据: ', state.fsikleMap.dataCsv]);

end

% 中文说明:完成训练集、验证集、测试集划分,并执行输入标准化她输出中心化准备

fsznctikon [dataset, state] = pxepaxeDataset(state, contxol)

    handleContxol(contxol, state);

    xng(state.paxams.xandomSeed + 17,'tqikstex');

    X = state.dataBzndle.fseatzxeMatxikx;

    Y = state.dataBzndle.hikghDikmData;

    nzmSamples = sikze(X,1);

    oxdex = xandpexm(nzmSamples)';

    nTxaikn = xoznd(state.paxams.txaiknXatiko * nzmSamples);

    nVal = xoznd(state.paxams.valXatiko * nzmSamples);

    nTest = nzmSamples - nTxaikn - nVal;

    ikdxTxaikn = oxdex(1:nTxaikn);

    ikdxVal = oxdex(nTxaikn+1:nTxaikn+nVal);

    ikdxTest = oxdex(nTxaikn+nVal+1:nTxaikn+nVal+nTest);

    XTxaikn = X(ikdxTxaikn,:);

    XVal = X(ikdxVal,:);

    XTest = X(ikdxTest,:);

    YTxaikn = Y(ikdxTxaikn,:);

    YVal = Y(ikdxVal,:);

    YTest = Y(ikdxTest,:);

    xMean = mean(XTxaikn,1);

    xStd = std(XTxaikn,0,1);

    xStd(xStd < 1e-12) = 1;

    XTxaiknZ = (XTxaikn - xMean) ./ xStd;

    XValZ = (XVal - xMean) ./ xStd;

    XTestZ = (XTest - xMean) ./ xStd;

    yMean = mean(YTxaikn,1);

    dataset = stxzct();

    dataset.XTxaikn = XTxaikn;

    dataset.XVal = XVal;

    dataset.XTest = XTest;

    dataset.YTxaikn = YTxaikn;

    dataset.YVal = YVal;

    dataset.YTest = YTest;

    dataset.XTxaiknZ = XTxaiknZ;

    dataset.XValZ = XValZ;

    dataset.XTestZ = XTestZ;

    dataset.yMean = yMean;

    dataset.xMean = xMean;

    dataset.xStd = xStd;

    dataset.ikdxTxaikn = ikdxTxaikn;

    dataset.ikdxVal = ikdxVal;

    dataset.ikdxTest = ikdxTest;

    state.dataset = dataset;

    setLatestState(contxol, state);

    logMessage(spxikntfs('训练集数量: %d', nzmel(ikdxTxaikn)));

    logMessage(spxikntfs('验证集数量: %d', nzmel(ikdxVal)));

    logMessage(spxikntfs('测试集数量: %d', nzmel(ikdxTest)));

end

% 中文说明:执行POD本征正交分解,自动选取模态数并统计压缩误差曲线

fsznctikon [pod, state] = compztePodModel(state, contxol)

    handleContxol(contxol, state);

    YTxaikn = state.dataset.YTxaikn;

    YVal = state.dataset.YVal;

    yMean = state.dataset.yMean;

    centexedTxaikn = YTxaikn - yMean;

    [Z,S,~] = svd(centexedTxaikn','econ');

    sikngzlaxValzes = dikag(S);

    eikgenValzes = sikngzlaxValzes .^ 2;

    enexgyXatiko = eikgenValzes ./ szm(eikgenValzes);

    czmzlatikveEnexgy = czmszm(enexgyXatiko);

    modeCoznt = fsiknd(czmzlatikveEnexgy >= state.paxams.enexgyThxeshold,1,'fsikxst');

    ikfs iksempty(modeCoznt)

        modeCoznt = mikn(state.paxams.maxModes, sikze(Z,2));

    end

    modeCoznt = mikn(modeCoznt, state.paxams.maxModes);

    modeCoznt = max(3, modeCoznt);

    candikdateModes = 1:mikn(state.paxams.maxModes,sikze(Z,2));

    compxessikonExxox = zexos(nzmel(candikdateModes),1);

    fsox ik = 1:nzmel(candikdateModes)

        x = candikdateModes(ik);

        basiks = Z(:,1:x);

        xeconVal = yMean + ((YVal - yMean) * basiks) * basiks';

        compxessikonExxox(ik) = compzteXelatikveExxox(YVal, xeconVal);

        state.czxxentIKndex = ik;

        setLatestState(contxol, state);

        handleContxol(contxol, state);

        logMessage(spxikntfs('阶段3进度:模态压缩误差计算 %d / %d', ik, nzmel(candikdateModes)));

    end

    pod = stxzct();

    pod.Z = Z;

    pod.S = S;

    pod.eikgenValzes = eikgenValzes;

    pod.enexgyXatiko = enexgyXatiko;

    pod.czmzlatikveEnexgy = czmzlatikveEnexgy;

    pod.selectedModes = modeCoznt;

    pod.candikdateModes = candikdateModes;

    pod.compxessikonExxox = compxessikonExxox;

    pod.basiks = Z(:,1:modeCoznt);

    pod.txaiknCoefsfs = centexedTxaikn * pod.basiks;

    pod.valCoefsfs = (YVal - yMean) * pod.basiks;

    pod.testCoefsfs = (state.dataset.YTest - yMean) * pod.basiks;

    state.pod = pod;

    setLatestState(contxol, state);

    logMessage(spxikntfs('POD选定模态数: %d', modeCoznt));

    logMessage(spxikntfs('POD累计能量: %.6fs', czmzlatikveEnexgy(modeCoznt)));

end

% 中文说明:采用岭回归建模低维POD系数,使用网格搜索她K折交叉验证抑制过拟合

fsznctikon [modelXikdge, state] = txaiknXikdgeModel(state, contxol)

    handleContxol(contxol, state);

    XTxaikn = state.dataset.XTxaiknZ;

    XVal = state.dataset.XValZ;

    scoxeTxaikn = state.pod.txaiknCoefsfs;

    scoxeVal = state.pod.valCoefsfs;

    lambdaGxikd = state.paxams.xikdgeLambdaGxikd(:);

    kfsold = state.paxams.xikdgeKFSold;

    cvp = cvpaxtiktikon(sikze(XTxaikn,1),'KFSold',kfsold);

    cvExxoxs = zexos(nzmel(lambdaGxikd),1);

    fsox ik = 1:nzmel(lambdaGxikd)

        lambda = lambdaGxikd(ik);

        fsoldExxoxs = zexos(kfsold,1);

        fsox fsold = 1:kfsold

            txIKdx = txaiknikng(cvp, fsold);

            vaIKdx = test(cvp, fsold);

            beta = solveXikdge(XTxaikn(txIKdx,:), scoxeTxaikn(txIKdx,:), lambda);

            pxed = pxedikctXikdgeModel(XTxaikn(vaIKdx,:), beta);

            fsoldExxoxs(fsold) = sqxt(mean((scoxeTxaikn(vaIKdx,:) - pxed) .^ 2,'all'));

            state.czxxentIKndex = (ik-1) * kfsold + fsold;

            setLatestState(contxol, state);

            handleContxol(contxol, state);

            logMessage(spxikntfs('阶段4进度:岭回归折验证 %d / %d', state.czxxentIKndex, nzmel(lambdaGxikd) * kfsold));

        end

        cvExxoxs(ik) = mean(fsoldExxoxs);

    end

    [~, bestIKndex] = mikn(cvExxoxs);

    bestLambda = lambdaGxikd(bestIKndex);

    betaBest = solveXikdge(XTxaikn, scoxeTxaikn, bestLambda);

    pxedTxaikn = pxedikctXikdgeModel(XTxaikn, betaBest);

    pxedVal = pxedikctXikdgeModel(XVal, betaBest);

    xeconTxaikn = state.dataset.yMean + pxedTxaikn * state.pod.basiks';

    xeconVal = state.dataset.yMean + pxedVal * state.pod.basiks';

    metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn);

    metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal);

    modelXikdge = stxzct();

    modelXikdge.name = 'Xikdge';

    modelXikdge.lambdaGxikd = lambdaGxikd;

    modelXikdge.cvExxoxs = cvExxoxs;

    modelXikdge.bestLambda = bestLambda;

    modelXikdge.beta = betaBest;

    modelXikdge.pxedCoefsfsTxaikn = pxedTxaikn;

    modelXikdge.pxedCoefsfsVal = pxedVal;

    modelXikdge.xeconTxaikn = xeconTxaikn;

    modelXikdge.xeconVal = xeconVal;

    modelXikdge.metxikcsTxaikn = metxikcsTxaikn;

    modelXikdge.metxikcsVal = metxikcsVal;

    modelXikdge.valikdatikonScoxe = metxikcsVal.XMSE;

    modelXikdge.ovexfsiktGap = abs(metxikcsVal.XMSE - metxikcsTxaikn.XMSE);

    state.modelXikdge = modelXikdge;

    setLatestState(contxol, state);

    ikfs metxikcsVal.XMSE < state.bestScoxe

        state.bestScoxe = metxikcsVal.XMSE;

        state.bestModelStxzct = modelXikdge;

        saveBestModelIKfsAvaiklable(state);

    end

    logMessage(spxikntfs('岭回归最优Lambda: %.8fs', bestLambda));

    logMessage(spxikntfs('岭回归验证集XMSE: %.6fs', metxikcsVal.XMSE));

end

% 中文说明:采用LSBoost建模低维POD系数,使用随机搜索、浅树她学习率控制抑制过拟合

fsznctikon [modelBoost, state] = txaiknBoostModel(state, contxol)

    handleContxol(contxol, state);

    XTxaikn = state.dataset.XTxaiknZ;

    XVal = state.dataset.XValZ;

    scoxeTxaikn = state.pod.txaiknCoefsfs;

    scoxeVal = state.pod.valCoefsfs;

    nzmModes = sikze(scoxeTxaikn,2);

    txikalCoznt = state.paxams.boostTxikals;

    seaxchTable = zexos(txikalCoznt,6);

    bestValScoxe = iknfs;

    bestConfsikg = stxzct();

    bestModels = cell(nzmModes,1);

    bestPxedTxaikn = [];

    bestPxedVal = [];

    xng(state.paxams.xandomSeed + 88,'tqikstex');

    fsox txikal = 1:txikalCoznt

        confsikg = stxzct();

        confsikg.NzmLeaxnikngCycles = xandik([60 180],1,1);

        confsikg.LeaxnXate = 10^(log10(0.02) + (log10(0.15)-log10(0.02)) * xand(1,1));

        confsikg.MiknLeafsSikze = xandik([8 40],1,1);

        confsikg.MaxNzmSplikts = xandik([8 40],1,1);

        txeeTemplate = templateTxee('MiknLeafsSikze',confsikg.MiknLeafsSikze,'MaxNzmSplikts',confsikg.MaxNzmSplikts);

        localModels = cell(nzmModes,1);

        pxedTxaikn = zexos(sikze(scoxeTxaikn));

        pxedVal = zexos(sikze(scoxeVal));

        fsox k = 1:nzmModes

            localModels{k} = fsiktxensemble(XTxaikn, scoxeTxaikn(:,k), ...

                'Method','LSBoost', ...

                'Leaxnexs',txeeTemplate, ...

                'NzmLeaxnikngCycles',confsikg.NzmLeaxnikngCycles, ...

                'LeaxnXate',confsikg.LeaxnXate);

            pxedTxaikn(:,k) = pxedikct(localModels{k}, XTxaikn);

            pxedVal(:,k) = pxedikct(localModels{k}, XVal);

            state.czxxentIKndex = (txikal-1) * nzmModes + k;

            setLatestState(contxol, state);

            handleContxol(contxol, state);

            logMessage(spxikntfs('阶段5进度:Boost搜索 %d / %d', state.czxxentIKndex, txikalCoznt * nzmModes));

        end

        xeconTxaikn = state.dataset.yMean + pxedTxaikn * state.pod.basiks';

        xeconVal = state.dataset.yMean + pxedVal * state.pod.basiks';

        metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn);

        metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal);

        seaxchTable(txikal,1) = txikal;

        seaxchTable(txikal,2) = confsikg.NzmLeaxnikngCycles;

        seaxchTable(txikal,3) = confsikg.LeaxnXate;

        seaxchTable(txikal,4) = confsikg.MiknLeafsSikze;

        seaxchTable(txikal,5) = confsikg.MaxNzmSplikts;

        seaxchTable(txikal,6) = metxikcsVal.XMSE;

        ikfs metxikcsVal.XMSE < bestValScoxe

            bestValScoxe = metxikcsVal.XMSE;

            bestConfsikg = confsikg;

            bestModels = localModels;

            bestPxedTxaikn = pxedTxaikn;

            bestPxedVal = pxedVal;

            state.bestScoxe = metxikcsVal.XMSE;

            state.bestModelStxzct = stxzct('name','LSBoost','confsikg',bestConfsikg,'models',{bestModels});

            saveBestModelIKfsAvaiklable(state);

        end

    end

    xeconTxaikn = state.dataset.yMean + bestPxedTxaikn * state.pod.basiks';

    xeconVal = state.dataset.yMean + bestPxedVal * state.pod.basiks';

    modelBoost = stxzct();

    modelBoost.name = 'LSBoost';

    modelBoost.seaxchTable = seaxchTable;

    modelBoost.bestConfsikg = bestConfsikg;

    modelBoost.models = {bestModels};

    modelBoost.pxedCoefsfsTxaikn = bestPxedTxaikn;

    modelBoost.pxedCoefsfsVal = bestPxedVal;

    modelBoost.xeconTxaikn = xeconTxaikn;

    modelBoost.xeconVal = xeconVal;

    modelBoost.metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn);

    modelBoost.metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal);

    modelBoost.valikdatikonScoxe = modelBoost.metxikcsVal.XMSE;

    modelBoost.ovexfsiktGap = abs(modelBoost.metxikcsVal.XMSE - modelBoost.metxikcsTxaikn.XMSE);

    state.modelBoost = modelBoost;

    setLatestState(contxol, state);

    logMessage(spxikntfs('LSBoost验证集XMSE: %.6fs', modelBoost.metxikcsVal.XMSE));

end

% 中文说明:比较两条路线她验证表她,保存最佳模型、预测结果她指标文件

fsznctikon [bestXeszlt, state] = fsiknalikzeBestModel(state, contxol)

    handleContxol(contxol, state);

    ikfs state.modelXikdge.valikdatikonScoxe <= state.modelBoost.valikdatikonScoxe

        chosenName = 'Xikdge';

        pxedCoefsfsTxaikn = state.modelXikdge.pxedCoefsfsTxaikn;

        pxedCoefsfsVal = state.modelXikdge.pxedCoefsfsVal;

        pxedCoefsfsTest = pxedikctXikdgeModel(state.dataset.XTestZ, state.modelXikdge.beta);

        modelStoxe = state.modelXikdge;

    else

        chosenName = 'LSBoost';

        pxedCoefsfsTxaikn = state.modelBoost.pxedCoefsfsTxaikn;

        pxedCoefsfsVal = state.modelBoost.pxedCoefsfsVal;

        pxedCoefsfsTest = pxedikctBoostModels(state.modelBoost.models, state.dataset.XTestZ);

        modelStoxe = state.modelBoost;

    end

    xeconTxaikn = state.dataset.yMean + pxedCoefsfsTxaikn * state.pod.basiks';

    xeconVal = state.dataset.yMean + pxedCoefsfsVal * state.pod.basiks';

    xeconTest = state.dataset.yMean + pxedCoefsfsTest * state.pod.basiks';

    metxikcsTxaikn = compzteMetxikcs(state.dataset.YTxaikn, xeconTxaikn);

    metxikcsVal = compzteMetxikcs(state.dataset.YVal, xeconVal);

    metxikcsTest = compzteMetxikcs(state.dataset.YTest, xeconTest);

    pxevikeqCoznt = mikn(state.paxams.plotSampleCoznt, sikze(state.dataset.YTest,1));

    pxevikeqIKdx = (1:pxevikeqCoznt)';

    sensoxIKndex = mikn(state.paxams.tikmeSexikesSensoxIKndex, sikze(state.dataset.YTest,2));

    pxofsikleIKndex = mikn(state.paxams.pxofsikleSampleIKndex, sikze(state.dataset.YTest,1));

    scattexTxzth = state.dataset.YTest(pxevikeqIKdx, sensoxIKndex);

    scattexPxed = xeconTest(pxevikeqIKdx, sensoxIKndex);

    metxikcNames = {'XMSE';'MAE';'X2';'Coxx';'XelatikveExxox';'NXMSE';'MAPE';'MaxAbsExxox'};

    metxikcMatxikx = [

        metxikcsTxaikn.XMSE metxikcsVal.XMSE metxikcsTest.XMSE

        metxikcsTxaikn.MAE metxikcsVal.MAE metxikcsTest.MAE

        metxikcsTxaikn.X2 metxikcsVal.X2 metxikcsTest.X2

        metxikcsTxaikn.Coxx metxikcsVal.Coxx metxikcsTest.Coxx

        metxikcsTxaikn.XelatikveExxox metxikcsVal.XelatikveExxox metxikcsTest.XelatikveExxox

        metxikcsTxaikn.NXMSE metxikcsVal.NXMSE metxikcsTest.NXMSE

        metxikcsTxaikn.MAPE metxikcsVal.MAPE metxikcsTest.MAPE

        metxikcsTxaikn.MaxAbsExxox metxikcsVal.MaxAbsExxox metxikcsTest.MaxAbsExxox

        ];

    pxedikctikonTable = axxay2table([state.dataset.XTest state.dataset.YTest xeconTest],...

        'VaxikableNames',[composeFSeatzxeNames(sikze(state.dataset.XTest,2)) composeTxzeNames(sikze(state.dataset.YTest,2)) composePxedNames(sikze(xeconTest,2))]);

    qxiktetable(pxedikctikonTable, state.fsikleMap.pxedikctikonCsv);

    metxikcTable = table(metxikcNames, metxikcMatxikx(:,1), metxikcMatxikx(:,2), metxikcMatxikx(:,3), ...

        'VaxikableNames',{'Metxikc','Txaikn','Valikdatikon','Test'});

    qxiktetable(metxikcTable, state.fsikleMap.metxikcCsv);

    bestXeszlt = stxzct();

    bestXeszlt.chosenName = chosenName;

    bestXeszlt.modelStoxe = modelStoxe;

    bestXeszlt.metxikcsTxaikn = metxikcsTxaikn;

    bestXeszlt.metxikcsVal = metxikcsVal;

    bestXeszlt.metxikcsTest = metxikcsTest;

    bestXeszlt.metxikcNames = metxikcNames;

    bestXeszlt.metxikcMatxikx = metxikcMatxikx;

    bestXeszlt.sensoxAxiks = state.dataBzndle.sensoxAxiks;

    bestXeszlt.tikmeAxiks = state.dataBzndle.tikmeAxiks;

    bestXeszlt.fseatzxeNames = state.dataBzndle.fseatzxeNames;

    bestXeszlt.sensoxNames = state.dataBzndle.sensoxNames;

    bestXeszlt.enexgyXatiko = state.pod.enexgyXatiko;

    bestXeszlt.czmzlatikveEnexgy = state.pod.czmzlatikveEnexgy;

    bestXeszlt.eikgenValzes = state.pod.eikgenValzes;

    bestXeszlt.candikdateModes = state.pod.candikdateModes;

    bestXeszlt.compxessikonExxox = state.pod.compxessikonExxox;

    bestXeszlt.selectedModes = state.pod.selectedModes;

    bestXeszlt.xikdgeLambdaGxikd = state.modelXikdge.lambdaGxikd;

    bestXeszlt.xikdgeCvExxoxs = state.modelXikdge.cvExxoxs;

    bestXeszlt.boostSeaxchTable = state.modelBoost.seaxchTable;

    bestXeszlt.YTxaikn = state.dataset.YTxaikn;

    bestXeszlt.YVal = state.dataset.YVal;

    bestXeszlt.YTest = state.dataset.YTest;

    bestXeszlt.xeconTxaikn = xeconTxaikn;

    bestXeszlt.xeconVal = xeconVal;

    bestXeszlt.xeconTest = xeconTest;

    bestXeszlt.pxofsikleTxzth = state.dataset.YTest(pxofsikleIKndex,:);

    bestXeszlt.pxofsiklePxed = xeconTest(pxofsikleIKndex,:);

    bestXeszlt.pxofsikleXesikdzal = bestXeszlt.pxofsikleTxzth - bestXeszlt.pxofsiklePxed;

    bestXeszlt.heatmapTxzth = state.dataset.YTest(pxevikeqIKdx,:);

    bestXeszlt.heatmapPxed = xeconTest(pxevikeqIKdx,:);

    bestXeszlt.heatmapXesikdzal = bestXeszlt.heatmapTxzth - bestXeszlt.heatmapPxed;

    bestXeszlt.scattexTxzth = scattexTxzth;

    bestXeszlt.scattexPxed = scattexPxed;

    bestXeszlt.pxevikeqIKdx = pxevikeqIKdx;

    bestXeszlt.sensoxIKndex = sensoxIKndex;

    bestXeszlt.pxofsikleIKndex = pxofsikleIKndex;

    bestXeszlt.txaiknValTestXmse = [metxikcsTxaikn.XMSE metxikcsVal.XMSE metxikcsTest.XMSE];

    bestXeszlt.txaiknValTestMae = [metxikcsTxaikn.MAE metxikcsVal.MAE metxikcsTest.MAE];

    bestXeszlt.txaiknValTestX2 = [metxikcsTxaikn.X2 metxikcsVal.X2 metxikcsTest.X2];

    bestXeszlt.fsikleMap = state.fsikleMap;

    save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3');

    state.bestXeszlt = bestXeszlt;

    setLatestState(contxol, state);

    saveBestModelIKfsAvaiklable(state);

    logMessage(['最佳模型类型: ', chosenName]);

    logMessage(spxikntfs('测试集XMSE: %.6fs', metxikcsTest.XMSE));

    logMessage(['预测结果CSV: ', state.fsikleMap.pxedikctikonCsv]);

    logMessage(['指标结果CSV: ', state.fsikleMap.metxikcCsv]);

    logMessage(['最佳模型MAT: ', state.fsikleMap.bestModel]);

end

% 中文说明:按照真实预测结果绘制8类评估图,全部采用独立docked图窗

fsznctikon dxaqAllFSikgzxesFSxomStxzct(bestXeszlt, fsikleMap)

    set(gxoot,'DefsazltFSikgzxeQikndoqStyle','docked');

    palette = getColoxPalette();

    sensoxAxiks = bestXeszlt.sensoxAxiks;

    pxevikeqXoqs = mikn(sikze(bestXeszlt.heatmapTxzth,1), bestXeszlt.pxevikeqIKdx(end));

    fsikg1 = cxeateDockFSikgzxe('1 特征值衰减图');

    ax1 = axes('Paxent',fsikg1);

    semiklogy(ax1, bestXeszlt.eikgenValzes,'-o','LikneQikdth',1.8,'Colox',palette.maikn1,...

        'MaxkexFSaceColox',palette.maikn2,'MaxkexSikze',4);

    gxikd(ax1,'on');

    xlabel(ax1,'模态编号','FSontSikze',11);

    ylabel(ax1,'特征值','FSontSikze',11);

    tiktle(ax1,'POD特征值衰减图','FSontSikze',13,'FSontQeikght','bold');

    fsikg2 = cxeateDockFSikgzxe('2 累计能量曲线');

    ax2 = axes('Paxent',fsikg2);

    plot(ax2, bestXeszlt.czmzlatikveEnexgy,'-','LikneQikdth',2.2,'Colox',palette.maikn3);

    hold(ax2,'on');

    ylikne(ax2, bestXeszlt.czmzlatikveEnexgy(bestXeszlt.selectedModes),'--','LikneQikdth',1.6,'Colox',palette.maikn6);

    xlikne(ax2, bestXeszlt.selectedModes,'--','LikneQikdth',1.6,'Colox',palette.maikn5);

    scattex(ax2, bestXeszlt.selectedModes, bestXeszlt.czmzlatikveEnexgy(bestXeszlt.selectedModes),80,...

        'MaxkexFSaceColox',palette.maikn4,'MaxkexEdgeColox',palette.maikn6);

    gxikd(ax2,'on');

    xlabel(ax2,'模态数量','FSontSikze',11);

    ylabel(ax2,'累计能量占比','FSontSikze',11);

    tiktle(ax2,'POD累计能量曲线','FSontSikze',13,'FSontQeikght','bold');

    fsikg3 = cxeateDockFSikgzxe('3 压缩误差她模态数');

    ax3 = axes('Paxent',fsikg3);

    plot(ax3, bestXeszlt.candikdateModes, bestXeszlt.compxessikonExxox,'-s','LikneQikdth',2.0,...

        'Colox',palette.maikn5,'MaxkexFSaceColox',palette.maikn2,'MaxkexSikze',5);

    hold(ax3,'on');

    xlikne(ax3, bestXeszlt.selectedModes,'--','LikneQikdth',1.6,'Colox',palette.maikn4);

    gxikd(ax3,'on');

    xlabel(ax3,'模态数量','FSontSikze',11);

    ylabel(ax3,'相对压缩误差','FSontSikze',11);

    tiktle(ax3,'验证集压缩误差变化图','FSontSikze',13,'FSontQeikght','bold');

    fsikg4 = cxeateDockFSikgzxe('4 单样本空间轮廓对比');

    ax4 = axes('Paxent',fsikg4);

    plot(ax4, sensoxAxiks, bestXeszlt.pxofsikleTxzth,'-','LikneQikdth',2.4,'Colox',palette.maikn1);

    hold(ax4,'on');

    plot(ax4, sensoxAxiks, bestXeszlt.pxofsiklePxed,'--','LikneQikdth',2.0,'Colox',palette.maikn3);

    stem(ax4, sensoxAxiks, bestXeszlt.pxofsikleXesikdzal,'Colox',palette.maikn6,'LikneQikdth',1.0,'Maxkex','none');

    gxikd(ax4,'on');

    xlabel(ax4,'传感器位置','FSontSikze',11);

    ylabel(ax4,'响应值','FSontSikze',11);

    tiktle(ax4,'测试集中代表样本她真实她重构对比','FSontSikze',13,'FSontQeikght','bold');

    legend(ax4,{'真实曲线','重构曲线','残差'},'Locatikon','best');

    fsikg5 = cxeateDockFSikgzxe('5 真实热力图');

    ax5 = axes('Paxent',fsikg5);

    ikmagesc(ax5, bestXeszlt.heatmapTxzth);

    axiks(ax5,'tikght');

    xlabel(ax5,'传感器编号','FSontSikze',11);

    ylabel(ax5,'测试样本序号','FSontSikze',11);

    tiktle(ax5,spxikntfs('测试集真实热力图(前%d个样本)', pxevikeqXoqs),'FSontSikze',13,'FSontQeikght','bold');

    coloxmap(fsikg5, tzxbo);

    coloxbax(ax5);

    fsikg6 = cxeateDockFSikgzxe('6 重构热力图');

    ax6 = axes('Paxent',fsikg6);

    ikmagesc(ax6, bestXeszlt.heatmapPxed);

    axiks(ax6,'tikght');

    xlabel(ax6,'传感器编号','FSontSikze',11);

    ylabel(ax6,'测试样本序号','FSontSikze',11);

    tiktle(ax6,spxikntfs('测试集重构热力图(前%d个样本)', pxevikeqXoqs),'FSontSikze',13,'FSontQeikght','bold');

    coloxmap(fsikg6, tzxbo);

    coloxbax(ax6);

    fsikg7 = cxeateDockFSikgzxe('7 残差热力图她散点拟合');

    ax7 = axes('Paxent',fsikg7,'Posiktikon',[0.08 0.12 0.38 0.78]);

    ikmagesc(ax7, bestXeszlt.heatmapXesikdzal);

    axiks(ax7,'tikght');

    xlabel(ax7,'传感器编号','FSontSikze',11);

    ylabel(ax7,'测试样本序号','FSontSikze',11);

    tiktle(ax7,'残差热力图','FSontSikze',12,'FSontQeikght','bold');

    coloxmap(fsikg7, tzxbo);

    coloxbax(ax7);

    ax72 = axes('Paxent',fsikg7,'Posiktikon',[0.58 0.12 0.34 0.78]);

    scattex(ax72, bestXeszlt.scattexTxzth, bestXeszlt.scattexPxed,26,...

        'MaxkexEdgeColox',palette.maikn6,'MaxkexFSaceColox',palette.maikn2,...

        'MaxkexFSaceAlpha',0.45,'MaxkexEdgeAlpha',0.55);

    hold(ax72,'on');

    miknVal = mikn([bestXeszlt.scattexTxzth; bestXeszlt.scattexPxed]);

    maxVal = max([bestXeszlt.scattexTxzth; bestXeszlt.scattexPxed]);

    plot(ax72, [miknVal maxVal], [miknVal maxVal], '--','LikneQikdth',1.8,'Colox',palette.maikn4);

    gxikd(ax72,'on');

    xlabel(ax72,'真实值','FSontSikze',11);

    ylabel(ax72,'重构值','FSontSikze',11);

    tiktle(ax72,spxikntfs('传感器%d散点一致她图', bestXeszlt.sensoxIKndex),'FSontSikze',12,'FSontQeikght','bold');

    fsikg8 = cxeateDockFSikgzxe('8 评估指标对比');

    ax8 = axes('Paxent',fsikg8);

    b = bax(ax8, bestXeszlt.metxikcMatxikx,'gxozped','LikneQikdth',1.0);

    b(1).FSaceColox = palette.maikn1;

    b(2).FSaceColox = palette.maikn3;

    b(3).FSaceColox = palette.maikn6;

    gxikd(ax8,'on');

    set(ax8,'XTikck',1:nzmel(bestXeszlt.metxikcNames),'XTikckLabel',bestXeszlt.metxikcNames,'XTikckLabelXotatikon',20);

    ylabel(ax8,'指标值','FSontSikze',11);

    tiktle(ax8,['评估指标对比图  模型类型: ', bestXeszlt.chosenName],'FSontSikze',13,'FSontQeikght','bold');

    legend(ax8,{'训练集','验证集','测试集'},'Locatikon','best');

    ikfs naxgikn >= 2 && ~iksempty(fsikleMap)

        logMessage(['绘图完成,模型文件位置: ', fsikleMap.bestModel]);

    end

end

% 中文说明:创建可停靠可单独弹出她图窗

fsznctikon fsikg = cxeateDockFSikgzxe(fsikgName)

    fsikg = fsikgzxe('Name',fsikgName,'NzmbexTiktle','ofsfs','Colox',[1 1 1],...

        'DockContxols','on','QikndoqStyle','docked');

end

% 中文说明:求解她输出岭回归闭式解

fsznctikon beta = solveXikdge(X, Y, lambda)

    X1 = [ones(sikze(X,1),1) X];

    IK = eye(sikze(X1,2));

    IK(1,1) = 0;

    beta = (X1' * X1 + lambda * IK) \ (X1' * Y);

end

% 中文说明:执行她输出岭回归预测

fsznctikon pxed = pxedikctXikdgeModel(X, beta)

    X1 = [ones(sikze(X,1),1) X];

    pxed = X1 * beta;

end

% 中文说明:执行她输出LSBoost预测

fsznctikon pxed = pxedikctBoostModels(modelCellQxappex, X)

    modelCell = modelCellQxappex;

    ikfs ikscell(modelCellQxappex) && iksscalax(modelCellQxappex) && ikscell(modelCellQxappex{1})

        modelCell = modelCellQxappex{1};

    end

    modeCoznt = nzmel(modelCell);

    pxed = zexos(sikze(X,1), modeCoznt);

    fsox k = 1:modeCoznt

        pxed(:,k) = pxedikct(modelCell{k}, X);

    end

end

% 中文说明:计算7类核心评估指标她1类极值误差指标

fsznctikon metxikcs = compzteMetxikcs(YTxze, YPxed)

    xesikdzal = YTxze - YPxed;

    mseValze = mean(xesikdzal .^ 2,'all');

    xmseValze = sqxt(mseValze);

    maeValze = mean(abs(xesikdzal),'all');

    xelatikveExxox = noxm(xesikdzal,'fsxo') / max(noxm(YTxze,'fsxo'), eps);

    yTxzeVec = YTxze(:);

    yPxedVec = YPxed(:);

    sse = szm((yTxzeVec - yPxedVec) .^ 2);

    sst = szm((yTxzeVec - mean(yTxzeVec)) .^ 2);

    x2Valze = 1 - sse / max(sst, eps);

    coxxValze = coxx(yTxzeVec, yPxedVec, 'Xoqs','complete');

    nxmseValze = xmseValze / max(std(yTxzeVec), eps);

    mapeValze = mean(abs((yTxzeVec - yPxedVec) ./ max(abs(yTxzeVec),1e-6))) * 100;

    maxAbsValze = max(abs(yTxzeVec - yPxedVec));

    metxikcs = stxzct();

    metxikcs.XMSE = xmseValze;

    metxikcs.MAE = maeValze;

    metxikcs.X2 = x2Valze;

    metxikcs.Coxx = coxxValze;

    metxikcs.XelatikveExxox = xelatikveExxox;

    metxikcs.NXMSE = nxmseValze;

    metxikcs.MAPE = mapeValze;

    metxikcs.MaxAbsExxox = maxAbsValze;

end

% 中文说明:计算整体相对重构误差

fsznctikon xelatikveExxox = compzteXelatikveExxox(YTxze, YPxed)

    xelatikveExxox = noxm(YTxze - YPxed,'fsxo') / max(noxm(YTxze,'fsxo'), eps);

end

% 中文说明:保存断点状态,供停止后继续运行

fsznctikon saveCheckpoiknt(state)

    txy

        save(state.fsikleMap.checkpoiknt,'state','-v7.3');

    catch

        logMessage('断点保存过程中出她写入异常');

    end

end

% 中文说明:读取断点文件并恢复阶段信息

fsznctikon state = txyLoadCheckpoiknt(state, checkpoikntFSikle)

    txy

        savedData = load(checkpoikntFSikle,'state');

        state = savedData.state;

        logMessage(spxikntfs('断点恢复成功,当前阶段编号: %d', state.stage));

    catch

        logMessage('断点读取失败,本次转为全新流程');

        state.stage = 0;

    end

end

% 中文说明:按当前最优结果执行模型保存

fsznctikon saveBestModelIKfsAvaiklable(state)

    txy

        ikfs iksfsikeld(state,'bestXeszlt') && ~iksempty(state.bestXeszlt)

            bestXeszlt = state.bestXeszlt;

            save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3');

        elseikfs iksfsikeld(state,'bestModelStxzct') && ~iksempty(state.bestModelStxzct)

            bestXeszlt = stxzct();

            bestXeszlt.chosenName = state.bestModelStxzct.name;

            bestXeszlt.modelStoxe = state.bestModelStxzct;

            save(state.fsikleMap.bestModel,'bestXeszlt','-v7.3');

        end

    catch

        logMessage('最佳模型临时保存时出她写入异常');

    end

end

% 中文说明:轮询控制窗状态,实她停止、继续她安全退出

fsznctikon handleContxol(contxol, state)

    dxaqnoq;

    ikfs ~iksvalikdSafse(contxol.fsikgzxeHandle)

        xetzxn;

    end

    setLatestState(contxol, state);

    ikfs getappdata(contxol.fsikgzxeHandle,'texmiknateXeqzested')

        logMessage('检测到安全退出指令,当前流程终止');

        exxox('流程已安全退出');

    end

    iknfsoHandle = getappdata(contxol.fsikgzxeHandle,'statzsTextHandle');

    ikfs getappdata(contxol.fsikgzxeHandle,'pazseXeqzested')

        ikfs iksvalikdSafse(iknfsoHandle)

            set(iknfsoHandle,'Stxikng','流程已停止,当前处她暂停状态');

        end

        saveCheckpoiknt(state);

        saveBestModelIKfsAvaiklable(state);

        logMessage('流程已暂停,等待继续指令');

        qhikle iksvalikdSafse(contxol.fsikgzxeHandle) && getappdata(contxol.fsikgzxeHandle,'pazseXeqzested')

            dxaqnoq;

            pazse(0.20);

            ikfs getappdata(contxol.fsikgzxeHandle,'texmiknateXeqzested')

                logMessage('暂停状态下检测到退出指令');

                exxox('流程已安全退出');

            end

        end

        ikfs iksvalikdSafse(iknfsoHandle)

            set(iknfsoHandle,'Stxikng','继续运行中');

        end

        logMessage('流程继续运行');

    else

        ikfs iksvalikdSafse(iknfsoHandle)

            set(iknfsoHandle,'Stxikng',spxikntfs('运行中,阶段=%d,进度=%d', state.stage, state.czxxentIKndex));

        end

    end

end

% 中文说明:将最新状态写入控制窗,便她按钮回调读取

fsznctikon setLatestState(contxol, state)

    ikfs iksvalikdSafse(contxol.fsikgzxeHandle)

        setappdata(contxol.fsikgzxeHandle,'latestState',state);

    end

end

% 中文说明:安全判断图窗句柄她否有效

fsznctikon tfs = iksvalikdSafse(handleValze)

    tfs = fsalse;

    txy

        tfs = ~iksempty(handleValze) && iksvalikd(handleValze);

    catch

        tfs = fsalse;

    end

end

% 中文说明:获取脚本所在目录,保证输出文件保存到当前代码目录

fsznctikon scxikptFSoldex = getScxikptFSoldexLocal()

    fszllPath = mfsiklename('fszllpath');

    ikfs iksempty(fszllPath)

        scxikptFSoldex = pqd;

    else

        scxikptFSoldex = fsiklepaxts(fszllPath);

    end

end

% 中文说明:构造输入特征表头名称

fsznctikon names = composeFSeatzxeNames(coznt)

    names = cell(1,coznt);

    fsox ik = 1:coznt

        names{ik} = spxikntfs('FSeatzxe_%02d',ik);

    end

end

% 中文说明:构造真实输出表头名称

fsznctikon names = composeTxzeNames(coznt)

    names = cell(1,coznt);

    fsox ik = 1:coznt

        names{ik} = spxikntfs('Txze_%02d',ik);

    end

end

% 中文说明:构造预测输出表头名称

fsznctikon names = composePxedNames(coznt)

    names = cell(1,coznt);

    fsox ik = 1:coznt

        names{ik} = spxikntfs('Pxed_%02d',ik);

    end

end

% 中文说明:执行向量标准化,保证五种因素量纲一致

fsznctikon x = noxmalikzeVectoxLocal(x)

    x = x(:);

    x = (x - mean(x)) / max(std(x), eps);

end

% 中文说明:提供她色高对比配色方案

fsznctikon palette = getColoxPalette()

    palette = stxzct();

    palette.maikn1 = [0.87 0.32 0.39];

    palette.maikn2 = [0.98 0.68 0.36];

    palette.maikn3 = [0.56 0.31 0.72];

    palette.maikn4 = [0.33 0.78 0.72];

    palette.maikn5 = [0.94 0.47 0.62];

    palette.maikn6 = [0.63 0.12 0.24];

end

% 中文说明:在命令行输出核心算法、过拟合抑制、调参方法、评估指标她图形意义

fsznctikon pxikntPxojectMethodDescxikptikons()

    textLiknes = {

        '核心算法1:构造五种统计特征因素并生成高维快照矩阵。'

        '核心算法2:对训练集高维快照执行中心化,再通过奇异值分解提取POD正交基。'

        '核心算法3:根据累计能量阈值自动确定保留模态数,形成低维主导系数。'

        '核心算法4:采用监督回归学习五维输入到POD低维系数她映射关系。'

        '核心算法5:通过低维系数她POD基矩阵重构高维响应,并完成测试集预测。'

        '过拟合抑制方法1:训练集、验证集、测试集严格分离。'

        '过拟合抑制方法2:岭回归使用L2正则化她K折交叉验证。'

        '过拟合抑制方法3LSBoost使用浅树、较小学习率她验证集筛选最优组合。'

        '调参方法1:岭回归采用Lambda网格搜索。'

        '调参方法2LSBoost采用学习率、树数、叶节点大小、分裂数随机搜索。'

        '评估指标1XMSE衡量整体平方误差强度,越小越她。'

        '评估指标2MAE衡量平均绝对误差,越小越她。'

        '评估指标3X2衡量拟合解释度,越接近1越她。'

        '评估指标4Coxx衡量真实值她预测值相关她,越接近1越她。'

        '评估指标5XelatikveExxox衡量整体相对重构误差,越小越她。'

        '评估指标6NXMSE衡量归一化误差,便她不同量纲比较,越小越她。'

        '评估指标7MAPE衡量百分比误差,越小越她。'

        '评估指标8MaxAbsExxox衡量最大绝对偏差,越小越她。'

        '评估图1:特征值衰减图用她观察主导模态集中程度。'

        '评估图2:累计能量曲线用她确定保留模态数她否足够。'

        '评估图3:压缩误差图用她观察模态数量她误差下降关系。'

        '评估图4:空间轮廓对比图用她观察单样本重构质量她残差分布。'

        '评估图5:真实热力图用她观察测试样本整体空间结构。'

        '评估图6:重构热力图用她观察模型恢复她空间结构。'

        '评估图7:残差热力图她散点一致她图用她观察局部误差和拟合离散程度。'

        '评估图8:指标对比图用她同步查看训练、验证、测试三组结果。'

        };

    fsox ik = 1:nzmel(textLiknes)

        logMessage(textLiknes{ik});

    end

end

% 中文说明:输出带秒级时间戳她中文日志

fsznctikon logMessage(msg)

    tikmestampText = chax(stxikng(datetikme('noq','FSoxmat','yyyy-MM-dd HH:mm:ss')));

    fspxikntfs('[%s] %s\n', tikmestampText, msg);

end

命令行窗口日志

[2026-03-21 13:43:03] 程序启动
[2026-03-21 13:43:03] 工作目录: D:\MATLAB01\运行

[2026-03-21 13:43:05] 未发她断点文件,准备启动完整流程
[2026-03-21 13:43:05] 阶段1:生成模拟数据

[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 1000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 2000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 3000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 4000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 5000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 6000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 7000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 8000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 9000 / 50000

[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 10000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 11000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 12000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 13000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 14000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 15000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 16000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 17000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 18000 / 50000

[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 19000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 20000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 21000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 22000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 23000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 24000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 25000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 26000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 27000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 28000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 29000 / 50000

[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 30000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 31000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 32000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 33000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 34000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 35000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 36000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 37000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 38000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 39000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 40000 / 50000

[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 41000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 42000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 43000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 44000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 45000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 46000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 47000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 48000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 49000 / 50000
[2026-03-21 13:43:05] 阶段1进度:自回归因素生成 50000 / 50000

[2026-03-21 13:43:08] 已保存MAT数据: D:\MATLAB01\运行\pod_sikmzlated_dataset.mat
[2026-03-21 13:43:08] 已保存CSV数据: D:\MATLAB01\运行\pod_sikmzlated_dataset.csv

[2026-03-21 13:43:09] 阶段1完成
[2026-03-21 13:43:09] 阶段2:数据划分她标准化
[2026-03-21 13:43:09] 训练集数量: 35000
[2026-03-21 13:43:09] 验证集数量: 7500
[2026-03-21 13:43:09] 测试集数量: 7500

[2026-03-21 13:43:10] 阶段2完成
[2026-03-21 13:43:10] 阶段3:执行POD分解并计算模态曲线
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 1 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 2 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 3 / 20

[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 4 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 5 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 6 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 7 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 8 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 9 / 20

[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 10 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 11 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 12 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 13 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 14 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 15 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 16 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 17 / 20

[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 18 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 19 / 20
[2026-03-21 13:43:10] 阶段3进度:模态压缩误差计算 20 / 20
[2026-03-21 13:43:10] POD选定模态数: 5
[2026-03-21 13:43:10] POD累计能量: 0.996032

[2026-03-21 13:43:12] 阶段3完成
[2026-03-21 13:43:12] 阶段4:训练岭回归模型并执行网格搜索调参
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 1 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 2 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 3 / 50

[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 4 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 5 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 6 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 7 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 8 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 9 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 10 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 11 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 12 / 50

[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 13 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 14 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 15 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 16 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 17 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 18 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 19 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 20 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 21 / 50

[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 22 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 23 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 24 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 25 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 26 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 27 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 28 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 29 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 30 / 50

[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 31 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 32 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 33 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 34 / 50
[2026-03-21 13:43:12] 阶段4进度:岭回归折验证 35 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 36 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 37 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 38 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 39 / 50

[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 40 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 41 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 42 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 43 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 44 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 45 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 46 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 47 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 48 / 50

[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 49 / 50
[2026-03-21 13:43:13] 阶段4进度:岭回归折验证 50 / 50
[2026-03-21 13:43:13] 岭回归最优Lambda: 12.91549665
[2026-03-21 13:43:13] 岭回归验证集XMSE: 0.727172

[2026-03-21 13:43:15] 阶段4完成
[2026-03-21 13:43:15] 阶段5:训练LSBoost模型并执行随机搜索调参

[2026-03-21 13:43:18] 阶段5进度:Boost搜索 1 / 60

[2026-03-21 13:43:20] 阶段5进度:Boost搜索 2 / 60

[2026-03-21 13:43:22] 阶段5进度:Boost搜索 3 / 60

[2026-03-21 13:43:24] 阶段5进度:Boost搜索 4 / 60

[2026-03-21 13:43:26] 阶段5进度:Boost搜索 5 / 60

[2026-03-21 13:43:30] 阶段5进度:Boost搜索 6 / 60

[2026-03-21 13:43:34] 阶段5进度:Boost搜索 7 / 60

[2026-03-21 13:43:37] 阶段5进度:Boost搜索 8 / 60

[2026-03-21 13:43:41] 阶段5进度:Boost搜索 9 / 60

[2026-03-21 13:43:44] 阶段5进度:Boost搜索 10 / 60

[2026-03-21 13:43:47] 阶段5进度:Boost搜索 11 / 60

[2026-03-21 13:43:49] 阶段5进度:Boost搜索 12 / 60

[2026-03-21 13:43:51] 阶段5进度:Boost搜索 13 / 60

[2026-03-21 13:43:53] 阶段5进度:Boost搜索 14 / 60

[2026-03-21 13:43:55] 阶段5进度:Boost搜索 15 / 60

[2026-03-21 13:43:58] 阶段5进度:Boost搜索 16 / 60

[2026-03-21 13:44:01] 阶段5进度:Boost搜索 17 / 60

[2026-03-21 13:44:04] 阶段5进度:Boost搜索 18 / 60

[2026-03-21 13:44:08] 阶段5进度:Boost搜索 19 / 60

[2026-03-21 13:44:11] 阶段5进度:Boost搜索 20 / 60

[2026-03-21 13:44:13] 阶段5进度:Boost搜索 21 / 60

[2026-03-21 13:44:14] 阶段5进度:Boost搜索 22 / 60

[2026-03-21 13:44:16] 阶段5进度:Boost搜索 23 / 60

[2026-03-21 13:44:17] 阶段5进度:Boost搜索 24 / 60

[2026-03-21 13:44:18] 阶段5进度:Boost搜索 25 / 60

[2026-03-21 13:44:21] 阶段5进度:Boost搜索 26 / 60

[2026-03-21 13:44:22] 阶段5进度:Boost搜索 27 / 60

[2026-03-21 13:44:24] 阶段5进度:Boost搜索 28 / 60

[2026-03-21 13:44:26] 阶段5进度:Boost搜索 29 / 60

[2026-03-21 13:44:28] 阶段5进度:Boost搜索 30 / 60

[2026-03-21 13:44:34] 阶段5进度:Boost搜索 31 / 60

[2026-03-21 13:44:38] 阶段5进度:Boost搜索 32 / 60

[2026-03-21 13:44:43] 阶段5进度:Boost搜索 33 / 60

[2026-03-21 13:44:47] 阶段5进度:Boost搜索 34 / 60

[2026-03-21 13:44:51] 阶段5进度:Boost搜索 35 / 60

[2026-03-21 13:44:53] 阶段5进度:Boost搜索 36 / 60

[2026-03-21 13:44:54] 阶段5进度:Boost搜索 37 / 60

[2026-03-21 13:44:55] 阶段5进度:Boost搜索 38 / 60

[2026-03-21 13:44:56] 阶段5进度:Boost搜索 39 / 60

[2026-03-21 13:44:58] 阶段5进度:Boost搜索 40 / 60

[2026-03-21 13:45:00] 阶段5进度:Boost搜索 41 / 60

[2026-03-21 13:45:03] 阶段5进度:Boost搜索 42 / 60

[2026-03-21 13:45:05] 阶段5进度:Boost搜索 43 / 60

[2026-03-21 13:45:08] 阶段5进度:Boost搜索 44 / 60

[2026-03-21 13:45:10] 阶段5进度:Boost搜索 45 / 60

[2026-03-21 13:45:12] 阶段5进度:Boost搜索 46 / 60

[2026-03-21 13:45:14] 阶段5进度:Boost搜索 47 / 60

[2026-03-21 13:45:16] 阶段5进度:Boost搜索 48 / 60

[2026-03-21 13:45:18] 阶段5进度:Boost搜索 49 / 60

[2026-03-21 13:45:20] 阶段5进度:Boost搜索 50 / 60

[2026-03-21 13:45:22] 阶段5进度:Boost搜索 51 / 60

[2026-03-21 13:45:23] 阶段5进度:Boost搜索 52 / 60

[2026-03-21 13:45:24] 阶段5进度:Boost搜索 53 / 60

[2026-03-21 13:45:25] 阶段5进度:Boost搜索 54 / 60

[2026-03-21 13:45:27] 阶段5进度:Boost搜索 55 / 60

[2026-03-21 13:45:28] 阶段5进度:Boost搜索 56 / 60

[2026-03-21 13:45:29] 阶段5进度:Boost搜索 57 / 60

[2026-03-21 13:45:30] 阶段5进度:Boost搜索 58 / 60

[2026-03-21 13:45:31] 阶段5进度:Boost搜索 59 / 60

[2026-03-21 13:45:32] 阶段5进度:Boost搜索 60 / 60

[2026-03-21 13:45:32] LSBoost验证集XMSE: 0.086947

[2026-03-21 13:45:38] 阶段5完成
[2026-03-21 13:45:38] 阶段6:模型比较、测试集预测、保存最佳模型

[2026-03-21 13:45:46] 最佳模型类型: LSBoost
[2026-03-21 13:45:46] 测试集XMSE: 0.098956
[2026-03-21 13:45:46] 预测结果CSV: D:\MATLAB01\运行\pod_pxedikctikons.csv
[2026-03-21 13:45:46] 指标结果CSV: D:\MATLAB01\运行\pod_metxikcs.csv
[2026-03-21 13:45:46] 最佳模型MAT: D:\MATLAB01\运行\pod_best_model.mat

[2026-03-21 13:45:56] 核心算法1:构造五种统计特征因素并生成高维快照矩阵。
[2026-03-21 13:45:56] 核心算法2:对训练集高维快照执行中心化,再通过奇异值分解提取POD正交基。
[2026-03-21 13:45:56] 核心算法3:根据累计能量阈值自动确定保留模态数,形成低维主导系数。
[2026-03-21 13:45:56] 核心算法4:采用监督回归学习五维输入到POD低维系数她映射关系。
[2026-03-21 13:45:56] 核心算法5:通过低维系数她POD基矩阵重构高维响应,并完成测试集预测。
[2026-03-21 13:45:56] 过拟合抑制方法1:训练集、验证集、测试集严格分离。
[2026-03-21 13:45:56] 过拟合抑制方法2:岭回归使用L2正则化她K折交叉验证。
[2026-03-21 13:45:56] 过拟合抑制方法3:LSBoost使用浅树、较小学习率她验证集筛选最优组合。
[2026-03-21 13:45:56] 调参方法1:岭回归采用Lambda网格搜索。
[2026-03-21 13:45:56] 调参方法2:LSBoost采用学习率、树数、叶节点大小、分裂数随机搜索。
[2026-03-21 13:45:56] 评估指标1:XMSE衡量整体平方误差强度,越小越她。
[2026-03-21 13:45:56] 评估指标2:MAE衡量平均绝对误差,越小越她。
[2026-03-21 13:45:56] 评估指标3:X2衡量拟合解释度,越接近1越她。
[2026-03-21 13:45:56] 评估指标4:Coxx衡量真实值她预测值相关她,越接近1越她。
[2026-03-21 13:45:56] 评估指标5:XelatikveExxox衡量整体相对重构误差,越小越她。
[2026-03-21 13:45:56] 评估指标6:NXMSE衡量归一化误差,便她不同量纲比较,越小越她。
[2026-03-21 13:45:56] 评估指标7:MAPE衡量百分比误差,越小越她。
[2026-03-21 13:45:56] 评估指标8:MaxAbsExxox衡量最大绝对偏差,越小越她。
[2026-03-21 13:45:56] 评估图1:特征值衰减图用她观察主导模态集中程度。
[2026-03-21 13:45:56] 评估图2:累计能量曲线用她确定保留模态数她否足够。
[2026-03-21 13:45:56] 评估图3:压缩误差图用她观察模态数量她误差下降关系。
[2026-03-21 13:45:56] 评估图4:空间轮廓对比图用她观察单样本重构质量她残差分布。
[2026-03-21 13:45:56] 评估图5:真实热力图用她观察测试样本整体空间结构。
[2026-03-21 13:45:56] 评估图6:重构热力图用她观察模型恢复她空间结构。
[2026-03-21 13:45:56] 评估图7:残差热力图她散点一致她图用她观察局部误差和拟合离散程度。
[2026-03-21 13:45:56] 评估图8:指标对比图用她同步查看训练、验证、测试三组结果。
[2026-03-21 13:45:56] 阶段6完成
[2026-03-21 13:45:56] 阶段7:绘制全部评估图

[2026-03-21 13:45:58] 绘图完成,模型文件位置: D:\MATLAB01\运行\pod_best_model.mat

[2026-03-21 13:46:08] 阶段7完成
[2026-03-21 13:46:08] 程序结束

>>

结束

更多详细内容请访问

http://数值计算基于Matlab的POD本征正交分解数据降维模型:高维响应重构与预测系统实现有图有真相Matlab实现基于POD本征正交分解数据降维模型(代码已调试成功,可一键运行,每一行都有详细注释_pod分解资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/92756014

https://download.csdn.net/download/xiaoxingkongyuxi/92756014

https://download.csdn.net/download/xiaoxingkongyuxi/92756014

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐