java17 一维数据 k-means算法


K-means 算法是一种常见的聚类算法,以下是 Java 17 实现一维数据 K-means 算法的代码: ```java import java.util.ArrayList; import java.util.List; import java.util.Random; // KMeans 类用于执行一维数据的 K-means 聚类 class KMeans { private final int k; // 聚类的数量 private final int maxIterations; // 最大迭代次数 public KMeans(int k, int maxIterations) { this.k = k; this.maxIterations = maxIterations; } // 执行 K-means 聚类的主方法 public List<List<Double>> cluster(List<Double> data) { // 初始化质心 List<Double> centroids = initializeCentroids(data); List<List<Double>> clusters = null; for (int i = 0; i < maxIterations; i++) { // 根据当前质心分配数据点到各个聚类 clusters = assignClusters(data, centroids); // 更新质心 List<Double> newCentroids = updateCentroids(clusters); // 如果质心不再变化,停止迭代 if (centroids.equals(newCentroids)) { break; } centroids = newCentroids; } return clusters; } // 初始化质心,随机从数据中选择 k 个点作为初始质心 private List<Double> initializeCentroids(List<Double> data) { List<Double> centroids = new ArrayList<>(); Random random = new Random(); while (centroids.size() < k) { int index = random.nextInt(data.size()); double centroid = data.get(index); if (!centroids.contains(centroid)) { centroids.add(centroid); } } return centroids; } // 根据当前质心分配数据点到各个聚类 private List<List<Double>> assignClusters(List<Double> data, List<Double> centroids) { List<List<Double>> clusters = new ArrayList<>(); for (int i = 0; i < k; i++) { clusters.add(new ArrayList<>()); } for (double point : data) { int closestCentroidIndex = findClosestCentroid(point, centroids); clusters.get(closestCentroidIndex).add(point); } return clusters; } // 找到距离给定点最近的质心的索引 private int findClosestCentroid(double point, List<Double> centroids) { int closestIndex = 0; double minDistance = Double.MAX_VALUE; for (int i = 0; i < centroids.size(); i++) { double distance = Math.abs(point - centroids.get(i)); if (distance < minDistance) { minDistance = distance; closestIndex = i; } } return closestIndex; } // 更新质心,计算每个聚类的平均值作为新的质心 private List<Double> updateCentroids(List<List<Double>> clusters) { List<Double> newCentroids = new ArrayList<>(); for (List<Double> cluster : clusters) { if (cluster.isEmpty()) { newCentroids.add(0.0); } else { double sum = 0; for (double point : cluster) { sum += point; } newCentroids.add(sum / cluster.size()); } } return newCentroids; } } // 主类,用于测试 K-means 算法 public class KMeansOneDimensional { public static void main(String[] args) { // 一维数据 List<Double> data = List.of(1.0, 2.0, 3.0, 10.0, 11.0, 12.0, 20.0, 21.0, 22.0); int k = 3; // 聚类数量 int maxIterations = 100; // 最大迭代次数 KMeans kMeans = new KMeans(k, maxIterations); List<List<Double>> clusters = kMeans.cluster(data); // 输出聚类结果 for (int i = 0; i < clusters.size(); i++) { System.out.println("Cluster " + (i + 1) + ": " + clusters.get(i)); } } } ``` 代码说明: 1. KMeans 类:封装了 K-means 算法的核心逻辑,包括初始化质心、分配数据点到聚类、更新质心等方法。 2. initializeCentroids 方法:随机从数据中选择 `k` 个点作为初始质心。 3. assignClusters 方法:根据当前质心,将每个数据点分配到距离最近的质心所在的聚类。 4. updateCentroids 方法:计算每个聚类的平均值作为新的质心。 5. findClosestCentroid 方法:找到距离给定点最近的质心的索引。 6. KMeansOneDimensional 类:包含 `main` 方法,用于测试 K-means 算法。 额外需要注意的逻辑点: 1. 初始质心的选择:初始质心的选择会影响聚类结果,不同的初始质心可能导致不同的聚类结果。可以多次运行算法,选择最优的结果。 2. 空聚类的处理:在更新质心时,如果某个聚类为空,代码中简单地将其质心设为 0。在实际应用中,可能需要根据具体情况处理空聚类。 3. 最大迭代次数:设置最大迭代次数可以避免算法陷入无限循环。但如果最大迭代次数设置过小,可能导致算法提前终止,聚类结果不准确。 [2025-06-23 09:49:50 | AI写代码神器 | 1377点数解答]
- [ { "id": 1, "parentId": 0, "spread": true, "title": "数据", "path": "", "status": 1, "sort": 1, "parentTitle": null, "children": [ { "id": 2, "parentId": 1, "spread": false, "title": "项目-知识库", "path": "/cms/data/questionprolist.html", "status": 1, "sort": 2, "parentTitle": "数据", (603点数解答 | 2025-04-15 22:48:51)131
- a prime number is a number greater than one that is divisible only by 1 and by itself. that means that a prime number is positive. let's define a pseudo-prime number as a number that can be negative but also is divisible only by 1 and by absolute value of itself. write a function is_prime that checks if a number is pseudo-prime or not. the function returns 1 if number is pseudo-prime and -1 otherwise. the function should work correctly for any signed numbers.用c语言(364点数解答 | 2024-12-15 19:28:35)168
- java17 一维数据 k-means算法(1377点数解答 | 2025-06-23 09:49:50)72
- Java17 JFreeChart TimeSeriesChart 凌晨零点 用日期替代小时时间(824点数解答 | 2025-06-23 15:11:43)70
- java17 word poi-tl table 表头剧中 列1居中 内容居右(689点数解答 | 2025-06-26 11:33:34)132
- 搜索一下:1.内容 用visual c++ 6.0编程实现:首先任意输入一个大于2且小于10的整数n,再输入一个由n决定的二维整型数组(n×n)数据,形成n×n阶矩阵。接下来将矩阵中最大元素所在的行和最小元素所在的行进行对调,最后再将对调后的矩阵输出到屏幕上。 例如: 原始数据:n=4 结果数据: 1 2 3 4 8 11 14 16 3 5 9 10 3 5 9 10 8 11 14 16 1 2 3 4 15 2 7 6 15 2 7 6(648点数解答 | 2024-11-02 10:23:57)219
- 题目描述 请根据邮件的重量和用户选择是否加急计算邮费。计算规则: 重量在 1000 1000 以内(包括),基本费 8 8 元; 超过 1000 1000 克的部分,每 500 500 克加收超重费 4 4 元,不足 500 500 克部分按 500 500 克计算; 如果用户选择加急,多收 5 5 元。 输入格式 一行,包含一个正整数 x x 和一个字符 c(y 或 n),之间用一个空格隔开,分别表示重量和是否加急。 如果字符是 y,说明选择加急;如果字符是 n,说明不加急。 输出格式 输出一行一个正整数,表示邮费。 输入输出样例 输入 #1复制 1200 y 输出 #1复制 17 说明/提示 对于100%数据 1 ≤ x ≤ 1 0 6 1≤x≤10 6 在洛谷, 享受 coding 的欢乐(88点数解答 | 2024-11-09 15:33:30)285
- 题目描述 请根据邮件的重量和用户选择是否加急计算邮费。计算规则: 重量在 1000 1000 以内(包括),基本费 8 8 元; 超过 1000 1000 克的部分,每 500 500 克加收超重费 4 4 元,不足 500 500 克部分按 500 500 克计算; 如果用户选择加急,多收 5 5 元。 输入格式 一行,包含一个正整数 x x 和一个字符 c(y 或 n),之间用一个空格隔开,分别表示重量和是否加急。 如果字符是 y,说明选择加急;如果字符是 n,说明不加急。 输出格式 输出一行一个正整数,表示邮费。 输入输出样例 输入 #1复制 1200 y 输出 #1复制 17 说明/提示 对于100%数据 1 ≤ x ≤ 1 0 6 1≤x≤10 6 在洛谷, 享受 coding 的欢乐(554点数解答 | 2024-11-09 15:34:05)292
- 帮我用gee写代码,数据:1、连续三年的landsat逐月的数据(如针对2020年,则数据为2019.01-2021.12),完成去云;2、已有的研究区范围。 计算研究区范围内每个像素的landsat3年逐月的ndvi和mndwi指数,再针对ndvi和mndwi三年的时间序列数据分布按公式p(t)=a+bt+ccos(2π/t·t)+dsin(2π/t·t),t是julian date, t是365, 进行逐像素重建,每个像素分别得到ndvi和mndwi对应参数a、b、c、d、difference(最大值和最小值的差异)、mean(平均值),然后再去计算fndvi =(cndvi-dndvi + 1)x(meanndvi + 1)/differencendvi;fmndwi =(cmndwi-dmndwi+ 1)x(meanmndwi + 1)/differencemndwi;pwtmi= fndvi x fmndwi 其中cndvi代表ndvi时间序列中的参数c,cmndwi为mndwi时间序列中的参数c其他同理 保证代码在gee中能直接运行(1616点数解答 | 2024-11-26 19:55:20)190
- 1. 爬取和分析京东网站数据; 2. 用自己的学号作为项目名称; 3. 用搜索关键字爬取“京东网站”,并爬取“笔记本”商品的下列数据:商品名、价格、店铺名、评价数; 4. 将数据保存到 mongodb数据库中; 5. 用pandas工具包读取数据库中的数据进行下列分析,并用matplotlib可视化输出: a. 读取数据库中“笔记本”数据。 b. 预处理:将价格转换为浮点数,将评价数转换为整数。 c. 分析笔记本价格分布:直方图(x轴表示价格、y轴表示该价格区间的商品数量),添加样本总数说明。 d. 分析联想各型号笔记本的销售量和均价,绘制两个柱状图:x轴表示笔记本型号、y轴表示该笔记本销量或均价,并标明销量或均价值。(968点数解答 | 2024-12-12 00:20:07)161
- 数据,出题范围:小学4年级,题型:试卷一套,总分:100分(905点数解答 | 2024-12-20 14:11:43)205
- 请根据邮件的重量和用户选择是否加急计算邮费。计算规则: 重量在 1000 1000 以内(包括),基本费 8 8 元; 超过 1000 1000 克的部分,每 500 500 克加收超重费 4 4 元,不足 500 500 克部分按 500 500 克计算; 如果用户选择加急,多收 5 5 元。 输入格式 一行,包含一个正整数 x x 和一个字符 c(y 或 n),之间用一个空格隔开,分别表示重量和是否加急。 如果字符是 y,说明选择加急;如果字符是 n,说明不加急。 输出格式 输出一行一个正整数,表示邮费。 输入输出样例 输入 #1复制 1200 y 输出 #1复制 17 说明/提示 对于100%数据 1 ≤ x ≤ 1 0 6 1≤x≤10 6(244点数解答 | 2024-12-31 19:36:29)210