Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Windows.Forms;
- namespace SIZI_Labs
- {
- public partial class Lab1_kNN : Form
- {
- public Lab1_kNN()
- {
- InitializeComponent();
- }
- private void Lab1_kNN_Load(object sender, EventArgs e)
- {
- MaximizeBox = false;
- }
- public double[][] trainData;
- public double[][] testSaveData;
- public static double[][] SaveTrainIris() //Многомерный массив с сохраненной тренировочной информацией, которую можно загрузить в программе
- {
- double[][] saveData = new double[150][];
- saveData[0] = new double[] { 5.1, 3.5, 1.4, 0.2, 1 };
- saveData[1] = new double[] { 4.9, 3.0, 1.4, 0.2, 1 };
- saveData[2] = new double[] { 4.7, 3.2, 1.3, 0.2, 1 };
- saveData[3] = new double[] { 4.6, 3.1, 1.5, 0.2, 1 };
- saveData[4] = new double[] { 5.0, 3.6, 1.4, 0.2, 1 };
- saveData[5] = new double[] { 5.4, 3.9, 1.7, 0.4, 1 };
- saveData[6] = new double[] { 4.6, 3.4, 1.4, 0.3, 1 };
- saveData[7] = new double[] { 5.0, 3.4, 1.5, 0.2, 1 };
- saveData[8] = new double[] { 4.4, 2.9, 1.4, 0.2, 1 };
- saveData[9] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
- saveData[10] = new double[] { 5.4, 3.7, 1.5, 0.2, 1 };
- saveData[11] = new double[] { 4.8, 3.4, 1.6, 0.2, 1 };
- saveData[12] = new double[] { 4.8, 3.0, 1.4, 0.1, 1 };
- saveData[13] = new double[] { 4.3, 3.0, 1.1, 0.1, 1 };
- saveData[14] = new double[] { 5.8, 4.0, 1.2, 0.2, 1 };
- saveData[15] = new double[] { 5.7, 4.4, 1.5, 0.4, 1 };
- saveData[16] = new double[] { 5.4, 3.9, 1.3, 0.4, 1 };
- saveData[17] = new double[] { 5.1, 3.5, 1.4, 0.3, 1 };
- saveData[18] = new double[] { 5.7, 3.8, 1.7, 0.3, 1 };
- saveData[19] = new double[] { 5.1, 3.8, 1.5, 0.3, 1 };
- saveData[20] = new double[] { 5.4, 3.4, 1.7, 0.2, 1 };
- saveData[21] = new double[] { 5.1, 3.7, 1.5, 0.4, 1 };
- saveData[22] = new double[] { 4.6, 3.6, 1.0, 0.2, 1 };
- saveData[23] = new double[] { 5.1, 3.3, 1.7, 0.5, 1 };
- saveData[24] = new double[] { 4.8, 3.4, 1.9, 0.2, 1 };
- saveData[25] = new double[] { 5.0, 3.0, 1.6, 0.2, 1 };
- saveData[26] = new double[] { 5.0, 3.4, 1.6, 0.4, 1 };
- saveData[27] = new double[] { 5.2, 3.5, 1.5, 0.2, 1 };
- saveData[28] = new double[] { 5.2, 3.4, 1.4, 0.2, 1 };
- saveData[29] = new double[] { 4.7, 3.2, 1.6, 0.2, 1 };
- saveData[30] = new double[] { 4.8, 3.1, 1.6, 0.2, 1 };
- saveData[31] = new double[] { 5.4, 3.4, 1.5, 0.4, 1 };
- saveData[32] = new double[] { 5.2, 4.1, 1.5, 0.1, 1 };
- saveData[33] = new double[] { 5.5, 4.2, 1.4, 0.2, 1 };
- saveData[34] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
- saveData[35] = new double[] { 5.0, 3.2, 1.2, 0.2, 1 };
- saveData[36] = new double[] { 5.5, 3.5, 1.3, 0.2, 1 };
- saveData[37] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
- saveData[38] = new double[] { 4.4, 3.0, 1.3, 0.2, 1 };
- saveData[39] = new double[] { 5.1, 3.4, 1.5, 0.2, 1 };
- saveData[40] = new double[] { 5.0, 3.5, 1.3, 0.3, 1 };
- saveData[41] = new double[] { 4.5, 2.3, 1.3, 0.3, 1 };
- saveData[42] = new double[] { 4.4, 3.2, 1.3, 0.2, 1 };
- saveData[43] = new double[] { 5.0, 3.5, 1.6, 0.6, 1 };
- saveData[44] = new double[] { 5.1, 3.8, 1.9, 0.4, 1 };
- saveData[45] = new double[] { 4.8, 3.0, 1.4, 0.3, 1 };
- saveData[46] = new double[] { 5.1, 3.8, 1.6, 0.2, 1 };
- saveData[47] = new double[] { 4.6, 3.2, 1.4, 0.2, 1 };
- saveData[48] = new double[] { 5.3, 3.7, 1.5, 0.2, 1 };
- saveData[49] = new double[] { 5.0, 3.3, 1.4, 0.2, 1 };
- saveData[50] = new double[] { 7.0, 3.2, 4.7, 1.4, 2 };
- saveData[51] = new double[] { 6.4, 3.2, 4.5, 1.5, 2 };
- saveData[52] = new double[] { 6.9, 3.1, 4.9, 1.5, 2 };
- saveData[53] = new double[] { 5.5, 2.3, 4.0, 1.3, 2 };
- saveData[54] = new double[] { 6.5, 2.8, 4.6, 1.5, 2 };
- saveData[55] = new double[] { 5.7, 2.8, 4.5, 1.3, 2 };
- saveData[56] = new double[] { 6.3, 3.3, 4.7, 1.6, 2 };
- saveData[57] = new double[] { 4.9, 2.4, 3.3, 1.0, 2 };
- saveData[58] = new double[] { 6.6, 2.9, 4.6, 1.3, 2 };
- saveData[59] = new double[] { 5.2, 2.7, 3.9, 1.4, 2 };
- saveData[60] = new double[] { 5.0, 2.0, 3.5, 1.0, 2 };
- saveData[61] = new double[] { 5.9, 3.0, 4.2, 1.5, 2 };
- saveData[62] = new double[] { 6.0, 2.2, 4.0, 1.0, 2 };
- saveData[63] = new double[] { 6.1, 2.9, 4.7, 1.4, 2 };
- saveData[64] = new double[] { 5.6, 2.9, 3.6, 1.3, 2 };
- saveData[65] = new double[] { 6.7, 3.1, 4.4, 1.4, 2 };
- saveData[66] = new double[] { 5.6, 3.0, 4.5, 1.5, 2 };
- saveData[67] = new double[] { 5.8, 2.7, 4.1, 1.0, 2 };
- saveData[68] = new double[] { 6.2, 2.2, 4.5, 1.5, 2 };
- saveData[69] = new double[] { 5.6, 2.5, 3.9, 1.1, 2 };
- saveData[70] = new double[] { 5.9, 3.2, 4.8, 1.8, 2 };
- saveData[71] = new double[] { 6.1, 2.8, 4.0, 1.3, 2 };
- saveData[72] = new double[] { 6.3, 2.5, 4.9, 1.5, 2 };
- saveData[73] = new double[] { 6.1, 2.8, 4.7, 1.2, 2 };
- saveData[74] = new double[] { 6.4, 2.9, 4.3, 1.3, 2 };
- saveData[75] = new double[] { 6.6, 3.0, 4.4, 1.4, 2 };
- saveData[76] = new double[] { 6.8, 2.8, 4.8, 1.4, 2 };
- saveData[77] = new double[] { 6.7, 3.0, 5.0, 1.7, 2 };
- saveData[78] = new double[] { 6.0, 2.9, 4.5, 1.5, 2 };
- saveData[79] = new double[] { 5.7, 2.6, 3.5, 1.0, 2 };
- saveData[80] = new double[] { 5.5, 2.4, 3.8, 1.1, 2 };
- saveData[81] = new double[] { 5.5, 2.4, 3.7, 1.0, 2 };
- saveData[82] = new double[] { 5.8, 2.7, 3.9, 1.2, 2 };
- saveData[83] = new double[] { 6.0, 2.7, 5.1, 1.6, 2 };
- saveData[84] = new double[] { 5.4, 3.0, 4.5, 1.5, 2 };
- saveData[85] = new double[] { 6.0, 3.4, 4.5, 1.6, 2 };
- saveData[86] = new double[] { 6.7, 3.1, 4.7, 1.5, 2 };
- saveData[87] = new double[] { 6.3, 2.3, 4.4, 1.3, 2 };
- saveData[88] = new double[] { 5.6, 3.0, 4.1, 1.3, 2 };
- saveData[89] = new double[] { 5.5, 2.5, 4.0, 1.3, 2 };
- saveData[90] = new double[] { 5.5, 2.6, 4.4, 1.2, 2 };
- saveData[91] = new double[] { 6.1, 3.0, 4.6, 1.4, 2 };
- saveData[92] = new double[] { 5.8, 2.6, 4.0, 1.2, 2 };
- saveData[93] = new double[] { 5.0, 2.3, 3.3, 1.0, 2 };
- saveData[94] = new double[] { 5.6, 2.7, 4.2, 1.3, 2 };
- saveData[95] = new double[] { 5.7, 3.0, 4.2, 1.2, 2 };
- saveData[96] = new double[] { 5.7, 2.9, 4.2, 1.3, 2 };
- saveData[97] = new double[] { 6.2, 2.9, 4.3, 1.3, 2 };
- saveData[98] = new double[] { 5.1, 2.5, 3.0, 1.1, 2 };
- saveData[99] = new double[] { 5.7, 2.8, 4.1, 1.3, 2 };
- saveData[100] = new double[] { 6.3, 3.3, 6.0, 2.5, 3 };
- saveData[101] = new double[] { 5.8, 2.7, 5.1, 1.9, 3 };
- saveData[102] = new double[] { 7.1, 3.0, 5.9, 2.1, 3 };
- saveData[103] = new double[] { 6.3, 2.9, 5.6, 1.8, 3 };
- saveData[104] = new double[] { 6.5, 3.0, 5.8, 2.2, 3 };
- saveData[105] = new double[] { 7.6, 3.0, 6.6, 2.1, 3 };
- saveData[106] = new double[] { 4.9, 2.5, 4.5, 1.7, 3 };
- saveData[107] = new double[] { 7.3, 2.9, 6.3, 1.8, 3 };
- saveData[108] = new double[] { 6.7, 2.5, 5.8, 1.8, 3 };
- saveData[109] = new double[] { 7.2, 3.6, 6.1, 2.5, 3 };
- saveData[110] = new double[] { 6.5, 3.2, 5.1, 2.0, 3 };
- saveData[111] = new double[] { 6.4, 2.7, 5.3, 1.9, 3 };
- saveData[112] = new double[] { 6.8, 3.0, 5.5, 2.1, 3 };
- saveData[113] = new double[] { 5.7, 2.5, 5.0, 2.0, 3 };
- saveData[114] = new double[] { 5.8, 2.8, 5.1, 2.4, 3 };
- saveData[115] = new double[] { 6.4, 3.2, 5.3, 2.3, 3 };
- saveData[116] = new double[] { 6.5, 3.0, 5.5, 1.8, 3 };
- saveData[117] = new double[] { 7.7, 3.8, 6.7, 2.2, 3 };
- saveData[118] = new double[] { 7.7, 2.6, 6.9, 2.3, 3 };
- saveData[119] = new double[] { 6.0, 2.2, 5.0, 1.5, 3 };
- saveData[120] = new double[] { 6.9, 3.2, 5.7, 2.3, 3 };
- saveData[121] = new double[] { 5.6, 2.8, 4.9, 2.0, 3 };
- saveData[122] = new double[] { 7.7, 2.8, 6.7, 2.0, 3 };
- saveData[123] = new double[] { 6.3, 2.7, 4.9, 1.8, 3 };
- saveData[124] = new double[] { 6.7, 3.3, 5.7, 2.1, 3 };
- saveData[125] = new double[] { 7.2, 3.2, 6.0, 1.8, 3 };
- saveData[126] = new double[] { 6.2, 2.8, 4.8, 1.8, 3 };
- saveData[127] = new double[] { 6.1, 3.0, 4.9, 1.8, 3 };
- saveData[128] = new double[] { 6.4, 2.8, 5.6, 2.1, 3 };
- saveData[129] = new double[] { 7.2, 3.0, 5.8, 1.6, 3 };
- saveData[130] = new double[] { 7.4, 2.8, 6.1, 1.9, 3 };
- saveData[131] = new double[] { 7.9, 3.8, 6.4, 2.0, 3 };
- saveData[132] = new double[] { 6.4, 2.8, 5.6, 2.2, 3 };
- saveData[133] = new double[] { 6.3, 2.8, 5.1, 1.5, 3 };
- saveData[134] = new double[] { 6.1, 2.6, 5.6, 1.4, 3 };
- saveData[135] = new double[] { 7.7, 3.0, 6.1, 2.3, 3 };
- saveData[136] = new double[] { 6.3, 3.4, 5.6, 2.4, 3 };
- saveData[137] = new double[] { 6.4, 3.1, 5.5, 1.8, 3 };
- saveData[138] = new double[] { 6.0, 3.0, 4.8, 1.8, 3 };
- saveData[139] = new double[] { 6.9, 3.1, 5.4, 2.1, 3 };
- saveData[140] = new double[] { 6.7, 3.1, 5.6, 2.4, 3 };
- saveData[141] = new double[] { 6.9, 3.1, 5.1, 2.3, 3 };
- saveData[142] = new double[] { 5.8, 2.7, 5.1, 1.9, 3 };
- saveData[143] = new double[] { 6.8, 3.2, 5.9, 2.3, 3 };
- saveData[144] = new double[] { 6.7, 3.3, 5.7, 2.5, 3 };
- saveData[145] = new double[] { 6.7, 3.0, 5.2, 2.3, 3 };
- saveData[146] = new double[] { 6.3, 2.5, 5.0, 1.9, 3 };
- saveData[147] = new double[] { 6.5, 3.0, 5.2, 2.0, 3 };
- saveData[148] = new double[] { 6.2, 3.4, 5.4, 2.3, 3 };
- saveData[149] = new double[] { 5.9, 3.0, 5.1, 1.8, 3 };
- return saveData;
- }
- public static double[][] SaveTestIris() //Многомерный массив с сохраненной тестовой информацией, которую можно загрузить в программе
- {
- double[][] testData = new double[3][];
- testData[0] = new double[] { 5.4, 3.8, 1.6, 0.3 };
- testData[1] = new double[] { 7.0, 3.2, 4.7, 1.4 };
- testData[2] = new double[] { 6.3, 3.3, 6.0, 2.5 };
- return testData;
- }
- private void button_LoadTrainIris_Click(object sender, EventArgs e) //Загрузка и отображения сохраненной в программе тренировочной информации в окно программы
- {
- trainData = SaveTrainIris();
- string text = "";
- for (int i = 0; i < trainData.Length; i++)
- {
- for (int j = 0; j < trainData[i].Length; j++)
- {
- text += trainData[i][j].ToString("F1") + " ";
- }
- text += Environment.NewLine;
- }
- textBox1.Text = text;
- }
- private void button_LoadTrainText_Click(object sender, EventArgs e) //Чтение, загрузка и отображение тренировочной информации из внешнего текстовой файла
- {
- OpenFileDialog ofd = new OpenFileDialog(); //Отображение диалогового окна выбора файла
- ofd.Filter = "Файл iris.txt|iris.txt"; //Нео
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- trainData = File.ReadAllLines(ofd.FileName).Select(l => l.Split(';').Select(i => double.Parse(i)).ToArray()).ToArray();
- string text = "";
- for (int i = 0; i < trainData.Length; i++)
- {
- for (int j = 0; j < trainData[i].Length; j++)
- {
- text += trainData[i][j].ToString("F1") + " ";
- }
- text += Environment.NewLine;
- }
- textBox1.Text = text;
- }
- }
- private void button_LoadDataIris_Click(object sender, EventArgs e)
- {
- testSaveData = SaveTestIris();
- string text = "";
- for (int i = 0; i < testSaveData.Length; i++)
- {
- for (int j = 0; j < testSaveData[i].Length; j++)
- {
- text += testSaveData[i][j].ToString("F1") + " ";
- }
- text += Environment.NewLine;
- }
- textBox2.Text = text;
- }
- private void button_LoadDataText_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = "Файл iristest.txt|iristest.txt";
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- testSaveData = File.ReadAllLines(ofd.FileName).Select(l => l.Split(';').Select(i => double.Parse(i)).ToArray()).ToArray();
- string text = "";
- for (int i = 0; i < testSaveData.Length; i++)
- {
- for (int j = 0; j < testSaveData[i].Length; j++)
- {
- text += testSaveData[i][j].ToString("F1") + " ";
- }
- text += Environment.NewLine;
- }
- textBox2.Text = text;
- }
- }
- private void button_kNN_Click(object sender, EventArgs e)
- {
- var neighbors = numericUpDown1.Value;
- int td = trainData.Length;
- int tsd = testSaveData.Length;
- List<IndexAndDistance[] > infos = new List<IndexAndDistance[]>();
- for (int j = 0; j < tsd; j++)
- {
- IndexAndDistance[] info = new IndexAndDistance[td];
- for (int i = 0; i < td; ++i)
- {
- IndexAndDistance curr = new IndexAndDistance();
- double dist = Distance(testSaveData[j], trainData[i]);
- curr.idx = i;
- curr.dist = dist;
- info[i] = curr;
- }
- Array.Sort(info);
- infos.Add(info);
- }
- string results = "";
- var last = Convert.ToInt32(numericUpDown2.Value);
- for (int k = 0; k < tsd; k++)
- {
- results += "Для тестового элемента " + (k + 1);
- results += Environment.NewLine;
- for (int i = 0; i < neighbors; i++)
- {
- int cls = (int)trainData[infos[k][i].idx][last];
- results += "Ближайший сосед " + i + " имеет расстояние до введеной точки " + infos[k][i].dist.ToString("F3") + " и является классом " + cls + " ";
- results += Environment.NewLine;
- }
- results += Environment.NewLine;
- }
- textBox3.Text = results;
- }
- private void button_weighted_kNN_Click(object sender, EventArgs e)
- {
- var numClasses = numericUpDown1.Value;
- var neighbors = numericUpDown1.Value;
- int td = trainData.Length;
- int tsd = testSaveData.Length;
- List<IndexAndDistance[] > infos = new List<IndexAndDistance[] > ();
- for (int j = 0; j < tsd; j++)
- {
- IndexAndDistance[] info = new IndexAndDistance[td];
- for (int i = 0; i < td; ++i)
- {
- IndexAndDistance curr = new IndexAndDistance();
- double dist = Distance(testSaveData[j], trainData[i]);
- curr.idx = i;
- curr.dist = dist;
- info[i] = curr;
- }
- Array.Sort(info);
- infos.Add(info);
- }
- string results = "";
- var last = Convert.ToInt32(numericUpDown2.Value);
- double vote1 = 0;
- double vote2 = 0;
- double vote3 = 0;
- for (int k = 0; k < tsd; k++)
- {
- results += "Для тестового элемента " + (k + 1);
- results += Environment.NewLine;
- for (int i = 0; i < neighbors; i++)
- {
- int cls = (int)trainData[infos[k][i].idx][last];
- results += "Ближайший сосед " + i + " имеет расстояние до введеной точки " + infos[k][i].dist.ToString("F3") + " и является классом " + cls + " ";
- results += Environment.NewLine;
- if (Convert.ToBoolean(cls == 1))
- {
- if (Convert.ToBoolean(infos[k][i].dist == 0))
- {
- infos[k][i].dist = 0.1;
- }
- vote1 = 0;
- vote2 = 0;
- vote3 = 0;
- vote1 += Convert.ToDouble(1 / infos[k][i].dist);
- }
- else if (Convert.ToBoolean(cls == 2))
- {
- if (Convert.ToBoolean(infos[k][i].dist == 0))
- {
- infos[k][i].dist = 0.1;
- }
- vote1 = 0;
- vote2 = 0;
- vote3 = 0;
- vote2 += Convert.ToDouble(1 / infos[k][i].dist);
- }
- else if (Convert.ToBoolean(cls == 3))
- {
- if (Convert.ToBoolean(infos[k][i].dist == 0))
- {
- infos[k][i].dist = 0.1;
- }
- vote1 = 0;
- vote2 = 0;
- vote3 = 0;
- vote3 += Convert.ToDouble(1 / infos[k][i].dist);
- }
- }
- results += Environment.NewLine;
- results += Environment.NewLine;
- results += "Голосование для элемента 1: " + vote1;
- results += Environment.NewLine;
- results += "Голосование для элемента 2: " + vote2;
- results += Environment.NewLine;
- results += "Голосование для элемента 3: " + vote3;
- results += Environment.NewLine;
- }
- textBox3.Text = results;
- }
- private void button_center_kNN_Click(object sender, EventArgs e)
- {
- string results = "";
- var numClasses = numericUpDown1.Value;
- var neighbors = numericUpDown1.Value;
- int td = trainData.Length;
- int tsd = testSaveData.Length;
- var last = Convert.ToInt32(numericUpDown2.Value);
- List<IndexAndDistance[]> infos = new List<IndexAndDistance[]>();
- for (int j = 0; j < tsd; j++)
- {
- IndexAndDistance[] info = new IndexAndDistance[td];
- for (int i = 0; i < td; ++i)
- {
- IndexAndDistance curr = new IndexAndDistance();
- double dist = Distance(testSaveData[j], trainData[i]);
- curr.idx = i;
- curr.dist = dist;
- info[i] = curr;
- }
- Array.Sort(info);
- infos.Add(info);
- }
- for (int k = 0; k < tsd; k++)
- {
- int cls = (int)trainData[infos[k][0].idx][last];
- results += "Элемент №" + " " + k + " " + "является классом" + " " + cls + " ";
- textBox3.Text = results;
- results += Environment.NewLine;
- }
- }
- static double Distance(double[] testData, double[] saveData)
- {
- double sum = 0.0;
- for (int i = 0; i < testData.Length; ++i)
- {
- sum += (testData[i] - saveData[i]) * (testData[i] - saveData[i]);
- }
- return Math.Sqrt(sum);
- }
- public class IndexAndDistance : IComparable<IndexAndDistance>
- {
- public int idx; // index of a training item
- public double dist; // distance from train item to unknown
- // need to sort these to find k closest
- public int CompareTo(IndexAndDistance other)
- {
- if (this.dist < other.dist) return -1;
- else if (this.dist > other.dist) return +1;
- else return 0;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement