K均值聚类算法的Java版实现代码示例

让我来详细讲解“K均值聚类算法的Java版实现代码示例”的完整攻略。

1. K均值聚类算法简介

K均值聚类算法是一种常用的无监督机器学习算法,常用于数据挖掘、图像分割以及客户分类等场景中。它的基本原理是:将n个数据点划分成k个簇,使得每个点都属于其最近的中心点所在的簇,这些中心点是通过簇内点的平均值计算而得。

2. Java代码示例说明

对于Java程序员来说,实现K均值聚类算法可能并不容易,因此我们来看一下下面的Java代码示例说明。

2.1 示例一

public class KMeans {

    public static void main(String[] args) {
        int k = 3; // 设置簇的数目
        double[][] data = {{1.0, 1.0}, {1.5, 2.0}, {3.0, 4.0}, {5.0, 7.0}, {3.5, 5.0}, {4.5, 5.0}, {3.5, 4.5}}; // 将数据划分成2个簇

        int[] labels = cluster(data, k); // 聚类操作

        for (int i = 0; i < labels.length; i++) {
            System.out.println(Arrays.toString(data[i]) + " belongs to cluster " + labels[i]);
        }
    }

    public static int[] cluster(double[][] data, int k) {
        int n = data.length;
        int[] labels = new int[n];
        boolean changed = true;
        int[] centers = new int[k];
        for (int i = 0; i < k; i++) {
            centers[i] = (int) (Math.random() * n); // 随机生成聚类中心
        }
        while (changed) {
            changed = false;
            for (int i = 0; i < n; i++) {
                double minDist = Double.MAX_VALUE;
                for (int j = 0; j < k; j++) {
                    double dist = getDist(data[i], data[centers[j]]); // 计算数据点距离各聚类中心的距离
                    if (dist < minDist) {
                        labels[i] = j;
                        minDist = dist;
                    }
                }
            }
            for (int j = 0; j < k; j++) {
                double[] newCenter = new double[data[0].length];
                int count = 0;
                for (int i = 0; i < n; i++) {
                    if (labels[i] == j) {
                        for (int d = 0; d < newCenter.length; d++) {
                            newCenter[d] += data[i][d];
                        }
                        count++;
                    }
                }
                for (int d = 0; d < newCenter.length; d++) {
                    newCenter[d] /= count; // 更新聚类中心
                }
                if (getDist(data[centers[j]], newCenter) > 0.0001) {
                    changed = true;
                }
                centers[j] = findNearest(newCenter, data); // 找到数据中最近的点作为新的聚类中心
            }
        }
        return labels;
    }

    private static double getDist(double[] a, double[] b) {
        double dist = 0.0;
        for (int i = 0; i < a.length; i++) {
            dist += (a[i] - b[i]) * (a[i] - b[i]);
        }
        return Math.sqrt(dist);
    }

    private static int findNearest(double[] center, double[][] data) {
        int index = 0;
        double minDist = Double.MAX_VALUE;
        for (int i = 0; i < data.length; i++) {
            double dist = getDist(center, data[i]);
            if (dist < minDist) {
                index = i;
                minDist = dist;
            }
        }
        return index;
    }
}

代码解析:

该示例中,我们首先定义了一个KMeans类,其中包含了聚类方法cluster、计算两点距离的方法getDist,以及找到离给定点最近的点的方法findNearest等。在main方法中我们设置数据点数目和簇的数目,然后调用cluster方法进行聚类操作。在聚类结束后,我们将每个数据点的标签以及对应的簇打印出来。

2.2 示例二

下面是一个更为完整的Java代码示例:

import java.util.ArrayList;
import java.util.List;

public class KMeans {

    private final int k;

    private final int maxIter;

    private final List<double[]> data;

    private final List<c> centers;

    public KMeans(int k, int maxIter, List<double[]> data) {
        this.k = k;
        this.maxIter = maxIter;
        this.data = data;
        this.centers = new ArrayList<>();
    }

    public void run() {
        initialCenters();
        for (int i = 0; i < maxIter; i++) {
            cluster();
            updateCenter();
        }
    }

    private void initialCenters() {
        for (int i = 0; i < k; i++) {
            centers.add(new c(data.get(i)));
        }
    }

    private void cluster() {
        for (double[] point : data) {
            c nearestCenter = null;
            double minDist = Double.MAX_VALUE;
            for (c center : centers) {
                double dist = center.dist(point);
                if (dist < minDist) {
                    nearestCenter = center;
                    minDist = dist;
                }
            }
            nearestCenter.addPoint(point);
        }
    }

    private void updateCenter() {
        for (c center : centers) {
            center.update();
        }
    }

    private static class c {

        private final double[] center;

        private final List<double[]> points;

        public c(double[] center) {
            this.center = center;
            this.points = new ArrayList<>();
        }

        public void addPoint(double[] point) {
            points.add(point);
        }

        public void update() {
            for (int i = 0; i < center.length; i++) {
                double sum = 0.0;
                for (double[] point : points) {
                    sum += point[i];
                }
                if (points.size() > 0) {
                    center[i] = sum / points.size();
                }
            }
        }

        public double dist(double[] point) {
            double dist = 0.0;
            for (int i = 0; i < center.length; i++) {
                dist += (center[i] - point[i]) * (center[i] - point[i]);
            }
            return Math.sqrt(dist);
        }
    }

    public static void main(String[] args) {
        List<double[]> data = new ArrayList<>();
        data.add(new double[]{1.0, 1.0});
        data.add(new double[]{1.5, 2.0});
        data.add(new double[]{3.0, 4.0});
        data.add(new double[]{5.0, 7.0});
        data.add(new double[]{3.5, 5.0});
        data.add(new double[]{4.5, 5.0});
        data.add(new double[]{3.5, 4.5});

        KMeans kMeans = new KMeans(2, 10, data);
        kMeans.run();

        for (int i = 0; i < kMeans.centers.size(); i++) {
            System.out.println("Cluster " + (i + 1) + ": " + kMeans.centers.get(i));
        }
    }
}

代码解析:

在该示例中,我们首先定义了一个KMeans类,其中包含了计算两点距离的方法dist,以及代表中心点的类c。在main方法中我们设置数据点数目和簇的数目,然后调用KMeans类进行聚类操作。在聚类结束后,我们将每个簇的中心坐标打印出来。

3. 总结

综上所述,K均值聚类算法的Java版实现并不复杂,而且在Java中也有很多现成的工具库可以供我们使用,例如Apache Mahout、Weka等。但是为了更好地理解该算法的原理和实现思路,我们还是需要亲自动手写一下。

通过本文的讲解,我相信你已经对K均值聚类算法的Java版实现有了更深入的了解,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:K均值聚类算法的Java版实现代码示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解Java编程中统一资源定位符URL的相关使用

    详解Java编程中统一资源定位符(URL)的相关使用 在Java编程中,统一资源定位符(URL)是一个非常重要的概念,它用于表示因特网上的资源地址。在Java中,可以通过URL类来处理URL地址。本文将详细讲解Java编程中URL的相关使用,并给出两个示例来说明。 URL类的概述 URL类是Java中用于处理URL地址的类,其位于java.net包中。对于一…

    Java 2023年6月15日
    00
  • 基于Java的Scoket编程

    下面我将为你详细讲解“基于Java的Socket编程”的完整攻略。 Socket编程简介 Socket编程是指利用Socket套接字来进行网络通信的一种编程方式。在这种编程方式中,一个程序可以充当客户端与远程服务器进行通信,也可以充当服务器同时与多个客户端进行通信。 Socket编程流程 Socket编程的一般流程如下: 创建Socket对象,指定连接的服务…

    Java 2023年5月24日
    00
  • 详解IDEA创建Tomcat8源码工程流程

    下面是详解IDEA创建Tomcat8源码工程流程的完整攻略。 1. 下载并导入Tomcat8源码 首先,需要前往Tomcat官网下载Tomcat8源码,并解压到本地。然后,在IntelliJ IDEA中选择“File” > “New” > “Project from Existing Sources”打开源码文件夹,依次点击“Next”,在询问是…

    Java 2023年5月19日
    00
  • Spring Boot 底层原理基础深度解析

    Spring Boot 底层原理基础深度解析 Spring Boot 是一款基于 Spring 框架的开发框架,它的出现极大地提高了开发效率。本篇文章将从底层原理入手,对 Spring Boot 的实现机制进行深度解析。 Spring Boot 的核心概念 Spring Boot 的核心概念包括自动装配、起步依赖和 SpringApplication。其中,…

    Java 2023年5月15日
    00
  • ubuntu 14.04 安装 apache ant教程

    Ubuntu 14.04 安装 Apache Ant教程 Apache Ant是Apache软件基金会的一个软件项目,是一款Java开发工具,主要用于Java应用程序的自动化构建和部署。 系统要求 Ubuntu 14.04操作系统 Java JDK 1.7或1.8 安装步骤 安装Java 首先,安装Java JDK 1.7或1.8。在终端中输入以下命令: s…

    Java 2023年6月2日
    00
  • java开发之File类详细使用方法介绍

    Java开发之File类详细使用方法介绍 在Java开发中,File类是一个十分重要的类,它主要用于文件和目录的操作。在本文中,我们将详细介绍File类的各种使用方法,帮助读者更好地掌握Java文件和目录管理相关知识。 File类的基本用法 创建File对象 要操作文件或目录,首先需要创建File对象。有以下几种创建方法: // 创建一个文件 File fi…

    Java 2023年5月20日
    00
  • Eclipse怎么创建jsp页面并导入el表达式?

    创建JSP页面并导入EL表达式的流程分为如下几步: 1. 创建动态Web项目 在Eclipse中,选择“File”->“New”->“Dynamic Web Project”,填写项目名称,选择合适的Target runtime,点击“Finish”创建新的Web项目。 2. 创建JSP页面 在项目的“WebContent”文件夹下,右键选择“N…

    Java 2023年6月15日
    00
  • SpringMVC的简单传值(实现代码)

    下面是关于“SpringMVC的简单传值(实现代码)”的攻略,包含了示例说明。 一、简介 SpringMVC是一种基于MVC(Model-View-Controller)的Web框架,我们可以使用它来开发Java Web应用程序。SpringMVC有很多特性,其中之一就是通过控制器将数据从视图传递到模型,从而实现传值的功能。 在SpringMVC中,我们可以…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部