算数优化算法AOA优化LSTM的神经元个数,学习率,迭代次数,做多个特征变量输入,单个因变量输出的拟合预测建模。 程序内注释详细,直接替换数据就可以用。 程序可以出测试集的预测拟合图和线性拟合图,以及优化的迭次收敛图,可打印多种评价指标,方便分析和模型评价。 程序是matlab语言,需求版本是2020b及以上。 不会替换数据的可以免费指导替换数据,无原理讲解。 想要的加好友我吧。


当调参成了“炼丹”,试试AOA+LSTM自动优化

调参这事儿,搞过机器学习的都懂——像在炼丹炉前守着火候,多一克参数炸炉,少一克效果拉胯。今天分享个用算数优化算法(AOA)自动优化LSTM超参数的实战代码,直接把“炼丹”过程自动化。下面甩干货,代码直接扒开看,想换数据的文末找我。


数据准备:喂给模型的第一口饭

先整一个能直接跑的数据结构,输入输出对得上就行。这里假设你有N个特征列(比如温度、湿度、风速),最后一列是因变量(比如PM2.5浓度)。数据分训练集和测试集,比例自己定。

% 数据读取(替换这里的数据路径)
data = readmatrix('你的数据.csv'); 
inputData = data(:, 1:end-1);  % 前N列是特征
outputData = data(:, end);      % 最后一列是预测目标

% 划分训练集和测试集(7:3分)
trainRatio = 0.7;
[nSamples, ~] = size(data);
trainSize = round(trainRatio * nSamples);
XTrain = inputData(1:trainSize, :); 
YTrain = outputData(1:trainSize);
XTest = inputData(trainSize+1:end, :);
YTest = outputData(trainSize+1:end);

参数优化:AOA来当你的“炼丹童子”

AOA的核心是动态调整搜索策略,比遗传算法这类更“聪明”。这里要优化的参数包括LSTM的神经元个数、学习率、迭代次数。

% AOA参数设置
maxIter = 50;       % 最大迭代次数
nPop = 10;          % 种群数量
lb = [10,  0.001, 50];  % 下限:[神经元数, 学习率, 迭代次数]
ub = [200, 0.1,  200];  % 上限

% 定义优化问题
problem.objective = @(x) fitnessLSTM(x, XTrain, YTrain, XTest, YTest);
problem.vars_num = 3;     % 优化变量个数
problem.lb = lb;
problem.ub = ub;

% 启动AOA优化
[BestSol, BestCost] = AOA(problem, nPop, maxIter);

关键点解释

  • fitnessLSTM是自定义的适应度函数,内部用LSTM训练并返回测试集RMSE
  • 变量BestSol会保存最优的[神经元数, 学习率, 迭代次数]

LSTM模型:动态调整的网络结构

在适应度函数里,根据AOA给出的参数动态构建LSTM网络,避免手动调参的麻烦。

function rmse = fitnessLSTM(OptVars, XTrain, YTrain, XTest, YTest)
    numFeatures = size(XTrain, 2);  % 特征数自动获取
    numHiddenUnits = round(OptVars(1)); % 神经元个数
    learningRate = OptVars(2);      % 学习率
    maxEpochs = round(OptVars(3));  % 迭代次数
    
    % 构建LSTM网络
    layers = [ ...
        sequenceInputLayer(numFeatures)
        lstmLayer(numHiddenUnits)
        fullyConnectedLayer(1)
        regressionLayer];
    
    options = trainingOptions('adam', ...
        'MaxEpochs', maxEpochs, ...
        'LearnRate', learningRate, ...
        'Verbose', 0);  % 不显示训练过程
    
    % 训练并预测
    net = trainNetwork(XTrain', YTrain', layers, options);
    YPred = predict(net, XTest');
    rmse = sqrt(mean((YPred - YTest').^2)); % 计算RMSE
end

避坑指南

  • 输入数据格式要转置(LSTM默认特征维在列方向)
  • Verbose=0关闭训练输出,避免刷屏

结果可视化:三张图搞定汇报

训练完直接出图,效果好坏一目了然。

% 1. 预测值 vs 真实值(测试集)
figure;
plot(YTest, 'b', 'LineWidth', 1.5); 
hold on;
plot(YPred, 'r--', 'LineWidth', 1);
legend('真实值', '预测值');
title('测试集预测效果');

% 2. 线性拟合图
figure;
scatter(YTest, YPred);
hold on;
plot([min(YTest), max(YTest)], [min(YTest), max(YTest)], 'k--');
xlabel('真实值');
ylabel('预测值');
title('预测值-真实值线性拟合');

% 3. AOA收敛曲线
figure;
plot(BestCost, 'r', 'LineWidth', 1.5);
xlabel('迭代次数');
ylabel('RMSE');
title('AOA优化收敛过程');

评价指标

算数优化算法AOA优化LSTM的神经元个数,学习率,迭代次数,做多个特征变量输入,单个因变量输出的拟合预测建模。 程序内注释详细,直接替换数据就可以用。 程序可以出测试集的预测拟合图和线性拟合图,以及优化的迭次收敛图,可打印多种评价指标,方便分析和模型评价。 程序是matlab语言,需求版本是2020b及以上。 不会替换数据的可以免费指导替换数据,无原理讲解。 想要的加好友我吧。

代码里内置了RMSE、MAE、R²的计算,直接打印到命令行:

fprintf('测试集RMSE: %.4f\n', rmse);
fprintf('R²: %.4f\n', 1 - sum((YTest - YPred').^2)/sum((YTest - mean(YTest)).^2));

怎么用?
  1. 替换你的数据(确保最后一列是因变量)
  2. 调整lbub定义你的参数范围
  3. 运行,等着收图

数据不会换?直接私我,免费指导。代码在MATLAB 2020b上跑通,低版本可能报错。


最后说一句:调参虽可自动化,但特征工程才是真功夫。变量选得好,AOA+LSTM才能起飞。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