训练样本是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