Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }