c++实现bp神经网络分类

该博客介绍了如何使用C++实现BP神经网络进行分类。代码示例展示了从txt文件读取数据集,进行训练和识别的过程。训练部分包括权值和阀值的初始化、误差计算及更新。识别部分则根据训练好的模型对新的数据集进行预测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练样本是m*17的数据集,第一列是标签1和0的分类,16列是属性,存在data.txt中。测试集是n*16的数据集,存在test.txt中。

参考神经网络分类http://blog.csdn.net/luxiaoxun/article/details/7649945改写从txt文件读取数据集。


#include "stdafx.h"
#include<iostream>  
#include<fstream>
#include<cmath>  
using namespace std;

#define  innode 16  //输入结点数  
#define  hidenode 16//隐含结点数  
#define  outnode 1 //输出结点数  

class BpNet
{
public:
    //FILE *fdata;
    //const char*filename;
    void train(const char*filename);//Bp训练  
    //double p[innode];     //输入的一个样本  
    //double t[outnode];    //样本要输出的值
    void recognize(const char*filename, const char*filename1);//Bp识别  filename中数据集,结果保存到filename1
    void writetrain(); //写训练完的权值  
    void readtrain(); //读训练好的权值

    BpNet();
    virtual ~BpNet();

public:
    void init();
    double w[innode][hidenode];//隐含结点权值  
    double w1[hidenode][outnode];//输出结点权值  
    double b1[hidenode];//隐含结点阀值  
    double b2[outnode];//输出结点阀值  

    double rate_w; //权值学习率(输入层-隐含层)  
    double rate_w1;//权值学习率 (隐含层-输出层)  
    double rate_b1;//隐含层阀值学习率  
    double rate_b2;//输出层阀值学习率  

    double e;//误差计算  
    double error;//允许的最大误差  
    double result[outnode];// Bp输出  
};

BpNet::BpNet()
{
    error = 10;
    e = 0.0;

    rate_w = 0.1;  //权值学习率(输入层--隐含层)  
    rate_w1 = 0.1; //权值学习率 (隐含层--输出层)  
    rate_b1 = 0.1; //隐含层阀值学习率  
    rate_b2 = 0.1; //输出层阀值学习率  
}

BpNet::~BpNet()
{

}

void winit(double w[], int n) //权值初始化  
{
    for (int i = 0; i < n; i++)
        w[i] = (2.0*(double)rand() / RAND_MAX) - 1;
        //w[i] = 1 / n;
}

void BpNet::init()
{
    winit((double*)w, innode*hidenode);
    winit((double*)w1, hidenode*outnode);
    winit(b1, hidenode);
    winit(b2, outnode);
}

void BpNet::train(const char *filename)
{
    double pp[hidenode];//隐含结点的校正误差  

    double qq[outnode];//希望输出值与实际输出值的偏差  
    double yd[outnode];//希望输出值  

    double x[innode]; //输入向量  
    double x1[hidenode];//隐含结点状态值  
    double x2[outnode];//输出结点状态值  
    double o1[hidenode];//隐含层激活值  
    double o2[hidenode];//输出层激活值  
    //判断文件读入
    FILE *fp = fopen(filename, "rt");
    if (fp == NULL)//文件打开失败:返回
    {
        exit(1);
    }
    const char *xx2="xx.txt";
    FILE * ff = fopen("xx.txt", "w+");
   &n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值