document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6.  
  7. namespace SimpleKmean
  8. {
  9.     class Program
  10.     {
  11.         static int loopCount = 1;
  12.         static int recursiveFlag = 0;
  13.         static void Main(string[] args)
  14.         {
  15.             int[,] nodes;
  16.             int[,] classes;
  17.            
  18.             //
  19.             // user input
  20.             //
  21.             System.Console.Write("how many nodes do you want? :");
  22.             int nodeNumber = Convert.ToInt32(System.Console.ReadLine());
  23.             System.Console.Write("how many classes do you want? :");
  24.             int classNumber = Convert.ToInt32(System.Console.ReadLine());
  25.             //
  26.             // dynamic create 2D array
  27.             //
  28.             nodes = new int[nodeNumber,3]; // index -> x = 0 , y = 1 , classFlag = 3
  29.             classes = new int[nodeNumber,2]; // classnumber coordinate , clustering coordinates
  30.             //
  31.             // get random coordinates
  32.             //
  33.             for (int i = 0; i < nodeNumber; i++)
  34.             {
  35.                 Random random = new Random((int)DateTime.Now.Millisecond);
  36.                 // get x
  37.                 nodes[i, 0] = random.Next(0, 10);
  38.                 Thread.Sleep(20);
  39.                 // get y
  40.                 nodes[i, 1] = random.Next(0, 10);
  41.                 System.Console.WriteLine("({0},{1})",nodes[i, 0],nodes[i, 1]);
  42.             }
  43.             System.Console.WriteLine("-------------------");
  44.             //
  45.             // get random class
  46.             //
  47.             for (int i = 0; i < classNumber; i++)
  48.             {
  49.                 Random random = new Random((int)DateTime.Now.Millisecond);
  50.                 // get x
  51.                
  52.                 classes[i, 0] = random.Next(0, 10);
  53.                 Thread.Sleep(20);
  54.                 // get y
  55.                 classes[i, 1] = random.Next(0, 10);
  56.                 System.Console.WriteLine("class[{0}]--({1},{2})",i, classes[i, 0], classes[i, 1]);
  57.             }
  58.             System.Console.WriteLine("-------------------");
  59.  
  60.  
  61.             //showResult(nodes,nodeNumber);
  62.             kMean(nodeNumber, classNumber, nodes, classes);
  63.             System.Console.WriteLine("=================================");
  64.             System.Console.WriteLine("finish! recusive times : {0}",loopCount);
  65.             showResult(nodes, nodeNumber, classes, classNumber);
  66.             System.Console.WriteLine("Press any key to continue...");
  67.             System.Console.ReadKey();
  68.         }
  69.         //
  70.         // use the euclidean distane to calculate two coordinates.
  71.         //
  72.         static double distance(int x1, int y1, int x2 , int y2)
  73.         {
  74.             return Math.Sqrt( Math.Pow((x1-x2),2) + Math.Pow((y1-y2),2));
  75.         }
  76.         //
  77.         // procedure that show the group
  78.         //
  79.         static void showResult(int[,] nodes,int nodeNumber,int[,] classes,int classNumber)
  80.         {
  81.             for (int i = 0; i < classNumber; i++)
  82.             {
  83.                 System.Console.WriteLine("class[{0}]--({1},{2})",i, classes[i, 0], classes[i, 1]);
  84.             }
  85.             System.Console.WriteLine("-------------------");
  86.             for (int i = 0; i < nodeNumber; i++)
  87.             {
  88.                 System.Console.WriteLine("({0},{1}) --> class[{2}]", nodes[i, 0], nodes[i, 1], nodes[i, 2]);
  89.             }          
  90.         }
  91.         //
  92.         // K-mean Algorithm
  93.         //
  94.         static void kMean(int nodeNumber , int classNumber, int[,] nodes, int[,] classes)
  95.         {
  96.             //
  97.             // calculate the distance between the class and the coordinate .
  98.             //
  99.             for (int i = 0; i < nodeNumber; i++)
  100.             {
  101.                 double min = 100000;
  102.                 for (int j = 0; j < classNumber; j++)
  103.                 {
  104.                     double mindDistance = distance(nodes[i, 0], nodes[i, 1], classes[j, 0], classes[j, 1]);
  105.                     if (mindDistance < min)
  106.                     {
  107.                         min = mindDistance;
  108.                         nodes[i, 2] = j; // flag to set the group that the coordinate belong to.
  109.                     }
  110.                 }
  111.             }
  112.  
  113.             showResult(nodes, nodeNumber,classes,classNumber);
  114.  
  115.             //
  116.             // calculate the new center class
  117.             //
  118.            
  119.             int[,] tempClasses = new int[nodeNumber, 3];
  120.             for (int j = 0; j < classNumber; j++)
  121.             {
  122.                 int[] tempCoordinate = new int[2];
  123.                 for (int i = 0; i < nodeNumber; i++)
  124.                 {
  125.                     if (nodes[i, 2] == j)
  126.                     {
  127.                         // new class
  128.                         tempCoordinate[0] += nodes[i, 0];
  129.                         tempCoordinate[1] += nodes[i, 1];
  130.                         tempClasses[j, 2]++;
  131.                     }
  132.                 }
  133.                 if (tempClasses[j, 2] == 0)
  134.                     tempClasses[j, 2] = 1;
  135.                 tempClasses[j, 0] = tempCoordinate[0] / tempClasses[j, 2];
  136.                 tempClasses[j, 1] = tempCoordinate[1] / tempClasses[j, 2];
  137.                 System.Console.WriteLine("count = {3},class[{0}] :new cor ({1},{2})", j, tempClasses[j, 0], tempClasses[j, 1], tempClasses[j, 2]);
  138.                
  139.             }
  140.             //System.Console.ReadKey();
  141.             int k = 0;
  142.             for ( k = 0; k < classNumber; k++ )
  143.             {
  144.                 if ((tempClasses[k, 0] != classes[k, 0]) || (tempClasses[k, 1] != classes[k, 1]))
  145.                 {
  146.                     recursiveFlag = 1;
  147.                     break;
  148.                 }
  149.             }
  150.             if (k >= classNumber)
  151.                 recursiveFlag = 0;
  152.             if (recursiveFlag == 1)
  153.             {
  154.                 for (int j = 0; j < classNumber; j++)
  155.                 {
  156.                     classes[j, 0] = tempClasses[j, 0];
  157.                     classes[j, 1] = tempClasses[j, 1];
  158.                 }
  159.                 System.Console.ReadKey();
  160.                 // recursive
  161.                 kMean(nodeNumber, classNumber, nodes, classes);
  162.                 loopCount++;
  163.             }
  164.             if (recursiveFlag == 0)
  165.             {
  166.                 //System.Console.WriteLine("=================================");
  167.                 //System.Console.WriteLine("finish! recusive times : {0}",loopCount);
  168.                 showResult(nodes, nodeNumber, classes, classNumber);
  169.             }
  170.         }
  171.     }
  172.  
  173.  
  174.     // procedure for check the same coordinates
  175. }
');