聚类算法 kmeans java 实现

本文介绍了使用Java编程实现K-Means聚类算法的过程,通过设定两个初始聚类中心并进行十次迭代,展示算法的运行效果。
摘要由CSDN通过智能技术生成

下图为k-means 算法指定2 个聚类中心,迭代十次得到的结果

这里写图片描述

package com.yc;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

public class KMeans {
   
    private static final String fileName = "points.txt";
    private static final String resultFileName = "result.txt";
    private static final int k = 2;
    private static final int n = 10;
    private static Location[] center = new Location[k];
    private static List<List<Point>> microCluster = new CopyOnWriteArrayList<>();

    static class Location {
        private List<Double> location;// 点的坐标

        public Location(List<Double> location) {
            this.location = location;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                    + ((location == null) ? 0 : location.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Locatio
我可以回答这个问题。K-means算法是一种常用的聚类算法,可以用Java语言实现。以下是一个简单的K-means Java代码示例: ``` import java.util.ArrayList; import java.util.List; import java.util.Random; public class KMeans { private int k; // 聚类数 private List<Point> points; // 数据点 private List<Cluster> clusters; // 聚类结果 public KMeans(int k, List<Point> points) { this.k = k; this.points = points; this.clusters = new ArrayList<>(); } public void cluster() { // 随机初始化聚类中心 Random random = new Random(); for (int i = 0; i < k; i++) { Point center = points.get(random.nextInt(points.size())); Cluster cluster = new Cluster(center); clusters.add(cluster); } // 迭代聚类 boolean changed = true; while (changed) { changed = false; // 清空聚类结果 for (Cluster cluster : clusters) { cluster.clear(); } // 将每个数据点归入最近的聚类中心 for (Point point : points) { Cluster nearestCluster = null; double minDistance = Double.MAX_VALUE; for (Cluster cluster : clusters) { double distance = point.distanceTo(cluster.getCenter()); if (distance < minDistance) { minDistance = distance; nearestCluster = cluster; } } nearestCluster.addPoint(point); } // 更新聚类中心 for (Cluster cluster : clusters) { if (cluster.updateCenter()) { changed = true; } } } } public List<Cluster> getClusters() { return clusters; } } class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public double distanceTo(Point other) { double dx = x - other.x; double dy = y - other.y; return Math.sqrt(dx * dx + dy * dy); } } class Cluster { private Point center; private List<Point> points; public Cluster(Point center) { this.center = center; this.points = new ArrayList<>(); } public Point getCenter() { return center; } public void addPoint(Point point) { points.add(point); } public void clear() { points.clear(); } public boolean updateCenter() { if (points.isEmpty()) { return false; } double sumX = 0; double sumY = 0; for (Point point : points) { sumX += point.getX(); sumY += point.getY(); } double newCenterX = sumX / points.size(); double newCenterY = sumY / points.size(); if (newCenterX == center.getX() && newCenterY == center.getY()) { return false; } center = new Point(newCenterX, newCenterY); return true; } } ``` 这段代码实现了K-means算法的基本流程,包括随机初始化聚类中心、迭代聚类、更新聚类中心等。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值