Esempio n. 1
0
        private void button_Sample_Click(object sender, EventArgs e)
        {
            label_err.Text = "Learning error: ";

            label_Test.Text = "Testing error: ";

            //Коэффициент обучение сети
            n = Convert.ToDouble(textBox_n.Text);

            //Объем обучающей выборки
            countRow  = Convert.ToInt32(textBox_X.Text);
            numInput  = Convert.ToInt32(textBox2.Text);
            numHidden = Convert.ToInt32(textBox_C.Text);
            countIter = Convert.ToInt32(textBox1.Text);
            //чтение входных данных
            if (checkBox1.Checked == true)
            {
                CreateValues("dollar.txt");
            }
            else
            {
                CreateValues();
            }
            double[] d = new double[D.GetLength(0)];
            for (int i = 0; i < d.Length; i++)
            {
                d[i] = D[i, 0];
            }

            //Инициализация центроид
            centroids = ReaderWriter.ReadMatrixC(countRow, numInput, numHidden, d, x);

            rn           = new NeuralNetwork(countRow, numInput, numHidden, numOutput, x, centroids, n, temp, er);
            rn.countIter = countIter;
            //Инициализация весов
            rn.SetWeight();

            double[] res = new double[countRow];
            // Обучение сети
            rn.TrainNetwork(x, centroids, countRow, numInput, numHidden, numOutput, D, out res);

            if (chart2.Series.Count != 2)
            {
                chart2.Series.Add("");
            }

            chart2.Series[0].Points.Clear();
            chart2.Series[1].Points.Clear();

            //    chart2.ChartAreas[0].AxisX.Minimum = 30;
            //    chart2.ChartAreas[0].AxisX.Maximum = 50;
            // chart2.ChartAreas[0].AxisX.Interval = 1;
            if (checkBox1.Checked == true)
            {
                chart2.ChartAreas[0].AxisY.Minimum = 30;
                chart2.ChartAreas[0].AxisY.Maximum = 100;
            }
            else
            {
                chart2.ChartAreas[0].AxisY.Minimum = -100;
                chart2.ChartAreas[0].AxisY.Maximum = 1000;
            }



            //  chart2.ChartAreas[0].AxisY.Interval = 10;
            chart2.Legends[0].Docking  = System.Windows.Forms.DataVisualization.Charting.Docking.Bottom;
            chart2.Series[0].Name      = "Received value";
            chart2.Series[1].Name      = "Original value";
            chart2.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart2.Series[1].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;

            for (int i = 1; i < countRow - 1; i++)
            {
                chart2.Series[0].Points.AddXY(i, res[i + 1]);
                chart2.Series[1].Points.AddXY(i, d[i]);
            }

            er             = rn.errTrain;
            label_err.Text = "Learning error: " + er;

            temp = rn.temp;


            //  button_Sample.Enabled = false;
            button_test.Enabled = true;
        }
        //public void NormalizationOutputRBF(Matrix y)
        //{
        //    double gamma = 1;
        //    int indexNeuronWin = -1;

        //    for (int i = 0; i < y.Row; i++)//105
        //    {
        //        double max = -1;
        //        //находим победителя
        //        for (int j = 0; j < y.Column; j++)//3
        //        {
        //            if (max <= y.Get(i, j))
        //            {
        //                max = y.Get(i, j);
        //                indexNeuronWin = j;
        //            }
        //        }
        //        //корректируем выходы
        //        for (int j = 0; j < y.Column; j++)//3
        //        {
        //            if (j != indexNeuronWin)
        //            {
        //                y.Set(i, j, 0);
        //                //y[i, j] = Math.Exp(-(Math.Pow(y[i, j] - y[i, indexNeuronWin], 2)) / (Math.Pow(gamma, 2)));
        //            }
        //            else y.Set(i, indexNeuronWin, 1);
        //        }
        //    }
        //}

        public NeuralNetwork TrainNetwork(Matrix x, Matrix centroids, int countRow, int numInput, int numHidden,
                                          int numOutput, double[,] d, out double[] res)
        {
            R = centroids.Row - 1;
            List <double> sko  = new List <double>();
            double        e    = 0;
            double        eSum = 0;

            double[] error = new double[countRow]; //105
            double[,] newX = new double[countRow, numOutput];
            double m = numOutput;
            double p = countRow;

            double sum = 0;

            double[,] gradient = new double[numHidden, numOutput];
            int t = 0;

            //k-means
            //Стабилизация
            SetCentroidsWin(x, centroids);

            //Расчет сигмоиды
            Sigmoida(centroids);

            double[,] u = new double[countRow, numHidden];  //3
            double[,] f = new double[countRow, numHidden];  //3
            Matrix y     = new Matrix(countRow, numOutput); //3
            double temp1 = 0;
            int    r     = countIter;

            while (r != 0)
            {
                r--;
                eSum = 0;
                //Обучние сети
                for (int ti = 0; ti < x.Row; ti++) //105
                {
                    for (int q = 0; q < y.Column; q++)
                    {
                        e = 0;
                        for (int i = 0; i < centroids.Row; i++) //3
                        {
                            sum = 0;
                            for (int j = 0; j < centroids.Column; j++) //4
                            {
                                sum += Math.Pow(x.Get(ti, j) - centroids.Get(i, j), 2) / (Math.Pow(sigmoida[i, j], 2));
                            }

                            u[ti, i] = sum; //u

                            f[ti, i] = Math.Exp(-0.5 * u[ti, i]);
                            temp1    = 0;
                        }

                        for (int w = 0; w < weight.Row; w++)
                        {
                            //    if(w==0)
                            temp1 += weight.Get(w, q) * f[ti, q];
                            //      else
                            //  temp1 -= weight.Get(w, q) * f[ti, q];
                        }

                        //for (int w = 0; w < weight.Column; w++)
                        //{
                        //    temp1 += weight.Get(q, w) * f[ti, q];
                        //}
                        //Выход
                        y.Set(ti, q, temp1);

                        //Разница (y-d)
                        newX[ti, q] = y.Get(ti, q) - d[ti, q];
                        for (int k = 0; k < weight.Column; k++)
                        {
                            gradient[k, q] = newX[ti, q] * f[ti, q];
                            weight.Set(k, q, weight.Get(k, q) - n * gradient[k, q]);
                        }

                        e += Math.Pow(y.Get(ti, q) - d[ti, q], 2);
                    }

                    // e = Math.Sqrt(e);
                    eSum += e;
                }

                sko.Add(Math.Sqrt((eSum / (m * p - 1))));
                t++;
            }
            ///
            //for (int ti = 0; ti < x.Row; ti++) //105
            //{
            //    for (int q = 0; q < y.Column; q++)
            //    {
            //        e = 0;
            //        for (int i = 0; i < centroids.Row; i++) //3
            //        {
            //            sum = 0;
            //            for (int j = 0; j < centroids.Column; j++) //4
            //            {
            //                sum += Math.Pow(x.Get(ti, j) - centroids.Get(i, j), 2) / (Math.Pow(sigmoida[i, j], 2));
            //            }

            //            u[ti, i] = sum; //u

            //            f[ti, i] = Math.Exp(-0.5 * u[ti, i]);
            //            temp1 = 0;
            //        }
            //        for (int w = 0; w < weight.Column; w++)
            //        {
            //            temp1 += weight.Get(q, w) * f[ti, q];
            //        }
            //        //Выход
            //        y.Set(ti, q, temp1);

            //        //Разница (y-d)
            //    }
            //    // e = Math.Sqrt(e);
            //}

            ///
            for (int y2 = 0; y2 < sko.Count(); y2++)
            {
                errPr = sko.ElementAt(y2);
                Console.WriteLine(errPr);
            }

            res = new double[countRow];
            for (int i = 0; i < countRow; i++)
            {
                res[i] = y.Get(i, 0);
                //
            }

            temp     = t;
            errTrain = Math.Round(errPr, 10);
            NeuralNetwork nr =
                new NeuralNetwork(countRow, numInput, numHidden, numOutput, x, centroids, n, temp, errTrain);

            return(nr);
        }
