⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formula.h

📁 用BP算法实现数字识别功能
💻 H
字号:
#ifndef __FORMULA_INCLUDE
#define __FORMULA_INCLUDE

#include <windows.h>
#include <complex>
#include <vector>

#define BTA 1.2
//sigmoid函数
#define SIGMOID_FUNC(u, s) (BTA/(1.0+std::exp(-1.0*DB_COMPLEX( u*s )).real()))
//#define SIGMOID_FUNC(u, s) (1.0/(1.0+exp(-1.0*u*s)))
//阶跃函数
#define STEP_FUNC(u) ( u>=0 ? 1:0 )
//输出层的梯度公式
#define OUTPUT_LAYER_GRADS(r,t) (formula_type == STEP_TYPE ? (t-r) : (r*(BTA-r)*(t-r)))
//隐层的梯度公式
#define HIDE_LAYER_GRADS(r,sum) (formula_type == STEP_TYPE ? (sum) : (r*(BTA-r)*sum))
//误差公式
#define DIFF_VALUE(r,t) (0.5*(t-r)*(t-r))
//权重改变公式
#define DIFF_WEIGHT(steady,diffw,step,grads,r) (steady*diffw + step*grads*r)
//缺省参数
#define DEFAULT_STEADY     (double)0.2   //稳定系数
#define DEFAULT_STEP       (double)0.6   //缺省步长
#define DEFAULT_SLOPE      (double)0.5   //缺省斜率

class CNerve_cell;
//公式类
class CFormula
{
public:
	typedef double (PASCAL *PFN_CUSTOM_FORMULA)(double x, void *);  //自定义公式回调函数
	typedef std::complex < double > DB_COMPLEX;
	enum {STEP_TYPE = 0, SIGMOID_TYPE, CUSTOM_TYPE};                //采用公式类型
public:
	CFormula()
	{
		db_steady    = DEFAULT_STEADY;
		db_step      = DEFAULT_STEP;
		db_slope     = DEFAULT_SLOPE;
		formula_type = SIGMOID_TYPE;

		formula_ptr  = this;
	}
	//计算误差
	static double Ask_output_diff ( double dbreal, double dbteacher )
	{
		return DIFF_VALUE(dbreal, dbteacher);
	}
	static CFormula * Instance ()
	{
		return formula_ptr;
	}
	//求权重差值
	double Ask_diff_weight ( double dbprew, double dbgrads, double dbreal)
	{
		return DIFF_WEIGHT(db_steady, dbprew, db_step, dbgrads, dbreal);
	}
	//根据F函数计算输出
	double Ask_result ( double u )
	{
		double dbval = 0.0;

		switch (formula_type)
		{
		case STEP_TYPE:
			dbval = STEP_FUNC(u);                //阶跃函数
			break;
		case SIGMOID_TYPE:
			dbval = SIGMOID_FUNC(u, db_slope);   //sigmoid函数
			break;
		case CUSTOM_TYPE:
			if (pfn_formula)
				dbval = pfn_formula (u, p_void);  //其他自定义函数
			break;
		default:
			break;
		}
		return dbval;
	}
	//初始化
	void Initialize ( double dbstep = DEFAULT_STEP,
		double dbsteady = DEFAULT_STEADY,
		double dbslope=DEFAULT_SLOPE,
		int    type=SIGMOID_TYPE,
		PFN_CUSTOM_FORMULA pfn=NULL,
		void *p = NULL );
	
	//求梯度
	double Ask_output_grads ( double dbreal, double dbteacher);
	double Ask_hide_grads (CNerve_cell * p_hide, std::vector<CNerve_cell*> vec);
private:
	static    CFormula * formula_ptr;

	double    db_steady;   //稳定系数
	double    db_step;     //步长
	double    db_slope;    //斜率
	int       formula_type;     //公式类型

	PFN_CUSTOM_FORMULA pfn_formula; //自定义公式
	void *    p_void;
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -