Exemple #1
0
        // сравниваем погрешность с эпсилон
        public bool Sravn(Neiron c1, double[] c2)
        {
            bool   flag = true;
            double buf = 0, max = 0;

            for (int i = 0; i < 9; i++)
            {
                buf = Math.Abs(c1[i] - c2[i]);
                if ((buf) >= eps)
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                max = 0;
                for (int i = 0; i < 9; i++)
                {
                    buf = Math.Abs(c1[i] - c2[i]);
                    if (buf > max)
                    {
                        max = buf;
                    }
                }
                /////////поставить лейбл
                form.label18.Text = max.ToString();
            }

            return(flag);
        }
Exemple #2
0
        }//от алгоритма

        ///что делать с выходным значением??type[]
        public void AlgorithmW(double[][] a, Neiron w0, double nu2, double y, int window)
        {
            Random rand = new Random();

            double[,] temp = new double[k + 1, k]; // хранит частные производные

            int    t    = 0;
            int    i_av = 0;
            double buff = 0;

            do
            {
                double[] x = a[i_av];
                x = Neiron.Norma(x);
                i_av++;


                //определение частных производных
                for (int q = 0; q < 4; q++)
                {
                    ///////вместо x.type должен быть выходной вектор temp[0, q] = Neiron.F(net, w0, x, k, q,window) - x.type[q];
                    temp[0, q] = Neiron.F(net, w0, x, k, q, window) - y;
                }

                for (int i = 0; i < k; i++)
                {
                    for (int q = 0; q < 4; q++)
                    {
                        temp[i + 1, q] = (Neiron.F(net, w0, x, k, q, window) - x.type[q]) * (Neiron.Fi(x, net[i], window));
                    }
                }

                //коррекция весов

                for (int q = 0; q < k; q++)
                {
                    w0.setW(q, w0.getW(q) - nu2 * temp[0, q]);
                }

                for (int i = 0; i < k; i++)
                {
                    for (int q = 0; q < k; q++)
                    {
                        net[i].setW(q, net[i].getW(q) - nu2 * temp[i + 1, q]);
                    }
                }
                t++;
                buff = Neiron.F(net, w0, x, k, 0, window) - x.type[0];
                for (int q = 0; q < 4; q++)
                {
                    if ((Neiron.F(net, w0, x, k, q, window) - x.type[q]) > buff)
                    {
                        buff = Neiron.F(net, w0, x, k, q, window) - x.type[q];
                    }
                }
                double h = buff * buff / 2;
                //лейбл!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                form.label19.Text = h.ToString();
            }while (t < window * k && ((buff * buff / 2) > eps));
        }
Exemple #3
0
        public Net(int q, double n)
        {   ///создаем сеть
            k   = q;
            net = new Neiron[k];

            int s = 0;

            ///создаем тип-т.е.считать
            for (int i = 0; i < k; i++)
            {
                if (s < 4)
                {
                    X = new double[s + 1];
                    s++;
                }
                else
                {
                    s = 0;
                }
                X = Neiron.Norma(X);
                ///////пока ничего не поняла
                double[] qw = new double[window];
                for (int j = 0; j < window; j++)
                {
                    qw[j] = X[j];
                }
                net[i] = new Neiron(qw, k);
            }
        }
Exemple #4
0
        public static double EvklidNormaNeiro(Neiron x, Neiron net, int window)
        {
            double sum = 0;

            for (int j = 0; j < window; j++)
            {
                sum += Math.Pow((x[j] - net[j]), 2);
            }
            return(sum);
        }
Exemple #5
0
        public static double Fi(double[] x, Neiron neiro, int window)
        {
            double sum = 0;

            for (int j = 0; j < window; j++)
            {
                sum += Math.Pow((x[j] - neiro[j]), 2) / Math.Pow(neiro.getDelta(j), 2);
            }
            return(Math.Exp(-sum / 2));
        }
Exemple #6
0
        public static double F(Neiron[] net, Neiron w0, double[] x, int k, int q, int window)// это y
        {
            double sum = 0;

            for (int i = 0; i < k; i++)
            {
                sum += net[i].getW(q) * Fi(x, net[i], window);
                //q++;
            }

            sum += w0.getW(q);
            return(sum);
        }
