
一句话介绍: 这套程序用 10 个 BP 神经网络分别学习同一个非线性预测问题,再根据各网络在训练集上的误差表现分配组合权重,最终把多个弱预测器加权融合成一个强预测器,并用测试数据比较预测结果和误差。
单个 BP 神经网络能够拟合非线性关系,但训练结果会受到随机初始化、训练过程和样本分布影响。即使网络结构完全相同,重复训练出来的模型也可能存在差异。
这个程序采用的思路是:
数据 → 训练多个 BP 网络 → 评价每个网络表现 → 调整样本权重 → 计算模型权重 → 加权融合 → 强预测结果
也就是说,它不是把全部希望放在一个 BP 网络上,而是让多个网络共同完成预测。
1. 当前程序实际预测什么?
主程序为 Bp_Ada_Fore.m,读取 data1.mat 中的 input 和 output。
当前数据实际情况如下:
项目 | 当前数据 |
|---|---|
样本总数 | 2000 |
输入维数 | 2 |
输出维数 | 1 |
输入范围 | 两个输入均约为 -5~5 |
训练样本 | 1900 |
测试样本 | 100 |
对 data1.mat 实际检查可以确认,这 2000 组数据严格满足:
y = x₁² + x₂²
也就是说,程序需要根据两个输入变量 x₁、x₂,预测它们平方和对应的输出 y。
这是一个明显的非线性关系,因此很适合用来演示 BP 神经网络的非线性拟合能力,以及多个 BP 网络组合后的集成预测效果。
2. 工程结构很简单
文件 | 作用 |
| 主程序,完成数据划分、BP 训练、权重计算、强预测器融合和绘图 |
| 当前程序实际使用的 2000 组输入输出数据 |
工程中还有 data.mat 和自动保存文件 Bp_Ada_Fore.asv,但正式脚本加载的是 data1.mat,因此不需要逐个展开。
3. 程序完整处理流程
读取数据 → 随机划分训练/测试集 → 归一化 → 训练 10 个 BP 网络 → 计算训练误差 → 更新样本权重 → 计算模型权重 → 加权得到强预测器 → 测试集对比
这套程序可以分成两个核心层次:
BP 神经网络: 负责完成单个非线性预测;
AdaBoost 式组合: 负责根据误差决定多个 BP 网络在最终结果中各占多大权重。
4. 第一步:随机划分训练集和测试集
程序先随机打乱 2000 个样本,再取:前 1900 个作为训练集;后 100 个作为测试集。因此训练集约占 95%,测试集约占 5%。
需要注意,源码没有固定随机种子,所以每次重新运行时:
训练样本和测试样本可能不同;BP 网络初始权值也可能不同;
最终预测曲线和误差数值可能略有变化。
5. 第二步:为什么要先归一化?
程序使用 mapminmax 对训练输入和训练输出进行归一化。
两个输入 x₁、x₂ 与输出 y 的数值范围并不相同。如果直接把不同尺度的数据送入 BP 网络,训练过程可能更容易受到大数值变量影响。
归一化的目的就是让数据进入更接近的数值范围,使梯度训练更稳定。
测试数据不会重新计算一套归一化参数,而是继续使用训练集得到的映射参数,这样训练和测试处在同一尺度下。
6. 单个 BP 弱预测器是怎么工作的?
程序一共训练 K = 10 个 BP 网络。
每个网络:1 个隐藏层;隐藏层节点数为 5;最大训练轮数为 20;学习率为 0.1。
单个 BP 网络可以简单理解为一个非线性函数:
ŷ = f(x; W, b)
其中:
x:输入变量;
W、b:训练得到的网络权值和偏置;
ŷ:预测结果。
对于当前数据,网络学习的目标就是逼近:
y = x₁² + x₂²
10 个网络虽然结构相同,但由于初始化具有随机性,训练后一般不会得到完全相同的参数,因此可以形成多个略有差异的弱预测器。
7. 程序怎么判断一个 BP 网络表现好不好?
每个网络训练完成后,程序会先对 1900 个训练样本进行预测。
单个样本预测误差可以写成:
eᵢⱼ = yⱼ - ŷᵢⱼ
其中:
yⱼ:第 j 个训练样本真实值;
ŷᵢⱼ:第 i 个弱预测器对第 j 个样本的预测;
eᵢⱼ:预测误差。
源码把:
|eᵢⱼ| > 0.2
视为“较大误差”。
第 i 个弱预测器的加权错误量可以概括成:
Eᵢ = Σⱼ Dᵢⱼ · I(|eᵢⱼ| > 0.2)
其中:
Dᵢⱼ:当前第 j 个样本的权重;
I(条件):条件成立记为 1,否则记为 0;
Eᵢ:当前弱预测器在高权重样本上的累计错误量。
简单来说:
某个网络如果在很多重要样本上预测误差超过 0.2,那么它的 Eᵢ 就会更大。
8. 为什么还要给训练样本分配权重?
程序开始时让所有训练样本权重相同:
D₁ⱼ = 1 / N
其中 N = 1900。
如果当前 BP 网络对某个样本的绝对误差超过 0.2,程序会把该样本权重乘以 1.1,再对所有样本权重重新归一化。
这体现的是 Boosting 的一个核心思想:
已经预测得比较好的样本不需要一直占据全部注意力,当前难以预测的样本应该获得更多关注。
不过当前源码的实现和标准 AdaBoost 还有重要区别,后文会单独说明。
9. 多个弱预测器怎样组成强预测器?
程序根据每个弱预测器的错误量 Eᵢ 计算权重:
aᵢ = 0.5 × exp(-|Eᵢ|)
然后再把所有 aᵢ 归一化,得到最终模型权重 αᵢ,使:Σᵢ αᵢ = 1
最终强预测器为:
ŷ_strong = Σᵢ αᵢ ŷᵢ
其中:
ŷᵢ:第 i 个 BP 网络的测试预测值;
αᵢ:该网络在最终组合中的权重;
ŷ_strong:强预测器输出。
因此最终结果不是从 10 个网络中挑一个,而是:
把 10 个网络的预测结果按不同权重组合起来。
错误量较小的网络通常获得更大的组合权重,错误量较大的网络贡献会降低。
10. 为什么多个 BP 网络组合可能比单个 BP 更合适?
单个 BP 网络训练结果受到初始权值影响。如果只使用一个模型,一次较差初始化可能直接影响最终预测。
训练多个网络后,强预测结果不再完全依赖某一个网络,有助于降低单模型偶然性。
一个 BP 网络可能在某些区域预测较好、在另一些区域误差较大;另一个网络可能表现不同。
把多个预测结果组合后,一个网络的局部偏差有机会被其他网络部分抵消。
普通平均意味着 10 个网络无论好坏都占相同权重。
当前程序先计算每个网络的 Eᵢ,再得到 αᵢ,因此模型表现会影响它最终“说话的分量”。
这比单纯平均多了一层:先评价模型 → 再决定模型贡献
程序对误差超过 0.2 的样本增加权重,说明算法设计者希望后续过程更加重视当前预测不好的样本。
这正是 Boosting 思想最值得理解的地方之一。
11. 为什么不只训练一个更大的 BP 网络?
增加隐藏节点数确实可能提升单个网络的拟合能力,但它仍然只有一次随机训练结果。
当前方法采用另一种思路:
一个复杂模型 与 多个相对简单模型集成
两者各有特点:
单个较大 BP | 多个 BP 集成 |
依靠一个模型完成全部预测 | 多个模型共同预测 |
单次训练结果影响更大 | 可降低单模型偶然性 |
增加节点提高模型容量 | 通过模型多样性增加组合能力 |
结构更集中 | 需要重复训练多个网络 |
因此,BP-AdaBoost 式方法的价值不只是“把网络做得更大”,而是通过多个模型共同决策。
12. 当前程序适合用在哪里?
当前 Demo 学习的是 y = x₁² + x₂²。类似方法也可以用于其他输入和连续输出之间存在非线性关系的回归问题。
例如根据多个测量变量预测温度、压力、质量指标、性能参数等连续数值,可以把 BP 网络作为基础回归模型,再研究集成是否能提高稳定性。
程序结构简单,可以直接看到数据归一化、网络训练、预测和反归一化的完整流程。
它把:弱预测器 → 样本权重 → 模型误差 → 模型权重 → 强预测器
放在同一个脚本中,非常适合用来理解 Boosting 的基本思想。
13. 程序本身有哪些优势?
流程完整: 从数据划分、归一化、BP 训练到最终集成都自动完成。
结构直观: 主要逻辑集中在一个主程序中,容易阅读和修改。
参数容易实验: 网络数量、隐藏节点、训练轮数、学习率和误差阈值都比较集中。
结果有对比: 不只画强预测结果,还比较弱预测器平均结果和误差变化。
适合学习: 可以同时理解 BP 回归和 Boosting 集成思想。
14. 怎么运行?
使用过程比较简单:
把 Bp_Ada_Fore.m 和 data1.mat 放在 MATLAB 当前工作目录;
运行 Bp_Ada_Fore.m;
程序随机划分 1900 个训练样本和 100 个测试样本;
自动训练 10 个 BP 网络;
自动计算各网络权重并生成强预测器;
查看 3 张结果图。
程序使用 newff、train、sim 和 mapminmax 等神经网络函数,因此需要相应的 MATLAB 神经网络工具箱支持。
15. 哪些参数最值得修改?
参数 | 默认值 | 主要影响 |
弱预测器数量 K | 10 | 参与集成的 BP 网络数量 |
隐藏节点 | 5 | 单个网络的拟合能力 |
最大训练轮数 | 20 | 单个 BP 的训练程度 |
学习率 | 0.1 | 网络权值更新速度 |
大误差阈值 | 0.2 | 哪些样本被认为是困难样本 |
困难样本权重倍率 | 1.1 | 错误样本权重提高多少 |
训练样本数 | 1900 | 用于网络训练的数据量 |
测试样本数 | 100 | 用于观察泛化预测的数据量 |
如果要做实验,建议每次只改变一个参数,方便判断结果变化来自哪里。
16. 当前程序和“标准 AdaBoost”有一个重要区别
这是这份源码最值得注意的地方。
程序确实在每轮训练后更新了样本权重 D:误差较大的样本权重会增加。
但是下一轮训练 BP 网络时,仍然直接使用相同的 inputn 和 outputn。
也就是说:
新的 D 并没有真正参与下一轮 BP 网络的训练过程,也没有用于按权重重新抽样。
因此当前程序中的样本权重主要影响:
当前弱预测器的错误量 Eᵢ;
进一步影响最终模型权重 αᵢ。
它没有像标准 AdaBoost 那样,让下一轮弱学习器真正更加偏向高权重困难样本。
所以更准确的定位是:
一个带有 AdaBoost 式样本误差加权和模型加权思想的 BP 集成预测程序。
而不是严格意义上完整复现标准 AdaBoost 回归算法。
17. 当前弱预测器权重公式也是自定义设计
经典 AdaBoost 分类和 AdaBoost.R2 回归都有各自标准化程度较高的权重更新方式。
当前代码使用:
aᵢ = 0.5 × exp(-|Eᵢ|)
其作用很容易理解:Eᵢ 越小 → aᵢ 越大;Eᵢ 越大 → aᵢ 越小。
因此思想上符合“表现好的模型占更大权重”。
但这个具体公式属于当前源码的自定义组合规则,所以在介绍时应该区分:
AdaBoost 一般思想: 关注困难样本并组合多个弱学习器;
当前程序实现: 误差阈值 0.2、困难样本权重乘 1.1、模型权重采用 0.5 × exp(-|Eᵢ|)。
18. 一句话看懂这个项目
这是一个 MATLAB BP 神经网络集成回归程序:它从 2000 组二维非线性数据中随机取 1900 组训练样本,训练 10 个具有 5 个隐藏节点的 BP 弱预测器,再根据各网络的训练误差分配组合权重,最终通过加权融合得到强预测器。当前示例实际学习的是 y = x₁² + x₂²,适合用来理解 BP 非线性拟合、困难样本加权和多模型集成的基本思想。