/// <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]); } } }
/// <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); } } }