谈BP算法
以下仅是我个人对BP算法的理解与看法,仅供学术参考
BP算法的来源与背景
1.1943年,心理学家W·Mcculloch和数理逻辑学家W·Pitts在分析、总结神经元基本特性的基础上首先提出神经元的数学模型。此模型也一直沿用至今。
2.到了80年代,美国的物理学家Hopfield于1982年和1984年在美国科学院院刊上发表了两篇关于人工神经网络研究的论文,这也是神经网络最原始的框架,一直到了现在有了完整的神经网络体系。
什么是BP算法
误差逆传播算法(backpropagation BP算法)是应用与神经网络中的一种反向传播的算法,也就是根据所损失函数,求出损失函数关于每一层的权值及偏置项的偏导数,也称为梯度,用该值更新初始的权值和偏置项,一直更新到损失函数取得最小值或是设置的迭代次数完成为止。以此来计算神经网络中的最佳的参数,也就是通过反向传播而得出最优解。
BP算法的应用
可应用于回归预测问题(可以进行数据分析检测、控制等)
可用于类型划分,进行模式分析等问题
BP算法的优点
BP是所有优化问题的基础
BP实质上实现了一个从输入到输出的映射功能,这使得它特别适合于求解内部机制复杂的问题;
能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力;
BP具有一定的推广、概括能力。
算法的基本实现步骤
1.初始化
2.输入训练样本对,计算各层输出
3.计算网络输出误差
4.计算各层误差信号
5.调整各层权值
代码实现
#include "BpNet.h"
#include "Util.h"
using namespace std;
void getInput(double& threshold,int& mostTimes); // 获得输入的阀值和误差大小
vector<Sample> getTrianData(); // 从文件获取训练数据 没获取到直接退出
vector<Sample> getTestData(); // 从文件获取测试数据 没获取到直接退出
void showTest(vector<Sample>testGroup); // 输出测试数据的结果
int main(){
// 准备所有数据
BpNet bpNet;
vector<Sample> sampleGroup = getTrianData();
vector<Sample> testGroup = getTestData();
double threshold; // 设定的阀值
int mostTimes; // 最大训练次数
// 获取输入 并提示数据已经录入
getInput<