【无标题】哈哈哈哈哈哈哈哈哈

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

class Point {
    double x;
    double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

public class KMeansClustering {
    private int k;
    private List<Point> points;
    private List<Point> centroids;

    public KMeansClustering(int k, List<Point> points) {
        this.k = k;
        this.points = points;
        centroids = new ArrayList<>();
    }

    public void run() {
        // 初始化质心
        initializeCentroids();

        boolean converged = false;
        while (!converged) {
            List<List<Point>> clusters = new ArrayList<>();
            for (int i = 0; i < k; i++) {
                clusters.add(new ArrayList<>());
            }

            // 分配点到最近的质心
            for (Point point : points) {
                int clusterIndex = findClosestCentroid(point);
                clusters.get(clusterIndex).add(point);
            }

            List<Point> newCentroids = new ArrayList<>();
            for (List<Point> cluster : clusters) {
                if (!cluster.isEmpty()) {
                    double sumX = 0;
                    double sumY = 0;
                    for (Point p : cluster) {
                        sumX += p.x;
                        sumY += p.y;
                    }
                    newCentroids.add(new Point(sumX / cluster.size(), sumY / cluster.size()));
                } else {
                    // 如果一个簇为空,随机选择一个点作为新质心
                    Random random = new Random();
                    int randomIndex = random.nextInt(points.size());
                    newCentroids.add(points.get(randomIndex));
                }
            }

            converged = true;
            for (int i = 0; i < k; i++) {
                if (!centroids.get(i).equals(newCentroids.get(i))) {
                    converged = false;
                    break;
                }
            }

            centroids = newCentroids;
        }
    }

    private int findClosestCentroid(Point point) {
        double minDistance = Double.MAX_VALUE;
        int closestCentroidIndex = 0;
        for (int i = 0; i < k; i++) {
            double distance = distance(point, centroids.get(i));
            if (distance < minDistance) {
                minDistance = distance;
                closestCentroidIndex = i;
            }
        }
        return closestCentroidIndex;
    }

    private double distance(Point p1, Point p2) {
        return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
    }

    private void initializeCentroids() {
        Random random = new Random();
        for (int i = 0; i < k; i++) {
            int randomIndex = random.nextInt(points.size());
            centroids.add(points.get(randomIndex));
        }
    }

    public List<Point> getCentroids() {
        return centroids;
    }

    public static void main(String[] args) {
        List<Point> points = new ArrayList<>();
        points.add(new Point(1, 1));
        points.add(new Point(1.5, 2));
        points.add(new Point(3, 4));
        points.add(new Point(5, 7));
        points.add(new Point(3.5, 5));
        points.add(new Point(4.5, 5));
        points.add(new Point(3.5, 4.5));

        int k = 3;
        KMeansClustering kMeans = new KMeansClustering(k, points);
        kMeans.run();
        List<Point> centroids = kMeans.getCentroids();
        for (int i = 0; i < centroids.size(); i++) {
            System.out.println("Centroid " + (i + 1) + ": (" + centroids.get(i).x + ", " + centroids.get(i).y + ")");
        }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

發財發財

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值