Exemple #7
0
        ///алгоритм корректировки центров

        public void AlgorithmK(double[][] a, double nu, double nu1, int window)
        {
            Random rand = new Random();

            double[] temp = new double[window]; // хранит координаты центра нейрона победителя

            int t    = 0;
            int i_av = 0;

            int[] mini = new int[window * k]; //хранит историю, какие нейроны я/я нейронами-победителями
            do
            {
                double[] x = a[i_av];

                x = Neiron.Norma(x);
                i_av++;
                double sum = 0, buf = 10000;

                //определение нейрона-победителя
                for (int i = 0; i < k; i++)
                {
                    sum = Neiron.EvklidNorma(x, net[i], window);
                    sum = Math.Sqrt(sum);
                    if (sum < buf)
                    {
                        buf     = sum;
                        mini[t] = i;
                    }
                }
                // хранит координаты центра нейрона победителя
                for (int i = 0; i < window; i++)
                {
                    temp[i] = net[mini[t]][i];
                }
                //определение первого соседа
                int min1 = 0;
                buf = 10000;
                for (int i = 0; i < k; i++)
                {
                    if (i != mini[t])
                    {
                        sum = Neiron.EvklidNorma(x, net[i], window);
                        sum = Math.Sqrt(sum);
                        if (sum < buf)
                        {
                            buf  = sum;
                            min1 = i;
                        }
                    }
                }
                //определение второго соседа
                int min2 = 0; buf = 10000;
                for (int i = 0; i < k; i++)
                {
                    if ((i != mini[t]) && (i != min1))
                    {
                        sum = Neiron.EvklidNorma(x, net[i], window);
                        sum = Math.Sqrt(sum);
                        if (sum < buf)
                        {
                            buf  = sum;
                            min2 = i;
                        }
                    }
                }
                //определение третьего соседа min3
                int min3 = 0; buf = 10000;
                for (int i = 0; i < k; i++)
                {
                    if ((i != mini[t]) && (i != min1) && (i != min2))
                    {
                        sum = Neiron.EvklidNorma(x, net[i], window);
                        sum = Math.Sqrt(sum);
                        if (sum < buf)
                        {
                            buf  = sum;
                            min3 = i;
                        }
                    }
                }
                //уточнение центра-победителя
                for (int i = 0; i < window; i++)
                {
                    net[mini[t]][i] = net[mini[t]][i] + nu * (x[i] - net[mini[t]][i]);
                }
                //уточнение соседей
                for (int i = 0; i < window; i++)
                {
                    net[min1][i] = net[min1][i] - nu1 * (x[i] - net[min1][i]);
                    net[min2][i] = net[min2][i] - nu1 * (x[i] - net[min2][i]);
                    net[min3][i] = net[min3][i] - nu1 * (x[i] - net[min3][i]);
                }
                t++;
            }while (t < window * k && (!Sravn(net[mini[t]], temp)));
            // от while
            if (t == window * k)
            {
            }
            int    R = 3;//количество соседей
            double summ = 0;
            int    min11 = 0, min22 = 0, min33 = 0;
            double buff = 10000;

            for (int i = 0; i < k; i++)//по всем нейронам
            {
                for (int j = 0; j < k; j++)
                {
                    if (i != j)
                    {
                        summ = Neiron.EvklidNormaNeiro(net[i], net[j], window);
                        summ = Math.Sqrt(summ);
                        if (summ < buff)
                        {
                            buff  = summ;
                            min11 = j;
                        }
                    }
                }
                buff = 10000;
                for (int j = 0; j < k; j++)
                {
                    if ((i != j) && (j != min11))
                    {
                        summ = Neiron.EvklidNormaNeiro(net[i], net[j], window);
                        summ = Math.Sqrt(summ);
                        if (summ < buff)
                        {
                            buff  = summ;
                            min22 = j;
                        }
                    }
                }
                buff = 10000;
                for (int j = 0; j < k; j++)
                {
                    if ((i != j) && (j != min11) && (j != min22))
                    {
                        summ = Neiron.EvklidNormaNeiro(net[i], net[j], window);
                        summ = Math.Sqrt(summ);
                        if (summ < buff)
                        {
                            buff  = summ;
                            min33 = j;
                        }
                    }
                }
                //считаем дельты
                for (int j = 0; j < 9; j++)
                {
                    net[i].setDelta(j, Math.Sqrt((1.0 / R) * (Math.Pow((net[i][j] - net[min11][j]), 2) + Math.Pow((net[i][j] - net[min22][j]), 2) + Math.Pow((net[i][j] - net[min33][j]), 2))));
                }
            }
        }//от алгоритма