Всем привет, читая много статей, и смотря много видео я смогу реализовать персептрон, но почему-то он не может обучится делать мой перечень условий и функция обучения просто бесконечно учится и у меня есть пару вопросов о том что я реализовал.
Вот моя модель персептрона думаю знающие сразу поймет что к чему.
class Perceptron
{
public Input[] Inputs { get; private set; }
public double OutPut { get; private set; }
public Perceptron(int inputCount)
{
var r = new Random();
Inputs = new Input[inputCount];
for (int i = 0; i < Inputs.Length; i++)
{
Inputs[i] = new Input()
{
Weight = r.NextDouble()
};
}
}
private double Normalize(double x)
{
return x > 0.5 ? 1 : 0;
}
public void Handle(double[] inputValues)
{
if (inputValues.Length != Inputs.Length) throw new ArgumentException("Количество параметров должно совпадать с количеством входов");
for (int i = 0; i < Inputs.Length; i++)
{
Inputs[i].Value = inputValues[i];
}
OutPut = Normalize(Inputs.Select(s => s.Value * s.Weight).Sum());
}
public void Study(double[] inputValues, double answer)
{
var gError = 1.0;
var error = 1.0;
while (gError != 0)
{
gError = 0;
Handle(inputValues);
for (int i = 0; i < Inputs.Length; i++)
{
error = answer - OutPut;
gError += Math.Abs(error);
var offset = error * Math.Abs(Inputs[i].Weight) * 0.001;
Inputs[i].Weight += offset;
}
}
}
}
этот персептрон может обучиться логическому И и ИЛИ, но XOR он обучиться не может и я понимаю почему - потому что разделить XOR можно только 2 полосками
и я для завершающего понимая персептрона хотел обучить такой модели:
Персептрон сможет предсказывать (примитивно конечно, чисто для примера) результат матча по футболу.
у нас есть 2 параметра
1) Травмы
2) где играем Дом\Гости
Травмы очень сильный порог и я хочу что б персептрон понял это и понимал что если травма есть то он должен сильно снизить шансы на победу, а где играем не особо сильно влияет на игру, если б параметров было больше то все это было б точнее, и другие параметры имели б шанс перебить травму, но в текущем примере все проще чтоб я понял как это работает.
Я нарисовал график что б понять сможет ли он решить эту задачу.
Как видим, все делиться одним вектором - то-есть по идее возможно, но на деле не так, он просто зависает на какой-то из итераций обучения (предполагаю что мои условия противоречат логике), и веса просто растут до бесконечности.
1) Что все таки мешает ему обучиться моему примеру?
2) Функция нормализации служит для нормализации результата и передачи его в след слой? или нормализовать на выход? (планирую сделать многослойный персептрон)
3) У меня есть сомнения на счет метода обучения, потому как метод обучения трогает все веса, и подгоняет под одну ошибку всей сети, хотя я знаю что чтоб решить мою задачу достаточно сделать малый вес на параметр где играем и большой отрицательный вес на травмы, тогда я буду получать число ближе к 0 и нормализоровать его к 0