%% 神经网络验证完整代码
% 注意:运行前需确保工作路径下存在 trained_network.mat 和测试集数据
%% 步骤1:加载已训练网络及参数
load('trained_network.mat'); % 加载训练好的网络
%% 步骤2:加载测试数据集
% 假设测试集文件为test_table.mat,包含同名变量
load('test_table.mat');
X_test = test_table(:, 1:5);
y_test = test_table(:, 6:7);
%% 步骤3:测试集预处理
% 使用训练集的归一化参数(关键!)
X_test_normalized = (X_test - X_min) ./ (X_max - X_min);
% 对y_test应用相同变换
y_test_log = log(y_test + 1e-6); % 相同的小常数
y_test_normalized = (y_test_log - y_min) ./ (y_max - y_min);
%% 步骤4:进行预测
% 输入需要转置为[特征数×样本数]
predictions_test_normalized = net(X_test_normalized');
%% 步骤5:结果反变换
% 反归一化
predictions_test_log = predictions_test_normalized' .* (y_max - y_min) + y_min;
% 指数反变换
predictions_test = exp(predictions_test_log) - 1e-6;
%% 步骤6:计算评估指标
% 误差指标
mse_test = mean((y_test - predictions_test).^2, 1); % 按输出维度计算
mae_test = mean(abs(y_test - predictions_test), 1);
rmse_test = sqrt(mse_test);
% 相关性指标
SS_res = sum((y_test - predictions_test).^2, 1);
SS_tot = sum((y_test - mean(y_test, 1)).^2, 1);
R2_test = 1 - (SS_res ./ SS_tot);
% Pearson相关系数
corr_coef1 = corr(y_test(:,1), predictions_test(:,1));
corr_coef2 = corr(y_test(:,2), predictions_test(:,2));
%% 步骤7:结果显示
fprintf('==== 输出变量1评估结果 ====\n');
fprintf('MSE: %.4f \t MAE: %.4f \t RMSE: %.4f\n', mse_test(1), mae_test(1), rmse_test(1));
fprintf('R²: %.4f \t Pearson: %.4f\n\n', R2_test(1), corr_coef1);
fprintf('==== 输出变量2评估结果 ====\n');
fprintf('MSE: %.4f \t MAE: %.4f \t RMSE: %.4f\n', mse_test(2), mae_test(2), rmse_test(2));
fprintf('R²: %.4f \t Pearson: %.4f\n\n', R2_test(2), corr_coef2);
%% 步骤8:可视化验证
% 预测-实际值对比图
figure('Name','预测效果可视化', 'Position', [100 100 1200 500])
subplot(1,2,1)
plot(y_test(:,1), predictions_test(:,1), 'bo', 'MarkerFaceColor', [0.5 0.7 1])
hold on
plot([min(y_test(:,1)) max(y_test(:,1))], [min(y_test(:,1)) max(y_test(:,1))], 'r--')
title(['输出变量1对比 (R²=', num2str(R2_test(1),'%.3f'), ')'])
xlabel('实际值'), ylabel('预测值')
axis equal tight
grid on
subplot(1,2,2)
plot(y_test(:,2), predictions_test(:,2), 'ro', 'MarkerFaceColor', [1 0.6 0.6])
hold on
plot([min(y_test(:,2)) max(y_test(:,2))], [min(y_test(:,2)) max(y_test(:,2))], 'b--')
title(['输出变量2对比 (R²=', num2str(R2_test(2),'%.3f'), ')'])
xlabel('实际值'), ylabel('预测值')
axis equal tight
grid on
% 误差分布直方图
figure('Name','误差分布', 'Position', [100 100 1000 400])
subplot(1,2,1)
histogram(y_test(:,1) - predictions_test(:,1), 50,...
'FaceColor', [0.3 0.6 1], 'EdgeColor', 'none')
title('输出变量1误差分布')
xlabel('误差值'), ylabel('频次')
subplot(1,2,2)
histogram(y_test(:,2) - predictions_test(:,2), 50,...
'FaceColor', [1 0.4 0.4], 'EdgeColor', 'none')
title('输出变量2误差分布')
xlabel('误差值'), ylabel('频次')
%% 步骤9:过拟合检查
try
% 需要训练时记录训练集误差
disp('==== 过拟合检验 ====')
fprintf('训练集MSE: [%.4f, %.4f]\n', mse_value(1), mse_value(2))
fprintf('测试集MSE: [%.4f, %.4f]\n', mse_test(1), mse_test(2))
catch
warning('缺少训练集误差数据,请确保训练代码保存mse_value变量')
end'table' 类型的操作数不支持运算符 '-'。
出错 test (第 16 行)
X_test_normalized = (X_test - X_min) ./ (X_max - X_min);