@misterobot404

Кластеризация точек с использованием сети Кохонена. Как изменять весовые коэффициенты?

Сеть имеет два входа (координаты точек 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;
            }
        }
    }
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы