Guest User

Untitled

a guest
Feb 6th, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.96 KB | None | 0 0
  1. private void kMean(int nodeNumber, int classNumber, double[,] nodes, double[,] classes) // K-mean Algorithm
  2.         {
  3.             //
  4.             // calculate the distance between the class and the coordinate .
  5.             //
  6.             int classNum = classes.GetLength(1);
  7.             double[] point1 = new double[classes.GetLength(1)];
  8.             double[] point2 = new double[classes.GetLength(1)];
  9.             for (int user = 0; user < nodeNumber; user++)
  10.             {
  11.                 double min = double.MaxValue;
  12.                 for (int attribute = 0; attribute < classes.GetLength(1); attribute++)
  13.                 {
  14.                     point1[attribute] = nodes[user, attribute];
  15.                 }
  16.                     for (int classsesTag = 0; classsesTag < classNumber; classsesTag++)
  17.                     {
  18.                         for (int classesAttribute = 0; classesAttribute < classes.GetLength(1); classesAttribute++)
  19.                         {
  20.                             point2[classesAttribute] = classes[classsesTag, classesAttribute];
  21.                         }
  22.                         double mindDistance = EuclideanDistance(point1,point2);
  23.                         if (mindDistance < min)
  24.                         {
  25.                             min = mindDistance;
  26.                             nodes[user,classNum] = classsesTag; // flag to set the group that the coordinate belong to.
  27.                         }
  28.                     }
  29.             }
  30.             //
  31.             // calculate the new center class
  32.             //
  33.             double [,] tempClasses = new double[nodeNumber,nodes.GetLength(1)];
  34.             for (int j = 0; j < classNumber; j++)
  35.             {
  36.                 double [] tempCoordinate = new double[classes.GetLength(1)];
  37.                 for (int i = 0; i < nodeNumber; i++)
  38.                 {
  39.                     if (nodes[i,classNum] == j)
  40.                     {
  41.                         for (int tempNodes = 0; tempNodes < classes.GetLength(1); tempNodes++)
  42.                         {
  43.                             tempCoordinate[tempNodes] += nodes[i,tempNodes];
  44.                         }
  45.                         tempClasses[j, classes.GetLength(1)]++;
  46.                     }
  47.                 }
  48.                 if (tempClasses[j, classes.GetLength(1)] == 0)
  49.                     tempClasses[j, classes.GetLength(1)] = 1;
  50.                 for (int newCentral = 0; newCentral < classes.GetLength(1); newCentral++)
  51.                 {
  52.                     tempClasses[j, newCentral] = tempCoordinate[newCentral] / tempClasses[j, nodes.GetLength(1)-1];
  53.                 }
  54.             }
  55.             //System.Console.ReadKey();
  56.             int k = 0;
  57.             for (k = 0; k < classNumber; k++)
  58.             {
  59.                 for (int checkEqual = 0; checkEqual < tempClasses.GetLength(1); checkEqual++)
  60.                 {
  61.                     if (tempClasses[k, checkEqual] != classes[k, checkEqual])
  62.                     {
  63.                         recursiveFlag = 1;
  64.                         goto checkBreak;
  65.                      }
  66.                  }
  67.             }
  68. checkBreak: if (k >= classNumber)
  69.                 recursiveFlag = 0;
  70.             if (recursiveFlag == 1)
  71.             {
  72.                 for (int j = 0; j < classNumber; j++)
  73.                 {
  74.                     for (int newClasses = 0; newClasses < classes.GetLength(1); newClasses++)
  75.                     {
  76.                         classes[j, newClasses] = tempClasses[j, newClasses];
  77.                     }
  78.                 }
  79.                 // recursive
  80.                 kMean(nodeNumber, classNumber, nodes, classes);
  81.             }
  82.             if (recursiveFlag == 0)
  83.             {
  84.                 //System.Console.WriteLine("=================================");
  85.                 //System.Console.WriteLine("finish! recusive times : {0}",loopCount);
  86.                 inserCSV(nodes, "clusterFinish");
  87.                 inserCSV(classes, "classesCentral");
  88.             }
  89.         }
Advertisement
Add Comment
Please, Sign In to add comment