Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 21.97 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Windows.Forms;
  7.  
  8. namespace SIZI_Labs
  9. {
  10.     public partial class Lab1_kNN : Form
  11.     {
  12.         public Lab1_kNN()
  13.         {
  14.             InitializeComponent();
  15.         }
  16.  
  17.         private void Lab1_kNN_Load(object sender, EventArgs e)
  18.         {
  19.             MaximizeBox = false;
  20.         }
  21.  
  22.         public double[][] trainData;
  23.         public double[][] testSaveData;
  24.  
  25.         public static double[][] SaveTrainIris() //Многомерный массив с сохраненной тренировочной информацией, которую можно загрузить в программе
  26.         {
  27.             double[][] saveData = new double[150][];
  28.             saveData[0] = new double[] { 5.1, 3.5, 1.4, 0.2, 1 };
  29.             saveData[1] = new double[] { 4.9, 3.0, 1.4, 0.2, 1 };
  30.             saveData[2] = new double[] { 4.7, 3.2, 1.3, 0.2, 1 };
  31.             saveData[3] = new double[] { 4.6, 3.1, 1.5, 0.2, 1 };
  32.             saveData[4] = new double[] { 5.0, 3.6, 1.4, 0.2, 1 };
  33.             saveData[5] = new double[] { 5.4, 3.9, 1.7, 0.4, 1 };
  34.             saveData[6] = new double[] { 4.6, 3.4, 1.4, 0.3, 1 };
  35.             saveData[7] = new double[] { 5.0, 3.4, 1.5, 0.2, 1 };
  36.             saveData[8] = new double[] { 4.4, 2.9, 1.4, 0.2, 1 };
  37.             saveData[9] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
  38.             saveData[10] = new double[] { 5.4, 3.7, 1.5, 0.2, 1 };
  39.             saveData[11] = new double[] { 4.8, 3.4, 1.6, 0.2, 1 };
  40.             saveData[12] = new double[] { 4.8, 3.0, 1.4, 0.1, 1 };
  41.             saveData[13] = new double[] { 4.3, 3.0, 1.1, 0.1, 1 };
  42.             saveData[14] = new double[] { 5.8, 4.0, 1.2, 0.2, 1 };
  43.             saveData[15] = new double[] { 5.7, 4.4, 1.5, 0.4, 1 };
  44.             saveData[16] = new double[] { 5.4, 3.9, 1.3, 0.4, 1 };
  45.             saveData[17] = new double[] { 5.1, 3.5, 1.4, 0.3, 1 };
  46.             saveData[18] = new double[] { 5.7, 3.8, 1.7, 0.3, 1 };
  47.             saveData[19] = new double[] { 5.1, 3.8, 1.5, 0.3, 1 };
  48.             saveData[20] = new double[] { 5.4, 3.4, 1.7, 0.2, 1 };
  49.             saveData[21] = new double[] { 5.1, 3.7, 1.5, 0.4, 1 };
  50.             saveData[22] = new double[] { 4.6, 3.6, 1.0, 0.2, 1 };
  51.             saveData[23] = new double[] { 5.1, 3.3, 1.7, 0.5, 1 };
  52.             saveData[24] = new double[] { 4.8, 3.4, 1.9, 0.2, 1 };
  53.             saveData[25] = new double[] { 5.0, 3.0, 1.6, 0.2, 1 };
  54.             saveData[26] = new double[] { 5.0, 3.4, 1.6, 0.4, 1 };
  55.             saveData[27] = new double[] { 5.2, 3.5, 1.5, 0.2, 1 };
  56.             saveData[28] = new double[] { 5.2, 3.4, 1.4, 0.2, 1 };
  57.             saveData[29] = new double[] { 4.7, 3.2, 1.6, 0.2, 1 };
  58.             saveData[30] = new double[] { 4.8, 3.1, 1.6, 0.2, 1 };
  59.             saveData[31] = new double[] { 5.4, 3.4, 1.5, 0.4, 1 };
  60.             saveData[32] = new double[] { 5.2, 4.1, 1.5, 0.1, 1 };
  61.             saveData[33] = new double[] { 5.5, 4.2, 1.4, 0.2, 1 };
  62.             saveData[34] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
  63.             saveData[35] = new double[] { 5.0, 3.2, 1.2, 0.2, 1 };
  64.             saveData[36] = new double[] { 5.5, 3.5, 1.3, 0.2, 1 };
  65.             saveData[37] = new double[] { 4.9, 3.1, 1.5, 0.1, 1 };
  66.             saveData[38] = new double[] { 4.4, 3.0, 1.3, 0.2, 1 };
  67.             saveData[39] = new double[] { 5.1, 3.4, 1.5, 0.2, 1 };
  68.             saveData[40] = new double[] { 5.0, 3.5, 1.3, 0.3, 1 };
  69.             saveData[41] = new double[] { 4.5, 2.3, 1.3, 0.3, 1 };
  70.             saveData[42] = new double[] { 4.4, 3.2, 1.3, 0.2, 1 };
  71.             saveData[43] = new double[] { 5.0, 3.5, 1.6, 0.6, 1 };
  72.             saveData[44] = new double[] { 5.1, 3.8, 1.9, 0.4, 1 };
  73.             saveData[45] = new double[] { 4.8, 3.0, 1.4, 0.3, 1 };
  74.             saveData[46] = new double[] { 5.1, 3.8, 1.6, 0.2, 1 };
  75.             saveData[47] = new double[] { 4.6, 3.2, 1.4, 0.2, 1 };
  76.             saveData[48] = new double[] { 5.3, 3.7, 1.5, 0.2, 1 };
  77.             saveData[49] = new double[] { 5.0, 3.3, 1.4, 0.2, 1 };
  78.  
  79.             saveData[50] = new double[] { 7.0, 3.2, 4.7, 1.4, 2 };
  80.             saveData[51] = new double[] { 6.4, 3.2, 4.5, 1.5, 2 };
  81.             saveData[52] = new double[] { 6.9, 3.1, 4.9, 1.5, 2 };
  82.             saveData[53] = new double[] { 5.5, 2.3, 4.0, 1.3, 2 };
  83.             saveData[54] = new double[] { 6.5, 2.8, 4.6, 1.5, 2 };
  84.             saveData[55] = new double[] { 5.7, 2.8, 4.5, 1.3, 2 };
  85.             saveData[56] = new double[] { 6.3, 3.3, 4.7, 1.6, 2 };
  86.             saveData[57] = new double[] { 4.9, 2.4, 3.3, 1.0, 2 };
  87.             saveData[58] = new double[] { 6.6, 2.9, 4.6, 1.3, 2 };
  88.             saveData[59] = new double[] { 5.2, 2.7, 3.9, 1.4, 2 };
  89.             saveData[60] = new double[] { 5.0, 2.0, 3.5, 1.0, 2 };
  90.             saveData[61] = new double[] { 5.9, 3.0, 4.2, 1.5, 2 };
  91.             saveData[62] = new double[] { 6.0, 2.2, 4.0, 1.0, 2 };
  92.             saveData[63] = new double[] { 6.1, 2.9, 4.7, 1.4, 2 };
  93.             saveData[64] = new double[] { 5.6, 2.9, 3.6, 1.3, 2 };
  94.             saveData[65] = new double[] { 6.7, 3.1, 4.4, 1.4, 2 };
  95.             saveData[66] = new double[] { 5.6, 3.0, 4.5, 1.5, 2 };
  96.             saveData[67] = new double[] { 5.8, 2.7, 4.1, 1.0, 2 };
  97.             saveData[68] = new double[] { 6.2, 2.2, 4.5, 1.5, 2 };
  98.             saveData[69] = new double[] { 5.6, 2.5, 3.9, 1.1, 2 };
  99.             saveData[70] = new double[] { 5.9, 3.2, 4.8, 1.8, 2 };
  100.             saveData[71] = new double[] { 6.1, 2.8, 4.0, 1.3, 2 };
  101.             saveData[72] = new double[] { 6.3, 2.5, 4.9, 1.5, 2 };
  102.             saveData[73] = new double[] { 6.1, 2.8, 4.7, 1.2, 2 };
  103.             saveData[74] = new double[] { 6.4, 2.9, 4.3, 1.3, 2 };
  104.             saveData[75] = new double[] { 6.6, 3.0, 4.4, 1.4, 2 };
  105.             saveData[76] = new double[] { 6.8, 2.8, 4.8, 1.4, 2 };
  106.             saveData[77] = new double[] { 6.7, 3.0, 5.0, 1.7, 2 };
  107.             saveData[78] = new double[] { 6.0, 2.9, 4.5, 1.5, 2 };
  108.             saveData[79] = new double[] { 5.7, 2.6, 3.5, 1.0, 2 };
  109.             saveData[80] = new double[] { 5.5, 2.4, 3.8, 1.1, 2 };
  110.             saveData[81] = new double[] { 5.5, 2.4, 3.7, 1.0, 2 };
  111.             saveData[82] = new double[] { 5.8, 2.7, 3.9, 1.2, 2 };
  112.             saveData[83] = new double[] { 6.0, 2.7, 5.1, 1.6, 2 };
  113.             saveData[84] = new double[] { 5.4, 3.0, 4.5, 1.5, 2 };
  114.             saveData[85] = new double[] { 6.0, 3.4, 4.5, 1.6, 2 };
  115.             saveData[86] = new double[] { 6.7, 3.1, 4.7, 1.5, 2 };
  116.             saveData[87] = new double[] { 6.3, 2.3, 4.4, 1.3, 2 };
  117.             saveData[88] = new double[] { 5.6, 3.0, 4.1, 1.3, 2 };
  118.             saveData[89] = new double[] { 5.5, 2.5, 4.0, 1.3, 2 };
  119.             saveData[90] = new double[] { 5.5, 2.6, 4.4, 1.2, 2 };
  120.             saveData[91] = new double[] { 6.1, 3.0, 4.6, 1.4, 2 };
  121.             saveData[92] = new double[] { 5.8, 2.6, 4.0, 1.2, 2 };
  122.             saveData[93] = new double[] { 5.0, 2.3, 3.3, 1.0, 2 };
  123.             saveData[94] = new double[] { 5.6, 2.7, 4.2, 1.3, 2 };
  124.             saveData[95] = new double[] { 5.7, 3.0, 4.2, 1.2, 2 };
  125.             saveData[96] = new double[] { 5.7, 2.9, 4.2, 1.3, 2 };
  126.             saveData[97] = new double[] { 6.2, 2.9, 4.3, 1.3, 2 };
  127.             saveData[98] = new double[] { 5.1, 2.5, 3.0, 1.1, 2 };
  128.             saveData[99] = new double[] { 5.7, 2.8, 4.1, 1.3, 2 };
  129.  
  130.             saveData[100] = new double[] { 6.3, 3.3, 6.0, 2.5, 3 };
  131.             saveData[101] = new double[] { 5.8, 2.7, 5.1, 1.9, 3 };
  132.             saveData[102] = new double[] { 7.1, 3.0, 5.9, 2.1, 3 };
  133.             saveData[103] = new double[] { 6.3, 2.9, 5.6, 1.8, 3 };
  134.             saveData[104] = new double[] { 6.5, 3.0, 5.8, 2.2, 3 };
  135.             saveData[105] = new double[] { 7.6, 3.0, 6.6, 2.1, 3 };
  136.             saveData[106] = new double[] { 4.9, 2.5, 4.5, 1.7, 3 };
  137.             saveData[107] = new double[] { 7.3, 2.9, 6.3, 1.8, 3 };
  138.             saveData[108] = new double[] { 6.7, 2.5, 5.8, 1.8, 3 };
  139.             saveData[109] = new double[] { 7.2, 3.6, 6.1, 2.5, 3 };
  140.             saveData[110] = new double[] { 6.5, 3.2, 5.1, 2.0, 3 };
  141.             saveData[111] = new double[] { 6.4, 2.7, 5.3, 1.9, 3 };
  142.             saveData[112] = new double[] { 6.8, 3.0, 5.5, 2.1, 3 };
  143.             saveData[113] = new double[] { 5.7, 2.5, 5.0, 2.0, 3 };
  144.             saveData[114] = new double[] { 5.8, 2.8, 5.1, 2.4, 3 };
  145.             saveData[115] = new double[] { 6.4, 3.2, 5.3, 2.3, 3 };
  146.             saveData[116] = new double[] { 6.5, 3.0, 5.5, 1.8, 3 };
  147.             saveData[117] = new double[] { 7.7, 3.8, 6.7, 2.2, 3 };
  148.             saveData[118] = new double[] { 7.7, 2.6, 6.9, 2.3, 3 };
  149.             saveData[119] = new double[] { 6.0, 2.2, 5.0, 1.5, 3 };
  150.             saveData[120] = new double[] { 6.9, 3.2, 5.7, 2.3, 3 };
  151.             saveData[121] = new double[] { 5.6, 2.8, 4.9, 2.0, 3 };
  152.             saveData[122] = new double[] { 7.7, 2.8, 6.7, 2.0, 3 };
  153.             saveData[123] = new double[] { 6.3, 2.7, 4.9, 1.8, 3 };
  154.             saveData[124] = new double[] { 6.7, 3.3, 5.7, 2.1, 3 };
  155.             saveData[125] = new double[] { 7.2, 3.2, 6.0, 1.8, 3 };
  156.             saveData[126] = new double[] { 6.2, 2.8, 4.8, 1.8, 3 };
  157.             saveData[127] = new double[] { 6.1, 3.0, 4.9, 1.8, 3 };
  158.             saveData[128] = new double[] { 6.4, 2.8, 5.6, 2.1, 3 };
  159.             saveData[129] = new double[] { 7.2, 3.0, 5.8, 1.6, 3 };
  160.             saveData[130] = new double[] { 7.4, 2.8, 6.1, 1.9, 3 };
  161.             saveData[131] = new double[] { 7.9, 3.8, 6.4, 2.0, 3 };
  162.             saveData[132] = new double[] { 6.4, 2.8, 5.6, 2.2, 3 };
  163.             saveData[133] = new double[] { 6.3, 2.8, 5.1, 1.5, 3 };
  164.             saveData[134] = new double[] { 6.1, 2.6, 5.6, 1.4, 3 };
  165.             saveData[135] = new double[] { 7.7, 3.0, 6.1, 2.3, 3 };
  166.             saveData[136] = new double[] { 6.3, 3.4, 5.6, 2.4, 3 };
  167.             saveData[137] = new double[] { 6.4, 3.1, 5.5, 1.8, 3 };
  168.             saveData[138] = new double[] { 6.0, 3.0, 4.8, 1.8, 3 };
  169.             saveData[139] = new double[] { 6.9, 3.1, 5.4, 2.1, 3 };
  170.             saveData[140] = new double[] { 6.7, 3.1, 5.6, 2.4, 3 };
  171.             saveData[141] = new double[] { 6.9, 3.1, 5.1, 2.3, 3 };
  172.             saveData[142] = new double[] { 5.8, 2.7, 5.1, 1.9, 3 };
  173.             saveData[143] = new double[] { 6.8, 3.2, 5.9, 2.3, 3 };
  174.             saveData[144] = new double[] { 6.7, 3.3, 5.7, 2.5, 3 };
  175.             saveData[145] = new double[] { 6.7, 3.0, 5.2, 2.3, 3 };
  176.             saveData[146] = new double[] { 6.3, 2.5, 5.0, 1.9, 3 };
  177.             saveData[147] = new double[] { 6.5, 3.0, 5.2, 2.0, 3 };
  178.             saveData[148] = new double[] { 6.2, 3.4, 5.4, 2.3, 3 };
  179.             saveData[149] = new double[] { 5.9, 3.0, 5.1, 1.8, 3 };
  180.  
  181.             return saveData;
  182.         }
  183.         public static double[][] SaveTestIris()  //Многомерный массив с сохраненной тестовой информацией, которую можно загрузить в программе
  184.         {
  185.             double[][] testData = new double[3][];
  186.             testData[0] = new double[] { 5.4, 3.8, 1.6, 0.3 };
  187.             testData[1] = new double[] { 7.0, 3.2, 4.7, 1.4 };
  188.             testData[2] = new double[] { 6.3, 3.3, 6.0, 2.5 };
  189.  
  190.             return testData;
  191.         }
  192.  
  193.         private void button_LoadTrainIris_Click(object sender, EventArgs e) //Загрузка и отображения сохраненной в программе тренировочной информации в окно программы
  194.         {
  195.             trainData = SaveTrainIris();
  196.  
  197.             string text = "";
  198.             for (int i = 0; i < trainData.Length; i++)
  199.             {
  200.                 for (int j = 0; j < trainData[i].Length; j++)
  201.                 {
  202.                     text += trainData[i][j].ToString("F1") + " ";
  203.                 }
  204.                 text += Environment.NewLine;
  205.             }
  206.             textBox1.Text = text;
  207.         }
  208.  
  209.         private void button_LoadTrainText_Click(object sender, EventArgs e) //Чтение, загрузка и отображение тренировочной информации из внешнего текстовой файла
  210.         {
  211.             OpenFileDialog ofd = new OpenFileDialog(); //Отображение диалогового окна выбора файла
  212.             ofd.Filter = "Файл iris.txt|iris.txt"; //Нео
  213.             if (ofd.ShowDialog() == DialogResult.OK)
  214.             {
  215.                 trainData = File.ReadAllLines(ofd.FileName).Select(l => l.Split(';').Select(i => double.Parse(i)).ToArray()).ToArray();
  216.                
  217.                 string text = "";
  218.                 for (int i = 0; i < trainData.Length; i++)
  219.                 {
  220.                     for (int j = 0; j < trainData[i].Length; j++)
  221.                     {
  222.                         text += trainData[i][j].ToString("F1") + " ";
  223.                     }
  224.                     text += Environment.NewLine;
  225.                 }
  226.                 textBox1.Text = text;
  227.             }
  228.  
  229.         }
  230.  
  231.         private void button_LoadDataIris_Click(object sender, EventArgs e)
  232.         {
  233.             testSaveData = SaveTestIris();
  234.  
  235.             string text = "";
  236.             for (int i = 0; i < testSaveData.Length; i++)
  237.             {
  238.                 for (int j = 0; j < testSaveData[i].Length; j++)
  239.                 {
  240.                     text += testSaveData[i][j].ToString("F1") + " ";
  241.                 }
  242.                 text += Environment.NewLine;
  243.             }
  244.             textBox2.Text = text;
  245.         }
  246.  
  247.         private void button_LoadDataText_Click(object sender, EventArgs e)
  248.         {
  249.             OpenFileDialog ofd = new OpenFileDialog();
  250.             ofd.Filter = "Файл iristest.txt|iristest.txt";
  251.             if (ofd.ShowDialog() == DialogResult.OK)
  252.             {
  253.                 testSaveData = File.ReadAllLines(ofd.FileName).Select(l => l.Split(';').Select(i => double.Parse(i)).ToArray()).ToArray();
  254.                
  255.                 string text = "";
  256.                 for (int i = 0; i < testSaveData.Length; i++)
  257.                 {
  258.                     for (int j = 0; j < testSaveData[i].Length; j++)
  259.                     {
  260.                         text += testSaveData[i][j].ToString("F1") + " ";
  261.                     }
  262.                     text += Environment.NewLine;
  263.                 }
  264.                 textBox2.Text = text;
  265.             }
  266.         }
  267.  
  268.         private void button_kNN_Click(object sender, EventArgs e)
  269.         {
  270.             var neighbors = numericUpDown1.Value;
  271.             int td = trainData.Length;
  272.             int tsd = testSaveData.Length;
  273.  
  274.             List<IndexAndDistance[] > infos = new List<IndexAndDistance[]>();
  275.  
  276.             for (int j = 0; j < tsd; j++)
  277.             {
  278.                 IndexAndDistance[] info = new IndexAndDistance[td];
  279.                 for (int i = 0; i < td; ++i)
  280.                 {
  281.                     IndexAndDistance curr = new IndexAndDistance();
  282.                     double dist = Distance(testSaveData[j], trainData[i]);
  283.                     curr.idx = i;
  284.                     curr.dist = dist;
  285.                     info[i] = curr;
  286.                 }
  287.                 Array.Sort(info);
  288.                 infos.Add(info);
  289.             }
  290.  
  291.             string results = "";
  292.             var last = Convert.ToInt32(numericUpDown2.Value);
  293.             for (int k = 0; k < tsd; k++)
  294.             {
  295.                 results += "Для тестового элемента " + (k + 1);
  296.                 results += Environment.NewLine;
  297.                 for (int i = 0; i < neighbors; i++)
  298.                 {
  299.                     int cls = (int)trainData[infos[k][i].idx][last];
  300.                     results += "Ближайший сосед " + i + " имеет расстояние до введеной точки " + infos[k][i].dist.ToString("F3") + " и является классом " + cls + " ";
  301.                     results += Environment.NewLine;
  302.                 }
  303.                 results += Environment.NewLine;
  304.  
  305.  
  306.             }
  307.             textBox3.Text = results;
  308.         }
  309.  
  310.         private void button_weighted_kNN_Click(object sender, EventArgs e)
  311.         {
  312.             var numClasses = numericUpDown1.Value;
  313.             var neighbors = numericUpDown1.Value;
  314.             int td = trainData.Length;
  315.             int tsd = testSaveData.Length;
  316.  
  317.             List<IndexAndDistance[] > infos = new List<IndexAndDistance[] > ();
  318.  
  319.             for (int j = 0; j < tsd; j++)
  320.             {
  321.                 IndexAndDistance[] info = new IndexAndDistance[td];
  322.                 for (int i = 0; i < td; ++i)
  323.                 {
  324.                     IndexAndDistance curr = new IndexAndDistance();
  325.                     double dist = Distance(testSaveData[j], trainData[i]);
  326.                     curr.idx = i;
  327.                     curr.dist = dist;
  328.                     info[i] = curr;
  329.                 }
  330.                 Array.Sort(info);
  331.                 infos.Add(info);
  332.             }
  333.  
  334.             string results = "";
  335.             var last = Convert.ToInt32(numericUpDown2.Value);
  336.             double vote1 = 0;
  337.             double vote2 = 0;
  338.             double vote3 = 0;
  339.             for (int k = 0; k < tsd; k++)
  340.             {
  341.                 results += "Для тестового элемента " + (k + 1);
  342.                 results += Environment.NewLine;
  343.                 for (int i = 0; i < neighbors; i++)
  344.                 {
  345.                     int cls = (int)trainData[infos[k][i].idx][last];
  346.                     results += "Ближайший сосед " + i + " имеет расстояние до введеной точки " + infos[k][i].dist.ToString("F3") + " и является классом " + cls + " ";
  347.                     results += Environment.NewLine;
  348.  
  349.                     if (Convert.ToBoolean(cls == 1))
  350.                     {
  351.                         if (Convert.ToBoolean(infos[k][i].dist == 0))
  352.                         {
  353.                             infos[k][i].dist = 0.1;
  354.                         }
  355.                         vote1 = 0;
  356.                         vote2 = 0;
  357.                         vote3 = 0;
  358.                         vote1 += Convert.ToDouble(1 / infos[k][i].dist);
  359.                     }
  360.                     else if (Convert.ToBoolean(cls == 2))
  361.                     {
  362.                         if (Convert.ToBoolean(infos[k][i].dist == 0))
  363.                         {
  364.                             infos[k][i].dist = 0.1;
  365.                         }
  366.                         vote1 = 0;
  367.                         vote2 = 0;
  368.                         vote3 = 0;
  369.                         vote2 += Convert.ToDouble(1 / infos[k][i].dist);
  370.                     }
  371.                     else if (Convert.ToBoolean(cls == 3))
  372.                     {
  373.                         if (Convert.ToBoolean(infos[k][i].dist == 0))
  374.                         {
  375.                             infos[k][i].dist = 0.1;
  376.                         }
  377.                         vote1 = 0;
  378.                         vote2 = 0;
  379.                         vote3 = 0;
  380.                         vote3 += Convert.ToDouble(1 / infos[k][i].dist);
  381.                     }
  382.                    
  383.  
  384.                 }
  385.                 results += Environment.NewLine;
  386.                 results += Environment.NewLine;
  387.                 results += "Голосование для элемента 1: " + vote1;
  388.                 results += Environment.NewLine;
  389.                 results += "Голосование для элемента 2: " + vote2;
  390.                 results += Environment.NewLine;
  391.                 results += "Голосование для элемента 3: " + vote3;
  392.                 results += Environment.NewLine;
  393.  
  394.             }
  395.            
  396.             textBox3.Text = results;
  397.         }
  398.  
  399.         private void button_center_kNN_Click(object sender, EventArgs e)
  400.         {
  401.             string results = "";
  402.             var numClasses = numericUpDown1.Value;
  403.             var neighbors = numericUpDown1.Value;
  404.             int td = trainData.Length;
  405.             int tsd = testSaveData.Length;
  406.  
  407.             var last = Convert.ToInt32(numericUpDown2.Value);
  408.             List<IndexAndDistance[]> infos = new List<IndexAndDistance[]>();
  409.  
  410.             for (int j = 0; j < tsd; j++)
  411.             {
  412.                 IndexAndDistance[] info = new IndexAndDistance[td];
  413.                 for (int i = 0; i < td; ++i)
  414.                 {
  415.                     IndexAndDistance curr = new IndexAndDistance();
  416.                     double dist = Distance(testSaveData[j], trainData[i]);
  417.                     curr.idx = i;
  418.                     curr.dist = dist;
  419.                     info[i] = curr;
  420.                 }
  421.                 Array.Sort(info);
  422.                 infos.Add(info);
  423.             }
  424.             for (int k = 0; k < tsd; k++)
  425.             {
  426.  
  427.                 int cls = (int)trainData[infos[k][0].idx][last];
  428.                 results += "Элемент №" + " " + k + " " + "является классом" + " " + cls + " ";
  429.                 textBox3.Text = results;
  430.                 results += Environment.NewLine;
  431.  
  432.             }
  433.            
  434.         }
  435.  
  436.         static double Distance(double[] testData, double[] saveData)
  437.         {
  438.             double sum = 0.0;
  439.             for (int i = 0; i < testData.Length; ++i)
  440.             {
  441.                 sum += (testData[i] - saveData[i]) * (testData[i] - saveData[i]);
  442.             }      
  443.             return Math.Sqrt(sum);
  444.         }
  445.  
  446.         public class IndexAndDistance : IComparable<IndexAndDistance>
  447.         {
  448.             public int idx;  // index of a training item
  449.             public double dist;  // distance from train item to unknown
  450.  
  451.             // need to sort these to find k closest
  452.             public int CompareTo(IndexAndDistance other)
  453.             {
  454.                 if (this.dist < other.dist) return -1;
  455.                 else if (this.dist > other.dist) return +1;
  456.                 else return 0;
  457.             }
  458.         }
  459.  
  460.     }
  461. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement