示例#1
0
        public static epoha obuch(double[] real, double[] t, int p, int n, int epoch, double nu) // real - значения, расчитанные по формуле, n = 20; t - распределение
        {
            int             k  = 0;                                                              // Счетчик эпох
            List <epoha>    Ep = new List <epoha>();
            double          dlta;
            double          net1;
            List <double[]> netlist = new List <double[]>();
            List <double>   nextw   = Enumerable.Repeat(0.0, p + 1).ToList(); // Значения для весов следующей эпохи, заполняем нулями, +1 для w0

            double[] xline = t;
            do
            {
                epoha Ep_ = new epoha(nextw);
                Ep.Add(Ep_);
                Ep[k].nomer = k;
                //Ep[k].Y = new double[14];
                double[] tempW = nextw.ToArray();
                for (int i = 0; i < n - p; i++)
                {
                    List <double> tempT = getT(real, i, i + p);
                    net1 = paramsNS.net(tempW, tempT, p);
                    dlta = paramsNS.delta(real[i + p], net1);
                    //Ep[k].Y[i] = net1;
                    tempW = paramsNS.pereshetW(tempW, tempT, nu, dlta);
                    nextw = converter(tempW);
                    if (k == epoch - 1)     // Считаем ошибку только для последней эпохи
                    {
                        Ep[k].E = Math.Sqrt(dlta * dlta);
                    }
                }
                k++;
            } while (k != epoch);     // пока не пройдем эпохи
            return(Ep[epoch - 1]);
        }
示例#2
0
        private void button3_Click(object sender, EventArgs e)
        {
            int N = Convert.ToInt32(textBox6.Text); // Число точек по X
            int p = Convert.ToInt32(textBox3.Text); // Исходное количество нейронов

            if (p >= N)
            {
                MessageBox.Show("p должно быть меньше N", "Ошибка", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                return;
            }
            double nu   = formula.ParseDouble1(textBox2.Text); // Коэффициент обучения
            double a    = formula.ParseDouble1(textBox4.Text); // Нижняя граница временного интервала
            double b    = formula.ParseDouble1(textBox5.Text); // Верхняя граница временного интервала
            double shag = Math.Abs(a - b) / N;

            double[] t       = new double[N];
            double[] y       = new double[N];
            int      numepoh = Convert.ToInt32(textBox1.Text);

            t = formula.respred(a, b, N);
            for (int i = 0; i < t.Length; i++)
            {
                y[i] = tsin(t[i]);
            }
            epoha  EP = formula.obuch(y, t, p, N, numepoh, nu);
            double result;

            double[] finalresult = new double [2 * N];
            for (int dd = 0; dd < y.Length; dd++)
            {
                finalresult[dd] = y[dd];
            }
            List <double> result_vector = new List <double>();

            for (int i = N - p; i < 2 * N - p; i++)
            {
                List <double> tempT = formula.getT(finalresult, i, i + p);
                result = paramsNS.net(EP.W, tempT, p);
                result_vector.Add(result);
                finalresult[i + p] = result;
            }

            double[] realy = new double[2 * N];
            int      ii    = 0;

            for (double i = a; i < 2 * b - a; i += shag)
            {
                realy[ii] = tsin(i);
                ii++;
            }
            Draw2Point(a, 2 * b - a, finalresult, realy, shag);
            label7.Text = "Среднеквадратическая ошибка: " + Convert.ToString(EP.E);
        }