Скачиваний:
0
Добавлен:
26.10.2025
Размер:
66.59 Кб
Скачать

2.3. Реализация персептрона по методу Хебба Perceptron.Cs

using System;

namespace PerceptronSymbols

{

// Класс, реализующий отдельный персептрон для распознавания одного символа.

public class Perceptron

{

public double[] Weights; // вектор весов длины 25

public string Symbol; // распознаваемый символ

public double LearningRate = 0.1;

public int InputSize { get; }

public double Threshold = 0; // порог активации

public Perceptron(string symbol, int inputSize)

{

Symbol = symbol;

InputSize = inputSize;

Weights = new double[inputSize];

// Инициализация весов нулями

for (int i = 0; i < inputSize; i++)

Weights[i] = 0;

}

// Функция активации: возвращает 1, если сумма без смещения не меньше порога, иначе 0.

public int Predict(int[] input)

{

double sum = 0;

for (int i = 0; i < InputSize; i++)

sum += Weights[i] * input[i];

return sum >= Threshold ? 1 : 0;

}

/* Обучение персептрона по правилу Хебба.

При ложном отрицательном срабатывании (ожидали 1, получили 0) увеличиваем веса.

При ложноположительном срабатывании (ожидали 0, получили 1) уменьшаем веса.*/

public void Train(int[] input, int target)

{

int output = Predict(input);

if (output != target)

{

if (target == 1 && output == 0) // Ложноотрицательное срабатывание

{

for (int i = 0; i < InputSize; i++)

{

if (input[i] == 1)

Weights[i] += LearningRate;

}

// Обновление смещения удалено

}

else if (target == 0 && output == 1) // Ложноположительное срабатывание

{

for (int i = 0; i < InputSize; i++)

{

if (input[i] == 1)

Weights[i] -= LearningRate;

}

}

}

}

}

}

2.4 Вывод информации OutputInformation.Cs

using System;

namespace PerceptronSymbols

{

public static class OutputInformation

{

// Вывод весовой матрицы персептрона в виде 5x5.

public static void PrintWeights(Perceptron p)

{

Console.WriteLine($"Весовая матрица для символа {p.Symbol}:");

for (int i = 0; i < 5; i++)

{

for (int j = 0; j < 5; j++)

{

Console.Write($"{p.Weights[i * 5 + j],8:F3}");

}

Console.WriteLine();

}

}

// Вывод результата тестового распознавания: матрица ввода, матрица весов (если распознано) и распознанный символ.

public static void PrintTestResult(int[] inputMatrix, Perceptron? p, string recognizedSymbol)

{

Console.WriteLine("\nМатрица ввода:");

PrintMatrix(inputMatrix);

if (p != null)

{

Console.WriteLine($"\nВесовая матрица для символа {p.Symbol}:");

PrintMatrixDouble(p.Weights);

}

else

{

Console.WriteLine("\nНи один персептрон не сработал (распознавание не выполнено).");

}

Console.WriteLine($"\nРаспознанный символ: {recognizedSymbol}");

Console.WriteLine(new string('-', 40));

}

// Метод для печати матрицы (целочисленной) в виде 5x5.

static void PrintMatrix(int[] matrix)

{

for (int i = 0; i < 5; i++)

{

for (int j = 0; j < 5; j++)

{

Console.Write(matrix[i * 5 + j] + " ");

}

Console.WriteLine();

}

}

// Метод для печати матрицы (вещественной) в виде 5x5.

static void PrintMatrixDouble(double[] matrix)

{

for (int i = 0; i < 5; i++)

{

for (int j = 0; j < 5; j++)

{

Console.Write($"{matrix[i * 5 + j],8:F3}");

}

Console.WriteLine();

}

}

}

}