📄 formula.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 + -