Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Scanner;
- import java.util.Vector;
- public class KMeans {
- static Scanner sc = new Scanner(System.in);
- static double dataSet[][];
- static int clusters;
- static double centroids[][];
- static double clusterDistanceArrays[][];
- static Vector al[];
- public static void getElements() {
- System.out.println("Enter the number of data elements: ");
- int n = sc.nextInt();
- dataSet = new double[n][];
- System.out.println("Enter the elements : ");
- for (int i = 0; i < dataSet.length; i++) {
- dataSet[i] = new double[2];
- dataSet[i][0] = sc.nextDouble();
- dataSet[i][1] = sc.nextDouble();
- }
- }
- public static void setCentroids() {
- for (int i = 0; i < clusters; i++) {
- centroids[i] = dataSet[i];
- }
- }
- public static void printCentroids() {
- int i = 0;
- for (double x[] : centroids) {
- System.out.print("centroids " + i + ": ");
- i++;
- for (double y : x) {
- System.out.print(y + " ");
- }
- System.out.println();
- }
- }
- public static void clusterDistanceArrays() {
- clusterDistanceArrays = new double[clusters][dataSet.length];
- }
- public static double findDistance(double a, double b, double x, double y) {
- //return Math.sqrt(Math.pow((2 - 1),2)+Math.pow((3 - 2), 2));
- return Math.sqrt(Math.pow((a - x), 2) + Math.pow((b - y), 2));
- }
- public static void calculateDistances() {
- for (int i = 0; i < centroids.length; i++) {
- for (int j = 0; j < dataSet.length; j++) {
- clusterDistanceArrays[i][j] = findDistance(dataSet[j][0], dataSet[j][1], centroids[i][0], centroids[i][1]);
- }
- }
- }
- public static void printDistances() {
- for (double x[] : clusterDistanceArrays) {
- for (double y : x) {
- System.out.print(y + " ");
- }
- System.out.println();
- }
- }
- public static void addIntoClusters() {
- // al = new Vector[clusters];
- initClusters();
- for (int i = 0; i < dataSet.length; i++) {
- int index = 0;
- double smallest = clusterDistanceArrays[0][i];
- for (int j = 1; j < centroids.length; j++) {
- if (smallest >= clusterDistanceArrays[j][i]) {
- index = j;
- smallest = clusterDistanceArrays[j][i];
- }
- }
- al[index].addElement(dataSet[i]);
- }
- }
- public static void updateCentroids() {
- for (int i = 0; i < al.length; i++) {
- double x[][] = new double[1][2];
- for (int j = 0; j < al[i].size(); j++) {
- double c[][] = new double[1][2];
- c[0] = (double[]) al[i].get(j);
- x[0][0] += c[0][0];
- x[0][1] += c[0][1];
- //System.out.print(Arrays.toString(c[0]));
- }
- x[0][0] = (double) (x[0][0] / al[i].size());
- x[0][1] = (double) (x[0][1] / al[i].size());
- centroids[i] = x[0];
- //System.out.println(x[0][0]+" "+x[0][1]);
- }
- }
- public static void printClusters() {
- for (int i = 0; i < al.length; i++) {
- System.out.print("cluster " + i + ": ");
- for (int j = 0; j < al[i].size(); j++) {
- double c[][] = new double[1][2];
- c[0] = (double[]) al[i].get(j);
- System.out.print(Arrays.toString(c[0]));
- }
- System.out.println();
- }
- }
- public static void initClusters() {
- al = new Vector[clusters];
- for (int i = 0; i < al.length; i++) {
- al[i] = new Vector(0);
- }
- }
- public static void main(String args[]) {
- getElements();
- System.out.println("Enter number of clusters: ");
- clusters = sc.nextInt();
- centroids = new double[clusters][2];
- initClusters();
- setCentroids();
- clusterDistanceArrays();
- for (int i = 0; i < 50; i++) {
- calculateDistances();
- addIntoClusters();
- updateCentroids();
- }
- System.out.println("The clusters: ");
- printClusters();
- System.out.println("Final Centroids: ");
- printCentroids();
- }
- }
- /*
- run:
- Enter the number of data elements:
- 8
- Enter the elements :
- 2 10
- 2 5
- 8 4
- 5 8
- 7 5
- 6 4
- 1 2
- 4 9
- Enter number of clusters:
- 3
- The clusters:
- cluster 0: [2.0, 10.0][5.0, 8.0][4.0, 9.0]
- cluster 1: [2.0, 5.0][1.0, 2.0]
- cluster 2: [8.0, 4.0][7.0, 5.0][6.0, 4.0]
- Final Centroids:
- centroids 0: 3.6666666666666665 9.0
- centroids 1: 1.5 3.5
- centroids 2: 7.0 4.333333333333333
- BUILD SUCCESSFUL (total time: 1 minute 3 seconds)
- */
Advertisement
Add Comment
Please, Sign In to add comment