Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void kMean(int nodeNumber, int classNumber, double[,] nodes, double[,] classes) // K-mean Algorithm
- {
- //
- // calculate the distance between the class and the coordinate .
- //
- int classNum = classes.GetLength(1);
- double[] point1 = new double[classes.GetLength(1)];
- double[] point2 = new double[classes.GetLength(1)];
- for (int user = 0; user < nodeNumber; user++)
- {
- double min = double.MaxValue;
- for (int attribute = 0; attribute < classes.GetLength(1); attribute++)
- {
- point1[attribute] = nodes[user, attribute];
- }
- for (int classsesTag = 0; classsesTag < classNumber; classsesTag++)
- {
- for (int classesAttribute = 0; classesAttribute < classes.GetLength(1); classesAttribute++)
- {
- point2[classesAttribute] = classes[classsesTag, classesAttribute];
- }
- double mindDistance = EuclideanDistance(point1,point2);
- if (mindDistance < min)
- {
- min = mindDistance;
- nodes[user,classNum] = classsesTag; // flag to set the group that the coordinate belong to.
- }
- }
- }
- //
- // calculate the new center class
- //
- double [,] tempClasses = new double[nodeNumber,nodes.GetLength(1)];
- for (int j = 0; j < classNumber; j++)
- {
- double [] tempCoordinate = new double[classes.GetLength(1)];
- for (int i = 0; i < nodeNumber; i++)
- {
- if (nodes[i,classNum] == j)
- {
- for (int tempNodes = 0; tempNodes < classes.GetLength(1); tempNodes++)
- {
- tempCoordinate[tempNodes] += nodes[i,tempNodes];
- }
- tempClasses[j, classes.GetLength(1)]++;
- }
- }
- if (tempClasses[j, classes.GetLength(1)] == 0)
- tempClasses[j, classes.GetLength(1)] = 1;
- for (int newCentral = 0; newCentral < classes.GetLength(1); newCentral++)
- {
- tempClasses[j, newCentral] = tempCoordinate[newCentral] / tempClasses[j, nodes.GetLength(1)-1];
- }
- }
- //System.Console.ReadKey();
- int k = 0;
- for (k = 0; k < classNumber; k++)
- {
- for (int checkEqual = 0; checkEqual < tempClasses.GetLength(1); checkEqual++)
- {
- if (tempClasses[k, checkEqual] != classes[k, checkEqual])
- {
- recursiveFlag = 1;
- goto checkBreak;
- }
- }
- }
- checkBreak: if (k >= classNumber)
- recursiveFlag = 0;
- if (recursiveFlag == 1)
- {
- for (int j = 0; j < classNumber; j++)
- {
- for (int newClasses = 0; newClasses < classes.GetLength(1); newClasses++)
- {
- classes[j, newClasses] = tempClasses[j, newClasses];
- }
- }
- // recursive
- kMean(nodeNumber, classNumber, nodes, classes);
- }
- if (recursiveFlag == 0)
- {
- //System.Console.WriteLine("=================================");
- //System.Console.WriteLine("finish! recusive times : {0}",loopCount);
- inserCSV(nodes, "clusterFinish");
- inserCSV(classes, "classesCentral");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment