/// <summary>
        /// Add a pattern for training.
        /// </summary>
        /// <param name="pattern">The pattern to add.</param>
        public void AddPattern(double[] pattern)
        {
            for (int i = 0; i < _sumMatrix.Length; i++)
            {
                for (int j = 0; j < _sumMatrix.Length; j++)
                {
                    _sumMatrix[i][j] = 0;
                }
            }

            double n = _network.InputCount;

            for (int i = 0; i < _sumMatrix.Length; i++)
            {
                for (int j = 0; j < _sumMatrix.Length; j++)
                {
                    double t1 = (pattern[i] * pattern[j]) / n;
                    double t2 = (pattern[i] * CalculateLocalField(j, pattern)) / n;
                    double t3 = (pattern[j] * CalculateLocalField(i, pattern)) / n;
                    double d  = t1 - t2 - t3;
                    _sumMatrix[i][j] += d;
                }
            }

            for (int i = 0; i < _sumMatrix.Length; i++)
            {
                for (int j = 0; j < _sumMatrix.Length; j++)
                {
                    _network.SetWeight(i, j, _network.GetWeight(i, j) + _sumMatrix[i][j]);
                }
            }
        }
        /// <summary>
        ///     Add a pattern for training.
        /// </summary>
        /// <param name="pattern">The pattern to add.</param>
        public void AddPattern(double[] pattern)
        {
            for (var i = 0; i < _sumMatrix.Length; i++)
            {
                for (var j = 0; j < _sumMatrix.Length; j++)
                {
                    _sumMatrix[i][j] = 0;
                }
            }

            double n = _network.InputCount;

            for (var i = 0; i < _sumMatrix.Length; i++)
            {
                for (var j = 0; j < _sumMatrix.Length; j++)
                {
                    var t1 = pattern[i] * pattern[j] / n;
                    var t2 = pattern[i] * CalculateLocalField(j, pattern) / n;
                    var t3 = pattern[j] * CalculateLocalField(i, pattern) / n;
                    var d  = t1 - t2 - t3;
                    _sumMatrix[i][j] += d;
                }
            }

            for (var i = 0; i < _sumMatrix.Length; i++)
            {
                for (var j = 0; j < _sumMatrix.Length; j++)
                {
                    _network.SetWeight(i, j, _network.GetWeight(i, j) + _sumMatrix[i][j]);
                }
            }
        }
Exemple #3
0
        /// <summary>
        ///     Learn the added patterns.
        /// </summary>
        public void Learn()
        {
            if (_patternCount == 0)
            {
                throw new AIFHError("Please add a pattern before learning.  Nothing to learn.");
            }

            for (var i = 0; i < _sumMatrix.Length; i++)
            {
                for (var j = 0; j < _sumMatrix.Length; j++)
                {
                    _network.SetWeight(i, j, _sumMatrix[i][j] / _patternCount);
                }
            }
        }