1.代码实现
clear
clc
load('D1.mat')
life = (314:-1:0)';
life1 = (314:-1:0)';
life = [life;life1];
life = [life;life1];
life = [life;life1];
life = [life;life1];
for f= 1:size(C1,2)
Ti(:,f) = normalize(C1(:,f));
d(1,f) = corr(life,Ti(:,f),'type','Spearman');
end
% 相关性系数
d = abs(d); % 将相关系数绝对值
[j main_feature] = find(d>=0.8);
% % ±0.80-±1.00 高度相关
M = length(main_feature);
for k = 1:M
p = main_feature(1,k);
c1(:,k) = C1(:,p); % 提取降维特征
c2(:,k) = C2(:,p);
c3(:,k) = C3(:,p);
c4(:,k) = C4(:,p);
c5(:,k) = C5(:,p);
c6(:,k) = C6(:,p);
L1(:,k) = l1(:,p);
L2(:,k) = l2(:,p);
L3(:,k) = l3(:,p);
L4(:,k) = l4(:,p);
L5(:,k) = l5(:,p);
L6(:,k) = l6(:,p);
end
% 数据集划分
% % 划分数据集
% 训练集
train_x = c5';
train_y = life';
% 测试集
test_x = L5';
test_y = life1';
% %标准化
method=@mapminmax;
% method=@mapstd;
[train_x,train_ps]=method(train_x);
test_x=method('apply',test_x,train_ps);
[train_y,output_ps]=method(train_y);
test_y=method('apply',test_y,output_ps);
% % % 数据的一个转换,转换成MATLAB的CNN的输入数据形式,是4-D形式的,最后一维就是样本数
trainD=reshape(train_x,[105,1,1,1575]);%训练集输入
testD=reshape(test_x,[105,1,1,315]);%测试集输入
targetD = train_y;%训练集输出
targetD_test = test_y;%测试集输出
%% 神经网络构建
layers = [
imageInputLayer([105 1 1]) %输入层参数设置
convolution2dLayer(3,16,'Padding','same')%卷积层的核大小、数量,填充方式
reluLayer%relu激活函数
% fullyConnectedLayer(34) % 384 全连接层神经元
% fullyConnectedLayer(34) % 384 全连接层神经元
fullyConnectedLayer(1) % 输出层神经元
regressionLayer];%添加回归层,用于计算损失值
% 设置迭代次数 batchsize 学习率啥的
options = trainingOptions('adam', ...
'MaxEpochs',20, ...
'MiniBatchSize',16, ...
'InitialLearnRate',0.0005, ...
'GradientThreshold',1, ...
'Verbose',false,...
'Plots','training-progress',...
'ValidationData',{testD,targetD_test'});
%这里要吐槽一下,输入数据都是最后一维为样本数,偏偏输出要第一维为样本数,所以targetD和targetD_test都取了转置
% 训练
net = trainNetwork(trainD,targetD',layers,options);
% 预测
YPred = predict(net,testD);
% 结果
YPred=double(YPred');%输出是n*1的single型数据,要转换为1*n的double是数据形式
% 反归一化
predict_value=method('reverse',YPred,output_ps);predict_value=double(predict_value);
true_value=method('reverse',targetD_test,output_ps);true_value=double(true_value);
% 模型评估
figure
plot(true_value,'k')
hold on
plot(predict_value,'r')
legend('实际值','CNN预测值')
grid on
set(gcf,'color','white')
set(gca, 'box', 'off')
% set(gca, 'YTick', []); % 清除X轴的记号点
% set(gca, 'XTick', []); % 清除X轴的记号点
% axis off; % 去掉坐标轴
rmse=sqrt(mean((true_value-predict_value).^2));
disp(['根均方差(RMSE):',num2str(rmse)])
mae=mean(abs(true_value-predict_value));
disp(['平均绝对误差(MAE):',num2str(mae)])
mape=mean(abs((true_value-predict_value)./true_value));
disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])
% % %
clearvars -except CNN2
2.预测结果