/// <summary> /// Konstruktor für ein Kohonen-Neuron /// </summary> /// <param name="position">Position in der Kohonen-Map</param> /// <param name="WeightVec">Gewichtsvektor, Abbildung von den Inputs auf das Neuron</param> /// <param name="BmNeuron">Aktuelles Bestmatching Neuron, zur Distanzberechnung</param> public Neuron(Vector position, Vector WeightVec, BmNeuron BmNeuron) { n_pos = position; n_record = new SortedList <int, RecordSet>(); n_WeightVec = WeightVec; n_BmNeuron = BmNeuron; }
/// <summary> /// Standard Konstruktor /// </summary> /// <param name="inputs">Anzahl der Eingabe Neuronen</param> /// <param name="netArchitektur">Jedes Array Feld ist entspricht einer Dimension mit der Anzahl der Kohonen-Neuronen</param> /// <param name="maxWeight">Maximales- Initialgewicht, 0..maxWeight</param> public Network(int inputs, int[] netArchitektur, double maxWeight) { int numNeur = 1; for (int i = 0; i < netArchitektur.Length; i++) { numNeur *= netArchitektur[i]; } net_numOfInputs = inputs; net_numOfNeurons = numNeur; //Implemetiert wie im A. Zell, Hilfs-Matrix, damit Randomobjekt nur einmal implementiert werden muss Matrix net_Weights = new Matrix(inputs, numNeur); System.Random rnd = new System.Random(); //Symmetry Breaking for (int i = 0; i < net_Weights.Rows; i++) { for (int j = 0; j < net_Weights.Cols; j++) { net_Weights[i, j] = rnd.NextDouble() * maxWeight; } } net_BmNeuron = new BmNeuron(null); net_Neurons = new List <Neuron>(); //Vektor mit anzahl der Dimensionen net_centerPos = new Vector(netArchitektur.Length); net_maxPos = new Vector(netArchitektur.Length); //max/2 der jeweiligen Dimension for (int i = 0; i < netArchitektur.Length; i++) { net_centerPos[i] = netArchitektur[i] / 2; net_maxPos[i] = netArchitektur[i]; } Vector myCoordVec = Vector.NullVector(netArchitektur.Length); //Neuronen-Struktur Aufbauen for (int i = 0; i < numNeur; i++) { net_Neurons.Add(new Neuron(myCoordVec.Duplicate(), net_Weights.ConvertColToVector(i), net_BmNeuron)); myCoordVec[0] += 1; for (int j = 0; j < net_maxPos.Dimension; j++) { if (net_maxPos[j] - myCoordVec[j] == 0) { myCoordVec[j] = 0; if (i != numNeur - 1) { myCoordVec[j + 1] += 1; } } } } }
/// <summary> /// Circle Konstruktor /// </summary> /// <param name="inputs"></param> /// <param name="numNeur"></param> /// <param name="maxWeight"></param> public Network(int numNeur, double maxWeight_X, double maxWeight_Y) { net_numOfInputs = 2; net_numOfNeurons = numNeur; //Implemetiert wie im A. Zell, Hilfs-Matrix, damit Randomobjekt nur einmal implementiert werden muss Matrix net_Weights = new Matrix(2, numNeur); double rad = (2 * Math.PI) / numNeur; //Symmetry Breaking for (int j = 0; j < numNeur; j++) { net_Weights[0, j] = Math.Cos(rad * j) * maxWeight_X + maxWeight_X; net_Weights[1, j] = Math.Sin(rad * j) * maxWeight_Y + maxWeight_Y; } net_BmNeuron = new BmNeuron(null); net_Neurons = new List <Neuron>(); //Vektor mit anzahl der Dimensionen net_centerPos = new Vector(new int[1] { numNeur / 2 }); net_maxPos = new Vector(new int[1] { numNeur }); Vector myCoordVec = Vector.NullVector(1); //Neuronen-Struktur Aufbauen for (int i = 0; i < numNeur; i++) { net_Neurons.Add(new Neuron(myCoordVec.Duplicate(), net_Weights.ConvertColToVector(i), net_BmNeuron)); myCoordVec[0] += 1; for (int j = 0; j < net_maxPos.Dimension; j++) { if (net_maxPos[j] - myCoordVec[j] == 0) { myCoordVec[j] = 0; if (i != numNeur - 1) { myCoordVec[j + 1] += 1; } } } } }