bp神经网络的实现C++

#include <iostream>
#include<stdlib.h>
#include <math.h>
using namespace std;

#define  innode 2
#define  hiddennode 10
#define  outnode 1
#define  sample 4
class bpnet
{
public:
    double w1[hiddennode][innode];
    double w2[outnode][hiddennode];
    double b1[hiddennode];
    double b2[outnode];
    double e;
    double error;
    double lr;
    bpnet();
    ~bpnet();
    void init();
    double randval(double low, double high);
    void initw(double w[], int n);
    void train(double p[sample][innode], double t[sample][outnode]);
    double sigmod(double y);
    double dsigmod(double y);
    void predict(double p[]);
};
double bpnet::dsigmod(double y)
{
    return y*(1 - y);
}
double bpnet::sigmod(double y)
{
    return 1.0 / (1 + exp(-y));
}
double bpnet::randval(double low, double high)
{
    double val;
    val = ((double)rand() / (double)RAND_MAX)*(high - low) + low;
    return val;
}
void bpnet::initw(double w[], int n)
{
    for (int i = 0; i < n; i++)
    {
        w[i] = randval(-0.01, 0.01);
    }
}
void bpnet::init()
{
    initw((double*)w1, hiddennode*innode);
    initw((double*)w2, hiddennode*outnode);
    initw(b1, hiddennode);
    initw(b2, outnode);
}
void bpnet::train(double p[sample][innode], double t[sample][outnode])
{
    double hiddenerr[hiddennode];
    double outerr[outnode];
    double hiddenin[hiddennode];
    double hiddenout[hiddennode];
    double outin[outnode];
    double outout[outnode];
    double x[innode];
    double d[outnode];
    for (int k = 0; k < sample; k++)
    {
        for (int i = 0; i < innode; i++)
        {
            x[i] = p[k][i];
        }
        for (int i = 0; i < outnode; i++)
        {
            d[i] = t[k][i];
        }
        for (int i = 0; i < hiddennode; i++)
        {
            hiddenin[i] = 0.0;
            for (int j = 0; j < innode; j++)
            {
                hiddenin[i] += w1[i][j] * x[j];
            }
            hiddenout[i] = sigmod(hiddenin[i] + b1[i]);
        }
        for (int i = 0; i < outnode; i++)
        {
            outin[i] = 0.0;
            for (int j = 0; j < hiddennode; j++)
            {
                outin[i] += w2[i][j] * hiddenout[j];
            }
            outout[i] = sigmod(outin[i] + b2[i]);
        }
        for (int i = 0; i < outnode; i++)
        {
            outerr[i] = (d[i] - outout[i])*dsigmod(outout[i]);
            for (int j = 0; j < hiddennode; j++)
            {
                w2[i][j] += lr*outerr[i] * hiddenout[j];
            }
        }
        for (int i = 0; i < hiddennode; i++)
        {
            hiddenerr[i] = 0.0;
            for (int j = 0; j < outnode; j++)
            {
                hiddenerr[i] += w2[j][i] * outerr[j];
            }
            hiddenerr[i] = hiddenerr[i] * dsigmod(hiddenout[i]);
            for (int j = 0; j < innode; j++)
            {
                w1[i][j] += lr*hiddenerr[i] * x[j];
            }
        }
        for (int i = 0; i < outnode; i++)
        {
            e += pow((d[i] - outout[i]), 2);
        }
        error = e / 2.0;
        for (int i = 0; i < outnode; i++)
        {
            b2[i]=lr*outerr[i];
        }
        for (int i = 0; i < hiddennode; i++)
        {
            b1[i] =hiddenerr[i] * lr;
        }
    }
}
void bpnet::predict(double p[])
{
    double hiddenin[hiddennode];
    double hiddenout[hiddennode];
    double outin[outnode];
    double outout[outnode];
    double x[innode];
    for (int i = 0; i < innode; i++)
    {
        x[i] = p[i];
    }
    for (int i = 0; i < hiddennode; i++)
    {
        hiddenin[i] = 0.0;
        for (int j = 0; j < innode; j++)
        {
            hiddenin[i] += w1[i][j] * x[j];
        }
        hiddenout[i] = sigmod(hiddenin[i] + b1[i]);
    }
    for (int i = 0; i < outnode; i++)
    {
        outin[i] = 0.0;
        for (int j = 0; j < hiddennode; j++)
        {
            outin[i] += w2[i][j] * hiddenout[j];
        }
        outout[i] = sigmod(outin[i] + b2[i]);
    }
    for (int i = 0; i < outnode; i++)
    {
        cout << "the prediction is"<<outout[i] << endl;
    }
}
bpnet::bpnet()
{
    e = 0.0;
    error = 1.0;
    lr = 0.4;
}
bpnet::~bpnet()
{}

