예제 #1
0
        private void CalculateDecisionFunctions()
        {
            bool IsClassification = true;
            int  iteration        = 0;

            while (IsClassification && (iteration < MAX_ITERATIONS_COUNT))
            {
                for (int i = 0; i < classes.Count; i++)
                {
                    PerceptronClass  currentClass  = classes[i];
                    PerceptronObject currentWeigth = weigths[i];

                    for (int j = 0; j < currentClass.objects.Count; j++)
                    {
                        PerceptronObject currentObject = currentClass.objects[j];

                        IsClassification = CorrectWeigth(currentObject, currentWeigth, i);
                    }
                }
                iteration++;
            }

            if (iteration == MAX_ITERATIONS_COUNT)
            {
                MessageBox.Show("Количество итераций превысило 1000." + "\n" +
                                "Решаюшие функции, возможно, найдены неправильно.");
            }

            decisionFunctions = weigths;
        }
예제 #2
0
 private void ChangeWeigth(PerceptronObject weigth, PerceptronObject perceptronObject, int sign)
 {
     for (int i = 0; i < weigth.attributes.Count; i++)
     {
         weigth.attributes[i] += sign * perceptronObject.attributes[i];
     }
 }
예제 #3
0
        private bool CorrectWeigth(PerceptronObject currentObject,
                                   PerceptronObject currentWeigth, int classNumber)
        {
            bool result         = false;
            int  objectDecision = ObjectMultiplication(currentWeigth, currentObject);

            for (int i = 0; i < weigths.Count; i++)
            {
                decisions[i] = ObjectMultiplication(weigths[i], currentObject);

                if (i != classNumber)
                {
                    int currentDecision = decisions[i];
                    if (objectDecision <= currentDecision)
                    {
                        ChangeWeigth(weigths[i], currentObject, -1);

                        result = true;
                    }
                }
            }
            if (result)
            {
                ChangeWeigth(currentWeigth, currentObject, 1);
            }

            return(result);
        }
예제 #4
0
        private int ObjectMultiplication(PerceptronObject weigth, PerceptronObject obj)
        {
            int result = 0;

            for (int i = 0; i < weigth.attributes.Count; i++)
            {
                result += weigth.attributes[i] * obj.attributes[i];
            }

            return(result);
        }
예제 #5
0
        private void CreateRandomClasses()
        {
            var rand = new Random();

            for (int i = 0; i < classesCount; i++)
            {
                var currentClass = new PerceptronClass();

                for (int j = 0; j < objectsInClassCount; j++)
                {
                    var currentObject = new PerceptronObject();

                    for (int k = 0; k < attributesCount; k++)
                    {
                        currentObject.attributes.Add(rand.Next(RANDOM) - RANDOM / 2);
                    }

                    currentClass.objects.Add(currentObject);
                }
                classes.Add(currentClass);
            }

            foreach (PerceptronClass perceptronClass in classes)
            {
                var weigth = new PerceptronObject();

                for (int i = 0; i <= attributesCount; i++)
                {
                    weigth.attributes.Add(0);
                }

                weigths.Add(weigth);
                decisions.Add(0);
            }

            foreach (PerceptronClass perceptronClass in classes)
            {
                foreach (PerceptronObject perceptronObject in perceptronClass.objects)
                {
                    perceptronObject.attributes.Add(1);
                }
            }
        }
예제 #6
0
        public int FindClass(PerceptronObject perceptronObject)
        {
            int resultClass = 0;
            int decisionMax;

            perceptronObject.attributes.Add(1);
            decisionMax = ObjectMultiplication(weigths[0], perceptronObject);

            for (int i = 1; i < weigths.Count; i++)
            {
                PerceptronObject weigth = weigths[i];

                if (ObjectMultiplication(weigth, perceptronObject) > decisionMax)
                {
                    decisionMax = ObjectMultiplication(weigth, perceptronObject);
                    resultClass = i;
                }
            }

            return(resultClass + 1);
        }