Сеть имеет два входа (координаты точек x и y) и два выхода – один из них равен 1, другой 0 (по тому, к какому
кластеру принадлежит точка). Подавая последовательно на вход (вразнобой) точки, настроить сеть так, чтобы она приобрела способность определять, к какому кластеру принадлежит точка. Коэффициент выбрать, уменьшая его от шага к шагу по правилу (50-i)/100, причем для каждого нейрона это будет своё значение , а подстраиваться на каждом шаге будут веса только одного (выигравшего) нейрона.
С нейронными сетями только начинаю разбираться. Программа неправильно определяет кластера. Ошибка, наверное, в изменении весовых коэффициентов, сейчас изменяю их по формуле w(новое)=w(старое) + a(коэф. скор. об.)*(w(новое) - x(входящий вектор)). Подскажите пожалуйста.
class Network
{
/// <summary>
/// Массив для хранения отмасшатированных сигналов
/// </summary>
public double[,] mul = new double[2, 2];
/// <summary>
/// Массив для хранения весов
/// </summary>
public double[,] weight = new double[2, 2];
/// <summary>
/// Входящий вектор. Координата [x,y]
/// </summary>
public int[] input = new int[2];
/// <summary>
/// Суммы отмасштабированных сигналов
/// </summary>
public double[] sum = new double[2];
/// <summary>
/// Итерация обучения. Используется для модификация коэф-та скорости обучения.
/// </summary>
public int[] iter = new int[2] {0,0};
public Network()
{
Random r = new Random();
// Инициализация весов случайными числами
for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 2; y++)
{
weight[x, y] = r.NextDouble() * 1;
}
}
}
public int GetRez(int[] inP)
{
input = inP;
// Масштабирование сигналов
for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 2; y++)
{
// Умножаем его сигнал на вес и сохраняем в массив
mul[x, y] = input[x] * weight[x, y];
}
}
// Сумматор сигналов
for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 2; y++)
{
sum[y] += mul[x, y];
}
}
// Определение нейрона "победителя"
if (sum[0] > sum[1])
{
// коэф изменения
double ch = (50 - iter[0]) / 100.0;
// изменение весовых коэф
weight[0, 1] = weight[0, 1] + ch * (input[0] - weight[0, 1]);
weight[1, 0] = weight[1, 0] + ch * (input[1] - weight[1, 0]);
iter[0]++;
return 1;
}
else
{
// коэф изменения
double ch = (50 - iter[1]) / 100.0;
// изменение весовых коэф
weight[0, 0] = weight[0, 0] + ch * (input[0] - weight[0, 0]);
weight[1, 1] = weight[1, 1] + ch * (input[1] - weight[1, 1]);
iter[1]++;
return 0;
}
}
}