• 神经网络的偏差和方差,神经网络均方误差公式


    1、你好,想跟你要一下神经网络的代码,看到你之前解答过问题,谢谢了

    // BP.cpp : Defines the entry point for the console application.
    //该程序实现神经网络的BP算法,输入节点数,输出节点数,隐层数,隐层节点数任意,由用户决定。
    //其中隐层数指的是总共层数包含输出层,比如说异或算法为2层,第一层节点数为2,第二层也即输出层节点数为1,输入点数为2 。
    //但是该程序对异或算法实现并不理想,对多层多节点的神经网络有较好的结果
    #include "stdafx.h"
    #include "iostream.h"
    #include
    #include
    #include
    #include
    #include "stdio.h "
    #define MAXCOUNT 1e5 //迭代训练次数上限 1的10的正5次幂
    //精度0.001的随机浮点数,范围在-0.5——0.5
    //rand()取0到32767,最大为2147483647. %模运算表示余数为0到1000之间,所以乘上浮点数0。001f就是0-1之间的数,再减去0.5,就是-0.5到+0.5
    float randf()
    {
    return (float)((rand() % 1001) * 0.001f-0.5);
    }
    //高斯随机数产生函数
    //这样生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:X = X * V + E;
    double gaussrand()
    {
    static double V1, V2, S;
    static int phase = 0;
    double X;
    if(phase == 0) {
    do {
    double U1 = (double)rand() / RAND_MAX;
    double U2 = (double)rand() / RAND_MAX;
    V1 = 2 * U1 - 1;
    V2 = 2 * U2 - 1;
    S = V1 * V1 + V2 * V2;
    } while(S >= 1 || S == 0);
    X = V1 * sqrt(-2 * log(S) / S);
    } else
    X = V2 * sqrt(-2 * log(S) / S );
    phase = 1 - phase;
    return X;
    }
    //定义一个多层前向BP网络
    class BP
    {
    public:
    double ***p;//记录所有的权值
    double ***ddp;//记录所有的权值增量
    int *pnode;//记录每一层的节点数
    double **pnodey;//记录每组每一层的节点的输出值
    double **ddlj;//记录每组每一层的节点的ddlj
    double **pX; //记录输入样本
    double **pY; //记录输入理想输出值
    int Sidenum; //隐层数目
    int Inputnodenum;
    int outputnodenum;
    int yangbenzushu;
    BP()
    {
    Sidenum=0;
    Inputnodenum=0;
    outputnodenum=0;
    yangbenzushu=0;
    }
    ~BP()
    {
    for(int m=0;m {
    for(int n=0;n {
    delete[] p[m][n];
    delete[] ddp[m][n];
    }
    delete[] p[m];
    delete[] ddp[m];
    }
    delete[] p;
    delete[] ddp;
    p=NULL;
    ddp=NULL;
    if(p==NULL)
    delete [] pnode;
    for(int M=0;M {
    delete[] pnodey[M];
    delete[] ddlj[M];
    }
    delete[] pnodey;
    delete[] ddlj;
    pnodey=NULL;
    ddlj=NULL;
    }
    //完成所有权值的初始化
    void getW(int sidenum,int inputnodenum,int outputnodenum1,int yangbenzu)
    {
    Sidenum=sidenum;
    yangbenzushu= yangbenzu;//样本组数目
    Inputnodenum=inputnodenum;
    outputnodenum=outputnodenum1;
    p=new double **[sidenum];//记录所有权值
    ddp=new double **[sidenum];//权值增量
    pnode=new int [sidenum+1];//包含输入层,输出层每一层的节点数.
    for(int i=0;i {
    int data=0;
    cout<<"请输入第"< cin>>data;
    pnode[i]=data;
    }
    for (int j=0;j {
    p[j]=new double* [pnode[j+1]]; //首先P[j]层有多少个节点,就有多少个指针,每个指针指向一个权值数组.因为p[j]是二级指针,存放的是某指针的地址,某指针可以指向一维数组.
    ddp[j]=new double*[pnode[j+1]];//同上
    for (int k=0;k {
    ddp[j][k]=new double[pnode[j]+1];//表示第j层的第k个节点指向的是一个数组,这个数组里存的是这个节点的权值.
    p[j][k]=new double[pnode[j]+1];
    for (int t=0;t {
    ddp[j][k][t]=0;//每一层的权值初始化为0 表示的是第j层的第k个节点,第t个输入的输入权值.
    if(t==0)p[j][k][t]=-fabs(randf());//每一层的阀值初始化 第0个元素.
    else p[j][k][t]=randf();//每一层的权值初始化
    }
    }
    }
    //为记录每一层的节点的输出值和ddlj的指针开辟内存
    pnodey=new double *[Sidenum]; //一共有Sidenum层.
    ddlj=new double *[Sidenum];
    for(int p=0;p {
    pnodey[p] = new double [pnode[p+1]+1];//每层一共有节点数+1个输出
    ddlj[p]=new double [pnode[p+1]];// 这个是做什么的??
    pnodey[p][0]=1;//每组每层的首值为1,这个值是为了与阈值相乘,这也是为什么会有上面+1个输出
    }
    }
    /**********************/
    //每个节点输出函数
    double fas(double s)
    {
    double t;
    t=1.0/(exp(-s)+1);
    return t;
    }
    /************************************************/
    //该函数用来记录样本值和理想输出值
    void INPUT(int yangbenzushu1 )
    {
    pY=new double*[yangbenzushu1];//yangbenzushu1数量个理想输出
    pX=new double*[yangbenzushu1];//yangbenzushu1数量个样本
    for(int yu=0;yu {
    pX[yu]=new double[Inputnodenum+1];//每个样本的维数是输入点个数+1
    pY[yu]=new double[outputnodenum+1];//输出的维数也是输出点个数+1
    }
    //每组样本的首值赋为1, 这样就可以使下标对应的比较好
    for(int yu1=0;yu1 {
    pX[yu1][0]=1;
    pY[yu1][0]=1;
    }
    cout<<"请输入样本输入值"< for(int yuy=0;yuy for(int yy=1;yy<=Inputnodenum;yy++)
    {
    if(yy==Inputnodenum) cout< cout<<"X["< cin>>pX[yuy][yy];
    }
    cout<<"请输入样本理想输出值"< for(int yuy1=0;yuy1 for(int yy1=1;yy1<=outputnoden

  • 相关阅读:
    接口测试——HttpClient
    数据结构从入门到精通——栈
    (七) ES6 新特性 —— 生成器
    维态思(上海)环保科技有限公司 | 2024全国水科技大会暨技术装备成果展览会
    STM32基于Flash对结构体读写暨再认识结构体内存分配
    医药资讯网都有哪些?最值得推荐的有哪些?
    Navicat连接openGauss数据库报错
    如何实现一个动态添加待办及完成功能
    Java——list的四种遍历
    自组织是管理者和成员的双向奔赴
  • 原文地址:https://blog.csdn.net/aifans_bert/article/details/127460487