/* * Calcula distância euclidiana do padrão de entrada */ public double GetEuclideanDistance(DataSetObject pattern) { double dist = 0; if (pattern.GetInputLenght() != weights.Length) { throw new Exception("Incorrect data format!"); } else { double[] inputWeights = pattern.GetInput(); if (weights.Length != inputWeights.Length) { throw new Exception("Incorrect data format!"); } else { for (int x = 0; x < weights.Length; x++) { dist += ((inputWeights[x] - weights[x]) * (inputWeights[x] - weights[x])); } } } return(dist); }
/* * Dado um padrão de entrada e uma variável de aprendizado, atualiza os pesos do neurônio */ public void UpdateWeights(DataSetObject pattern, double learningRate) { if (pattern.GetInputLenght() != weights.Length) { throw new Exception("Incorrect data format!"); } else { double[] inputWeights = pattern.GetInput(); for (int i = 0; i < inputWeights.Length; i++) { weights[i] += learningRate * (inputWeights[i] - weights[i]); } } }
/* * Método de aprendizado da Rede */ public void Learn(DataSet trainingSet) { if (trainingSet.GetOutputSize() != this.outputLayerSize || trainingSet.GetInputSize() != this.inputLayerSize) { throw new Exception("Incorrect data format!"); } else { bool learned = false; List <DataSetObject> patterns = trainingSet.GetList(); for (int it = 1; learned == false && it <= maxIterationNumber; it++) { //VAI APRESENTANDO OS PADRÕES, DE FORMA ALTERNADA, ATÉ QUE TODOS ATINJAM O ERRO REQUERIDO. int allPatternOK = 0; for (int p = 0; p < patterns.Count; p++) { DataSetObject pattern = patterns[p]; //INJETA O PADRÃO NA ENTRADA DA REDE. ApplyPattern(pattern.GetInput()); //PROPAGA DoPropagation(); if (CalculateStopError(pattern.GetTargetOutput()) > this.Error) { DoBackPropagation(pattern.GetTargetOutput()); } else { allPatternOK++; } if (allPatternOK == patterns.Count) { learned = true; } iterationNumber = it; } } } }