K-Means Clustering Algorithm > Java Program

K-Means Clustering Algorithm > Java Program

Data Warehousing and Mining


Program:

import java.util.*;

class k_means {


    static int count1, count2, count3;
    static int d[];
    static int k[][];
    static int tempk[][];
    static double m[];
    static double diff[];
    static int n, p;

    static int cal_diff(int a) // This method will determine the cluster in which an element go at a particular step.
    {
        int temp1 = 0;
        for (int i = 0; i < p; ++i) {
            if (a > m[i]) {
                diff[i] = a - m[i];
            } else {
                diff[i] = m[i] - a;
            }
        }
        int val = 0;
        double temp = diff[0];
        for (int i = 0; i < p; ++i) {
            if (diff[i] < temp) {
                temp = diff[i];
                val = i;
            }
        }//end of for loop
        return val;
    }

    static void cal_mean() // This method will determine intermediate mean values
    {
        for (int i = 0; i < p; ++i) {
            m[i] = 0; // initializing means to 0
        }
        int cnt = 0;
        for (int i = 0; i < p; ++i) {
            cnt = 0;
            for (int j = 0; j < n - 1; ++j) {
                if (k[i][j] != -1) {
                    m[i] += k[i][j];
                    ++cnt;
                }
            }
            m[i] = m[i] / cnt;
        }
    }

    static int check1() // This checks if previous k ie. tempk and current k are same.Used as terminating case.
    {
        for (int i = 0; i < p; ++i) {
            for (int j = 0; j < n; ++j) {
                if (tempk[i][j] != k[i][j]) {
                    return 0;
                }
            }
        }
        return 1;
    }

    public static void main(String args[]) {
        Scanner scr = new Scanner(System.in);
        /* Accepting number of elements */
        System.out.println("Enter the number of elements ");
        n = scr.nextInt();
        d = new int[n];
        /* Accepting elements */
        System.out.println("Enter " + n + " elements: ");
        for (int i = 0; i < n; ++i) {
            d[i] = scr.nextInt();
        }
        /* Accepting num of clusters */
        System.out.println("Enter the number of clusters: ");
        p = scr.nextInt();
        /* Initialising arrays */
        k = new int[p][n];
        tempk = new int[p][n];
        m = new double[p];
        diff = new double[p];
        /* Initializing m */
        for (int i = 0; i < p; ++i) {
            m[i] = d[i];
        }

        int temp = 0;
        int flag = 0;
        do {
            for (int i = 0; i < p; ++i) {
                for (int j = 0; j < n; ++j) {
                    k[i][j] = -1;
                }
            }
            for (int i = 0; i < n; ++i) // for loop will cal cal_diff(int) for every element.
            {
                temp = cal_diff(d[i]);
                if (temp == 0) {
                    k[temp][count1++] = d[i];
                } else {
                    if (temp == 1) {
                        k[temp][count2++] = d[i];
                    } else {
                        if (temp == 2) {
                            k[temp][count3++] = d[i];
                        }
                    }
                }
            }
            cal_mean(); // call to method which will calculate mean at this step.
            flag = check1(); // check if terminating condition is satisfied.
            if (flag != 1) /*Take backup of k in tempk so that you can check for equivalence in next step*/ {
                for (int i = 0; i < p; ++i) {
                    for (int j = 0; j < n; ++j) {
                        tempk[i][j] = k[i][j];
                    }
                }
            }

            System.out.println("\n\nAt this step");
            System.out.println("\nValue of clusters");
            for (int i = 0; i < p; ++i) {
                System.out.print("K" + (i + 1) + "{ ");
                for (int j = 0; k[i][j] != -1 && j < n - 1; ++j) {
                    System.out.print(k[i][j] + " ");
                }
                System.out.println("}");
            }//end of for loop
            System.out.println("\nValue of m ");
            for (int i = 0; i < p; ++i) {
                System.out.print("m" + (i + 1) + "=" + m[i] + "  ");
            }

            count1 = 0;
            count2 = 0;
            count3 = 0;
        } while (flag == 0);

        System.out.println("\n\n\nThe Final Clusters By Kmeans are as follows: ");
        for (int i = 0; i < p; ++i) {
            System.out.print("K" + (i + 1) + "{ ");
            for (int j = 0; k[i][j] != -1 && j < n - 1; ++j) {
                System.out.print(k[i][j] + " ");
            }
            System.out.println("}");
        }
    }
}
/*
OUTPUT
C:\Users\Prat\Desktop\Prat>javac k_means.java
C:\Users\Prat\Desktop\Prat>java k_means
Enter the number of elements
8
Enter 8 elements:
2 3 6 8 12 15 18 22
Enter the number of clusters:
3

At this step
Value of clusters
K1{ 2 }
K2{ 3 }
K3{ 6 8 12 15 18 22 }
Value of m
m1=2.0  m2=3.0  m3=13.5

At this step
Value of clusters
K1{ 2 }
K2{ 3 6 8 }
K3{ 12 15 18 22 }
Value of m
m1=2.0  m2=5.666666666666667  m3=16.75

At this step
Value of clusters
K1{ 2 3 }
K2{ 6 8 }
K3{ 12 15 18 22 }
Value of m
m1=2.5  m2=7.0  m3=16.75

At this step
Value of clusters
K1{ 2 3 }
K2{ 6 8 }
K3{ 12 15 18 22 }
Value of m
m1=2.5  m2=7.0  m3=16.75

The Final Clusters By Kmeans are as follows:
K1{ 2 3 }
K2{ 6 8 }
K3{ 12 15 18 22 } */

Comments

Popular posts from this blog

Intermediate Code Generation > C Program