21xrx.com
2024-12-22 21:20:13 Sunday
登录
文章检索 我的文章 写文章
Kmeans算法的Java实现
2023-10-29 17:10:32 深夜i     --     --
Kmeans算法 Java实现 聚类分析 数据挖掘 无监督学习

Kmeans算法是一种常用的聚类算法,它将数据集分为预先确定的K个类,每个数据点被划分到与其最接近的类中。这个算法的实现可以帮助我们更好地理解和应用聚类算法。

在Java中,我们可以使用以下步骤来实现Kmeans算法:

1. 初始化:首先,我们需要初始化K个聚类中心点。这些中心点可以是随机选择的,也可以根据一些启发式算法选择。

2. 分配:对于每个数据点,根据其与每个聚类中心点之间的距离,将其分配给最近的聚类。

3. 更新:对于每个聚类,计算其新的中心点位置,即将该聚类中的所有数据点的均值作为新的中心点。

4. 重复:重复步骤2和步骤3,直到达到收敛条件,即聚类中心点的变化小于某个阈值或达到最大迭代次数。

接下来,让我们来看一下Java代码的实现。


import java.util.ArrayList;

import java.util.List;

public class Kmeans {

  

  private List<DataPoint> dataPoints;

  private int k;

  private List<Cluster> clusters;

  public Kmeans(List<DataPoint> dataPoints, int k) {

    this.dataPoints = dataPoints;

    this.k = k;

    this.clusters = new ArrayList<>();

    // 初始化聚类中心点

    for (int i = 0; i < k; i++) {

      Cluster cluster = new Cluster(dataPoints.get(i));

      clusters.add(cluster);

    }

  }

  public void run() {

    while (true) {

      // 分配数据点到最近的聚类

      for (DataPoint dataPoint : dataPoints) {

        double minDistance = Double.MAX_VALUE;

        Cluster nearestCluster = null;

        for (Cluster cluster : clusters) {

          double distance = Math.sqrt(Math.pow(dataPoint.getX() - cluster.getCenter().getX(), 2)

              + Math.pow(dataPoint.getY() - cluster.getCenter().getY(), 2));

          if (distance < minDistance)

            minDistance = distance;

            nearestCluster = cluster;

          

        }

        nearestCluster.getPoints().add(dataPoint);

      }

      // 更新聚类中心点

      boolean centerChanged = false;

      for (Cluster cluster : clusters) {

        double sumX = 0;

        double sumY = 0;

        for (DataPoint dataPoint : cluster.getPoints()) {

          sumX += dataPoint.getX();

          sumY += dataPoint.getY();

        }

        double newCenterX = sumX / cluster.getPoints().size();

        double newCenterY = sumY / cluster.getPoints().size();

        if (newCenterX != cluster.getCenter().getX() || newCenterY != cluster.getCenter().getY())

          centerChanged = true;

        

        cluster.getCenter().setX(newCenterX);

        cluster.getCenter().setY(newCenterY);

      }

      if (!centerChanged)

        break;

      

    }

  }

  public List<Cluster> getClusters()

    return clusters;

  

  public static void main(String[] args) {

    List<DataPoint> dataPoints = new ArrayList<>();

    dataPoints.add(new DataPoint(1, 2));

    dataPoints.add(new DataPoint(2, 2));

    dataPoints.add(new DataPoint(3, 3));

    dataPoints.add(new DataPoint(8, 7));

    dataPoints.add(new DataPoint(9, 8));

    dataPoints.add(new DataPoint(10, 9));

    int k = 2;

    Kmeans kmeans = new Kmeans(dataPoints, k);

    kmeans.run();

    List<Cluster> clusters = kmeans.getClusters();

    for (int i = 0; i < clusters.size(); i++) {

      System.out.println("Cluster " + (i + 1) + ":");

      for (DataPoint dataPoint : clusters.get(i).getPoints()) {

        System.out.println(dataPoint);

      }

      System.out.println();

    }

  }

}

这是一个简单的Kmeans算法的Java实现。我们首先定义了DataPoint类来表示数据点,其中包含X和Y两个坐标。然后,在Kmeans类中,我们定义了Cluster类来表示聚类,其中包含中心点和属于该聚类的数据点列表。在算法的主要逻辑中,我们使用一个循环来不断分配数据点和更新聚类中心点,直到达到收敛条件为止。最后,在main方法中,我们可以看到如何使用这个算法来对一组数据点进行聚类,并输出结果。

通过这个Java实现,我们可以更好地理解和应用Kmeans算法,并在实际的数据分析和机器学习中使用它来发现数据中的模式和结构。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复