double X[sample][innode] = {
    {1,1},
    {1,0},
    {0,1},
    {0,0}
};
double Y[sample][outnode] = {
    {1},
    {0},
    {0},
    {1}
};
int main()
{
    bpnet bp;
    bp.init();
    int times = 0;
    while (bp.error > 0.001&&times <10000)
    {
        bp.e = 0.0;
        times++;
        bp.train(X, Y);
    }
    double m[2] = { 0,1 };
    bp.predict(m);
    return 0;
}
时间: 2024-11-08 21:08:10

bp神经网络的实现C++的相关文章

BP神经网络

BP 神经网络中的 BP 为 Back  Propagation 的简写,最早它是由Rumelhart.McCelland等科学家于 1986 年提出来的,Rumelhart 并在Nature 上发表了一篇非常著名的文章 <Learning representations by back-propagating errors> .随着时代的迁移,BP神经网络理论不断的得到改进.更新,现在无疑已成为了应用最为广泛的神经网络模型之一.让我们一起来探索下 BP神经网络最初的 基本模型和概念! 从神经

【转载】BP神经网络

原文地址:http://blog.csdn.net/acdreamers/article/details/44657439 今天来讲BP神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识别,分类,数据压缩,数据 挖掘等领域.接下来介绍BP神经网络的原理及实现. Contents   1. BP神经网络的认识   2. 隐含层的选取   3. 正向传递子过程   4. 反向传递子过程   5. BP神经网络的注意点   6. BP神经网络的C++实现 1. BP神经网络的认识    

遗传算法优化BP神经网络——非线性函数拟合

遗传算法基本的操作分为: 1.选择操作 2.交叉操作 3.变异操作 遗传算法的基本要素包括染色体编码方法.适应度函数.遗传操作和运行参数. 遗传算法优化BP神经网络算法流程如图3-4所示:

C#实现的bp神经网络并应用于综合评价

由于课程设计选的题目是基于神经网络的综合评价,利用暑假时间用C#实现的bp神经网络.其中用到的_Matrix类是C#实现的矩阵类http://blog.csdn.net/lanqiuchaoren/article/details/37738665.此bp神经网络包含1个隐藏层,其中输入层,隐藏层,输出层个数都可以根据需要更改. 具体bp神经网络代码如下 BP类: using Matrix_Mul; using Excel = Microsoft.Office.Interop.Excel; usi

题外:分类篇(音乐风格分类)基于BP神经网络

语音特征参数MFCC的提取及识别 (2012-09-07 20:24:03) 转载▼ 耳蜗实质上相当于一个滤波器组,耳蜗的滤波作用是在对数频率尺度上进行的,在1000HZ下,人耳的感知能力与频率成线性关系:而在1000HZ以上,人耳的感知能力与频率不构成线性关系,而更偏向于对数关系,这就使得人耳对低频信号比高频信号更敏感.Mel频率的提出是为了方便人耳对不同频率语音的感知特性的研究.频率与Mel频率的转换公式为: MFCC在一定程度上模拟了人耳对语音的处理特点,应用了人耳听觉感知方面的研究成果,

再看BP神经网络

权值 BP网络中 w(1,1)  表示第 1 个输入矢量在输入层和隐含层中的权值.                w(1,2)  表示第 2 个输入矢量在输入层和隐含层中的权值.             ...w(1, j )  表示第 j 个输入矢量在输入层和隐含层中的权值. w(2,1) :第 1 个输入矢量在隐含层和输出层中的权值....   若w( i , j ) 中i > 2,则有多个隐含层. 1. net.IW 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构.

BP神经网络推导过程详解

BP算法是一种最有效的多层神经网络学习方法,其主要特点是信号前向传递,而误差后向传播,通过不断调节网络权重值,使得网络的最终输出与期望输出尽可能接近,以达到训练的目的. 一.多层神经网络结构及其描述 下图为一典型的多层神经网络. 通常一个多层神经网络由L层神经元组成,其中:第1层称为输入层,最后一层(第L层)被称为输出层,其它各层均被称为隐含层(第2层~第L-1层). 令输入向量为: \[ \vec x = [x_1 \quad x_2 \quad \ldots \quad x_i \quad

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,

通俗讲解BP神经网络

BP(backward propogation)神经网络是广泛使用的一种神经网络.要我说,神经网络就是一种高端的插值技术.相应比较好的实现教程有: Matlab工具箱版本(使用简便,但是不适用于理解原理):漫谈ANN(2):BP神经网络: Matlab原理实现(根据原理实现的版本,未使用神经网络工具箱):简单易学的机器学习算法--神经网络之BP神经网络: C++原理实现(根据原理实现):BP神经网络原理及C++实战 三篇文章,第2.3篇适用于理解原理.详细的数学推导已经在里面了,就不赘述了.下面

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计