%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据
res = xlsread('数据集.xlsx');
%% 数据分析
num_size = 0.7; % 训练集占数据集比例
outdim = 1; % 最后一列为输出
num_samples = size(res, 1); % 样本个数
res = res(randperm(num_samples), :); % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 转置以适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
%% 预训练的参数设置
opts.numepochs = 500; % 训练次数
opts.batchsize = 12; % 每次训练样本个数 需满足:(M / batchsize = 整数)
opts.momentum = 0; % 学习率的动量
opts.alpha = 0.05; % 学习率
%% 粒子群的参数初始化
c1 = 54.95; % 学习因子
c2 = 4.494; % 学习因子
maxgen = 30; % 种群更新次数
sizepop = 5; % 种群规模
%% 设置边界
% ------ 前 numsum 个数为隐藏层节点边界和速度,最后一个为反向学习率,倒数第二个为迭代次数 -------
Vmax = [ 20, 20, 400, 1.0]; % 最大速度
Vmin = [ -5, -5, -50, -0.5]; % 最小速度
popmax = [100, 100, 5000, 4.0]; % 最大边界
popmin = [ 10, 10, 200, 0.5]; % 最小边界
%% 节点总数
numsum = length(popmax) - 2; % 隐藏层层数
for i = 1 : sizepop
pop(i, :) = rand(1, length(popmax)) .* (popmax - popmin) ./ 1.2 + popmax ./ 100;
V(i, :) = rand(1, length(Vmax)) .* Vmax + 1;
fitness(i) = fun(pop(i, :), numsum, p_train, t_train, opts);
end
%% 个体极值和群体极值
[fitnesszbest, bestindex] = min(fitness);
zbest = pop(bestindex, :); % 全局最佳
gbest = pop; % 个体最佳
fitnessgbest = fitness; % 个体最佳适应度值
BestFit = fitnesszbest; % 全局最佳适应度值
%% 迭代寻优
for i = 1 : maxgen
for j = 1 : sizepop
% 速度更新
V(j, :) = V(j, :) + c1 * rand * (gbest(j, :) - pop(j, :)) + c2 * rand * (zbest - pop(j, :));
if (sum(V(j, :) > Vmax) > 0 || sum(V(j, :) < Vmin) > 0)
[~, vmax_index] = find(V(j, :) > Vmax);
[~, vmin_index] = find(V(j, :) < Vmin);
V(j, vmax_index) = Vmax(vmax_index);
V(j, vmin_index) = Vmin(vmin_index);
end
% 种群更新
pop(j, :) = pop(j, :) + 0.2 * V(j, :);
if (sum(pop(j, :) > popmax) > 0 || sum(pop(j, :) < popmin) > 0)
[~, pmax_index] = find(pop(j, :) > popmax);
[~, pmin_index] = find(pop(j, :) < popmin);
pop(j, pmax_index) = popmax(pmax_index);
pop(j, pmin_index) = popmin(pmin_index);
end
% 自适应变异
if rand > 0.85
pop(j, :) = rand(1, length(popmax)) .* (popmax - popmin) / 1.2 + popmax ./ 100;
end
% 适应度值
fitness(j) = fun(pop(j, :), numsum, p_train, t_train, opts);
end
for j = 1 : sizepop
% 个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j, :) = pop(j, :);
fitnessgbest(j) = fitness(j);
end
% 群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j, :);
fitnesszbest = fitness(j);
end
end
BestFit = [BestFit, fitnesszbest];
end
%% 提取最优参数
for i = 1 : numsum
dbn.sizes(i + 1) = round(zbest(i));
end
dbn.sizes(1) = []; %
lr = zbest(end); % 学习率
epochs = round(zbest(numsum + 1)); % 迭代次数
%% 训练模型
dbn = dbnsetup(dbn, p_train, opts); % 建立模型
dbn = dbntrain(dbn, p_train, opts); % 训练模型
%% 训练权重移植,添加输出层
nn = dbnunfoldtonn(dbn, outdim);
%% 反向调整网络
% ----- 参数修改时,请查看fun函数中的参数设置,并作出对应修改 ---------
opts.numepochs = epochs; % 反向微调次数
opts.batchsize = 12; % 每次反向微调样本数 需满足:(M / batchsize = 整数)
nn.activation_function = 'sigm'; % 激活函数
nn.learningRate = lr; % 学习率
nn.momentum = 0.5; % 动量参数
nn.scaling_learningRate = 1; % 学习率的比例因子
[nn, loss] = nntrain(nn, p_train, t_train, opts); % 训练
%% 预测
t_sim1 = nnpredict(nn, p_train);
t_sim2 = nnpredict(nn, p_test );
%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
%% 均方根误差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);
%% 绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% 绘制损失函数曲线
figure
plot(1 : length(loss), loss, 'b-', 'LineWidth', 1)
xlim([1, length(loss)])
xlabel('迭代次数')
ylabel('误差损失')
legend('损失函数')
title('损失函数')
grid
%% 误差曲线迭代图
figure;
plot(1 : length(BestFit), BestFit, 'LineWidth', 1.5);
xlabel('粒子群迭代次数');
ylabel('适应度值');
xlim([1, length(BestFit)])
string = {'模型迭代误差变化'};
title(string)
grid on
%% 相关指标计算
% R2
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2;
disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])
% MBE
mbe1 = sum(T_sim1' - T_train) ./ M ;
mbe2 = sum(T_sim2' - T_test ) ./ N ;
disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
MATLAB实现PSO-DBN粒子群算法优化深度置信网络多输入单输出回归预测(完整源码和数据) 粒子群算法优化深度置信网络的学习率、迭代次数。 运行环境matlab2018b及以上,输入7个特征,输出1个变量。
资源推荐
资源详情
资源评论
收起资源包目录
回归预测:PSO-DBN.zip (22个子文件)
PSO-DBN2.png 31KB
PSO-DBN4.png 55KB
PSO-DBN3.png 70KB
PSO-DBN1.png 24KB
PSO-DBN回归
tanh_opt.m 91B
nnapplygrads.m 771B
dbntrain.m 303B
rbmtrain.m 1KB
nnsetup.m 2KB
nnff.m 2KB
nnpredict.m 177B
main.m 6KB
rbmdown.m 130B
数据集.xlsx 15KB
sigm.m 66B
nnbp.m 2KB
sigmrnd.m 102B
dbnunfoldtonn.m 362B
fun.m 1KB
rbmup.m 134B
dbnsetup.m 614B
nntrain.m 2KB
共 22 条
- 1
资源评论
- qvzhaoxuan2023-05-09资源内容详细全面,与描述一致,对我很有用,有一定的使用价值。
- dysonwang2023-03-17资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
机器学习之心
- 粉丝: 1w+
- 资源: 676
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功