public void Run(double[] data, double[] target) { training = true; // Increment into FuzzyART A ArtA.Vigilance = BasedVigilanceA; ArtA.Run(data); // Increment into FuzzyART B ArtB.Vigilance = BasedVigilanceB; ArtB.Run(target); Process(); }
private void Process() { bool isSuccess = false; while (!isSuccess) { // Select target weight int winnerNeuronIndex = ArtA.WinningNeuronPos; Neuron weightNeuron = null; if (winnerNeuronIndex >= Map.Count) { // Create new weight neuron in mapfield. weightNeuron = Map.Neurons( Map.AddNeuron(FuzzyLogicUtil.MakeDummyNeuron(ArtB.InputSize))); } else { weightNeuron = Map.Neurons(winnerNeuronIndex); } if (training) { // Check vigilance condition double[] artBValues = artB.Output; weightNeuron.Input(artBValues); double normOfSimilarity = weightNeuron.Output(); double testVigilance = normOfSimilarity / FuzzyLogicUtil.Norm(artBValues); if (testVigilance >= Vigilance) { output = FuzzyLogicUtil.Intersect(weightNeuron.Weights.ToArray(), artBValues, ArtB.InputSize); // Modify new mapfield weight. for (int i = 0; i < weightNeuron.Weights.Count; ++i) { weightNeuron.Weights[i] = (Beta * output[i]) + ((1 - Beta) * weightNeuron.Weights[i]); } // Call ArtA to adjust its winner neuron weight. bool isWeightAdjusted = false; if (FastCommitedSlowLearningOption) { if (IsUnCommited(ArtA.F2.Neurons(ArtA.WinningNeuronPos))) { double beta = ArtA.Beta; ArtA.Beta = 1.0; artA.AdjustWeight(); ArtA.Beta = beta; isWeightAdjusted = true; } } if (!isWeightAdjusted) { ArtA.AdjustWeight(); } // Call ArtB to adjust its winner neuron weight. ArtB.AdjustWeight(); isSuccess = true; } else { double newVigilance = ArtA.WinningVigilance + ArtA.Choice; ArtA.Vigilance = newVigilance > 1 ? 1.0 : newVigilance; ArtA.Reset(winnerNeuronIndex); } } else { output = weightNeuron.Weights.ToArray(); isSuccess = true; } } training = false; }