Esempio n. 3
0
        private void button1_Click(object sender, EventArgs e)
        {
            double dou = 0;

            //listBox1.Items.Clear();
            for (double q = 0.0001; q < 0.1; q = q + 0.005)
            {
                n   = q;
                dou = 0;
                //Объем обучающей выборки
                countRow  = Convert.ToInt32(textBox_X.Text);
                numHidden = Convert.ToInt32(textBox_C.Text);
                countIter = Convert.ToInt32(textBox1.Text);
                // чтение входных данных
                x = ReaderWriter.ReadMatrix(filename, countRow, numInput);
                double[] d = ReaderWriter.ReadVector(filename, countRow, numInput);
                D = new double[countRow, numOutput];
                RecountD(d);
                for (int i = 0; i < 10; i++)
                {
                    //Коэффициент обучение сети
                    // n = Convert.ToDouble(textBox_n.Text);
                    countRow  = Convert.ToInt32(textBox_X.Text);
                    numHidden = Convert.ToInt32(textBox_C.Text);
                    countIter = Convert.ToInt32(textBox1.Text);
                    // чтение входных данных
                    x = ReaderWriter.ReadMatrix(filename, countRow, numInput);
                    d = ReaderWriter.ReadVector(filename, countRow, numInput);
                    D = new double[countRow, numOutput];
                    RecountD(d);

                    //Инициализация центроид
                    // centroids = ReaderWriter.ReadMatrixC(filename, countRow, numInput, numHidden, d);

                    rn           = new NeuralNetwork(countRow, numInput, numHidden, numOutput, x, centroids, n, temp, er);
                    rn.countIter = countIter;
                    //Инициализация весов
                    rn.SetWeight();

                    // Обучение сети
                    //     rn.TrainNetwork(x, centroids, countRow, numInput, numHidden, numOutput, D);

                    er = rn.errTrain;


                    countRow = 30;
                    // чтение входных данных
                    x = ReaderWriter.ReadMatrix("iris_test.txt", countRow, numInput);
                    d = ReaderWriter.ReadVector("iris_test.txt", countRow, numInput);
                    D = new double[countRow, numOutput];
                    RecountD(d);

                    // Тестирование сети
                    errTest = rn.TestNetwork(x, D, countRow, numInput, numOutput, numHidden);
                    dou    += errTest;
                    // listBox1.Items.Add(errTest);
                }

                Console.WriteLine("(" + q + ";" + dou / 10 + ")");
                //   Console.WriteLine("(" + q +";" + dou / 10 + ")");
                //listBox1.Items.Add("Итого: " + dou / 10);
            }

            for (double q = 0.1; q < 1; q = q + 0.02)
            {
                n   = q;
                dou = 0;
                //Объем обучающей выборки
                countRow  = Convert.ToInt32(textBox_X.Text);
                numHidden = Convert.ToInt32(textBox_C.Text);
                countIter = Convert.ToInt32(textBox1.Text);
                // чтение входных данных
                x = ReaderWriter.ReadMatrix(filename, countRow, numInput);
                double[] d = ReaderWriter.ReadVector(filename, countRow, numInput);
                D = new double[countRow, numOutput];
                RecountD(d);
                for (int i = 0; i < 10; i++)
                {
                    //Коэффициент обучение сети
                    // n = Convert.ToDouble(textBox_n.Text);
                    countRow  = Convert.ToInt32(textBox_X.Text);
                    numHidden = Convert.ToInt32(textBox_C.Text);
                    countIter = Convert.ToInt32(textBox1.Text);
                    // чтение входных данных
                    x = ReaderWriter.ReadMatrix(filename, countRow, numInput);
                    d = ReaderWriter.ReadVector(filename, countRow, numInput);
                    D = new double[countRow, numOutput];
                    RecountD(d);

                    //Инициализация центроид
                    //  centroids = ReaderWriter.ReadMatrixC(filename, countRow, numInput, numHidden, d);

                    rn           = new NeuralNetwork(countRow, numInput, numHidden, numOutput, x, centroids, n, temp, er);
                    rn.countIter = countIter;
                    //Инициализация весов
                    rn.SetWeight();

                    // Обучение сети
                    //   rn.TrainNetwork(x, centroids, countRow, numInput, numHidden, numOutput, D);

                    er = rn.errTrain;


                    countRow = 30;
                    // чтение входных данных
                    x = ReaderWriter.ReadMatrix("iris_test.txt", countRow, numInput);
                    d = ReaderWriter.ReadVector("iris_test.txt", countRow, numInput);
                    D = new double[countRow, numOutput];
                    RecountD(d);

                    // Тестирование сети
                    errTest = rn.TestNetwork(x, D, countRow, numInput, numOutput, numHidden);
                    dou    += errTest;
                    // listBox1.Items.Add(errTest);
                }

                Console.WriteLine("(" + q + ";" + dou / 10 + ")");
                //   Console.WriteLine("(" + q +";" + dou / 10 + ")");
                // listBox1.Items.Add("Итого: " + dou / 10);
            }
        }