Example #1
0
 /// <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;
 }
Example #2
0
        /// <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;
                        }
                    }
                }
            }
        }
Example #3
0
        /// <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;
                        }
                    }
                }
            }
        }