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

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 + ")");

}

}

}

相关推荐
C++ 老炮儿的技术栈6 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程6 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力6 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣8 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1118 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪8 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾19 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程10 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)11 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
Tairitsu_H12 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象