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; }
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]; } }
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); }
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); }
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); } } }
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); }