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); }
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); } }