作为一名长期使用MATLAB进行数据分析的工程师,我发现BP神经网络在实际预测任务中表现非常出色。今天我将分享一套完整的BP神经网络预测代码,从数据准备到模型评估,手把手教你实现多输入单输出的预测模型。
首先确保你的MATLAB版本在R2016b以上,这样能获得最稳定的神经网络工具箱支持。我推荐使用最新版本,因为MathWorks一直在优化神经网络的训练效率。
注意:如果你使用的是教育版MATLAB,某些高级功能可能会受限,但基础神经网络功能完全可用。
代码要求的数据格式非常明确:
例如,如果你要预测房价,前几列可以是面积、房间数、地理位置等特征,最后一列是实际房价。
matlab复制rawData = xlsread('data.xlsx');
inputs = rawData(:,1:end-1)'; % 转置为列排列
outputs = rawData(:,end)';
这里有几个关键点:
xlsread函数直接读取Excel数据matlab复制[inputn, inputSetting] = mapminmax(inputs);
[outputn, outputSetting] = mapminmax(outputs);
归一化是神经网络训练的关键步骤:
经验分享:如果某些特征已经是归一化后的值,可以跳过这步,但统一处理通常效果更好。
matlab复制net = feedforwardnet([10,8]); % 双隐藏层结构
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-5;
net.trainParam.showWindow = true;
网络配置详解:
[10,8]表示两个隐藏层,分别有10和8个神经元matlab复制[net, tr] = train(net, inputn, outputs);
训练过程会自动分为:
训练窗口会显示性能曲线,重点关注验证集的误差是否持续下降。
matlab复制testInput = inputn(:, tr.testInd);
testOutput = outputs(tr.testInd);
predicted = net(testInput);
SS_res = sum((testOutput - predicted).^2);
SS_tot = sum((testOutput - mean(testOutput)).^2);
R2 = 1 - (SS_res / SS_tot);
disp(['测试集R²值:', num2str(R2)])
R²值解读:
matlab复制plot(1:length(testOutput), testOutput, 'bo-', ...
1:length(testOutput), predicted, 'r*--')
legend('实际值','预测值')
xlabel('样本编号')
ylabel('输出值')
title('实际值与预测值对比')
可视化能直观发现:
如果模型表现不佳,可以尝试:
matlab复制function predictValue = customPredict(net, newData, inputSetting, outputSetting)
newDataNormalized = mapminmax('apply', newData', inputSetting);
predNormalized = net(newDataNormalized);
predictValue = mapminmax('reverse', predNormalized, outputSetting);
end
这个自定义预测函数解决了:
matlab复制% 保存训练好的模型
save('trainedNet.mat', 'net', 'inputSetting', 'outputSetting')
% 加载模型
load('trainedNet.mat')
模型保存建议:
经过多个项目的实践,我总结出以下几点经验:
数据质量比算法更重要
网络结构不是越复杂越好
训练过程监控很重要
实际应用中的注意事项
这套代码框架已经在我参与的多个工业预测项目中得到验证,包括设备故障预测、销售预测等场景。根据具体问题调整网络结构和参数后,通常能获得不错的预测精度。