/// <summary> /// 后向传播算法 /// </summary> /// <param name="targets"></param> /// <param name="N"></param> /// <param name="M"></param> /// <returns></returns> public double BackPropagate(double[] targets, double N, double M) { //计算输出层 deltas double[] output_deltas = new double[this._no]; for (int k = 0; k < this._no; k++) { double oerror = targets[k] - this._ao[k]; output_deltas[k] = oerror * MathFunction.DerivativeSigmoid(this._ao[k]); } //更新输出层权值 for (int j = 0; j < this._nh; j++) { for (int k = 0; k < this._no; k++) { double change = output_deltas[k] * this._ah[j]; this._wo[j][k] += N * change + M * this._co[j][k]; this._co[j][k] = change; } } //计算隐藏层 deltas double[] hidden_deltas = new double[this._nh]; for (int j = 0; j < this._nh; j++) { double herror = 0.0; for (int k = 0; k < this._no; k++) { herror += output_deltas[k] * this._wo[j][k]; } hidden_deltas[j] = herror * MathFunction.DerivativeSigmoid(this._ah[j]); } //更新输入层权值 for (int i = 0; i < this._ni; i++) { for (int j = 0; j < this._nh; j++) { double change = hidden_deltas[j] * this._ai[i]; this._wi[i][j] += N * change + M * this._ci[i][j]; this._ci[i][j] = change; } } //计算误差平方和 double error = 0.0; for (int k = 0; k < targets.Length; k++) { error = 0.5 * Math.Pow((targets[k] - this._ao[k]), 2); } return(error); }
/// <summary> /// 构造神经网络 /// </summary> /// <param name="ni">输入单元数量</param> /// <param name="nh">隐藏单元数量</param> /// <param name="no">输出单元数量</param> public void Init(int ni, int nh, int no) { //各层单元数量 this._ni = ni + 1; this._nh = nh; this._no = no; //激活值(输出值) this._ai = new double[this._ni]; this._ah = new double[this._nh]; this._ao = new double[this._no]; //创建权重矩阵 this._wi = MathFunction.MakeMatrix(this._ni, this._nh); this._wo = MathFunction.MakeMatrix(this._nh, this._no); //将权重矩阵随机化 MathFunction.RandomizeMatrix(this._wi); MathFunction.RandomizeMatrix(this._wo, -1, 1); //权重矩阵的上次梯度 this._ci = MathFunction.MakeMatrix(this._ni, this._nh); this._co = MathFunction.MakeMatrix(this._nh, this._no); }