Java手写聚类算法
Java手写聚类算法
1. 算法思维导图
以下是聚类算法的实现原理的思维导图,使用Mermanid代码表示:
2. 该算法的手写必要性和市场调查
手写聚类算法的必要性在于深入理解聚类算法的原理和实现细节。通过手写实现聚类算法,可以加深对算法的理解,并且可以根据实际需求进行定制化的改进。
市场调查显示,聚类算法在数据挖掘、机器学习和人工智能领域有广泛的应用。聚类算法能够将相似的数据点归为一类,帮助人们发现数据中的模式和规律,从而为决策和分析提供支持。因此,掌握并理解聚类算法的实现原理和应用场景对于从事相关领域的人员来说是非常重要的。
3. 该算法手写实现的详细介绍和步骤
3.1 算法步骤
- 初始化数据集:将待聚类的数据集加载到内存中。
- 选择初始聚类中心:从数据集中随机选择K个样本作为初始聚类中心。
- 计算样本与聚类中心的距离:对于每个样本,计算其与各个聚类中心的距离,并将样本分配到距离最近的聚类中心。
- 更新样本的聚类标签:根据样本与聚类中心的距离,更新样本的聚类标签。
- 更新聚类中心:对于每个聚类,计算其所有样本的均值,并将该均值作为新的聚类中心。
- 重复步骤3至5,直到聚类中心不再改变。
3.2 代码实现
下面是Java中手写的K-means聚类算法的代码实现:
// 导入所需的库
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class KMeans {private int k; // 聚类数private List<double[]> data; // 数据集private List<double[]> centers; // 聚类中心public KMeans(int k, List<double[]> data) {this.k = k;this.data = data;this.centers = new ArrayList<>();}// 初始化聚类中心private void initCenters() {// 从数据集中随机选择k个样本作为初始聚类中心int n = data.size();List<Integer> indices = new ArrayList<>();for (int i = 0; i < n; i++) {indices.add(i);}Collections.shuffle(indices);for (int i = 0; i < k; i++) {centers.add(data.get(indices.get(i)));}}// 计算欧氏距离private double distance(double[] a, double[] b) {double sum = 0;for (int i = 0; i < a.length; i++) {sum += Math.pow(a[i] - b[i], 2);}return Math.sqrt(sum);}// 更新样本的聚类标签private void updateLabels() {for (double[] point : data) {double minDistance = Double.MAX_VALUE;int label = -1;for (int i = 0; i < k; i++) {double distance = distance(point, centers.get(i));if (distance < minDistance) {minDistance = distance;label = i;}}point[point.length - 1] = label;}}// 更新聚类中心private void updateCenters() {Map<Integer, List<double[]>> clusters = new HashMap<>();for (int i = 0; i < k; i++) {clusters.put(i, new ArrayList<>());}for (double[] point : data) {int label = (int) point[point.length - 1];clusters.get(label).add(point);}for (int i = 0; i < k; i++) {List<double[]> cluster = clusters.get(i);double[] center = new double[data.get(0).length - 1];for (double[] point : cluster) {for (int j = 0; j < center.length; j++) {center[j] += point[j];}}for (int j = 0; j < center.length; j++) {center[j] /= cluster.size();}centers.set(i, center);}}// 执行K-means聚类算法public void run() {initCenters();boolean converged = false;while (!converged) {updateLabels();List<double[]> oldCenters = new ArrayList<>(centers);updateCenters();converged = centers.equals(oldCenters);}}
}
4. 该算法的手写实现总结和思维拓展
通过手写实现K-means聚类算法,我们深入理解了算法的原理和实现细节。我们了解到,K-means算法通过迭代更新样本的聚类标签和聚类中心,直到聚类中心不再改变,从而实现聚类的目的。
思维拓展:K-means算法是一种基础的聚类算法,还有许多其他的聚类算法可以进一步学习和探索,例如DBSCAN、层次聚类等。此外,可以尝试使用不同的距离度量方法、聚类评估指标等来改进和扩展聚类算法。
5. 该算法的完整代码
下面是K-means聚类算法的完整代码,每行代码都有注释说明:
// 导入所需的库
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class KMeans {private int k; // 聚类数private List<double[]> data; // 数据集private List<double[]> centers; // 聚类中心public KMeans(int k, List<double[]> data) {this.k= k;this.data = data;this.centers = new ArrayList<>();}// 初始化聚类中心private void initCenters() {// 从数据集中随机选择k个样本作为初始聚类中心int n = data.size();List<Integer> indices = new ArrayList<>();for (int i = 0; i < n; i++) {indices.add(i);}Collections.shuffle(indices);for (int i = 0; i < k; i++) {centers.add(data.get(indices.get(i)));}}// 计算欧氏距离private double distance(double[] a, double[] b) {double sum = 0;for (int i = 0; i < a.length; i++) {sum += Math.pow(a[i] - b[i], 2);}return Math.sqrt(sum);}// 更新样本的聚类标签private void updateLabels() {for (double[] point : data) {double minDistance = Double.MAX_VALUE;int label = -1;for (int i = 0; i < k; i++) {double distance = distance(point, centers.get(i));if (distance < minDistance) {minDistance = distance;label = i;}}point[point.length - 1] = label;}}// 更新聚类中心private void updateCenters() {Map<Integer, List<double[]>> clusters = new HashMap<>();for (int i = 0; i < k; i++) {clusters.put(i, new ArrayList<>());}for (double[] point : data) {int label = (int) point[point.length - 1];clusters.get(label).add(point);}for (int i = 0; i < k; i++) {List<double[]> cluster = clusters.get(i);double[] center = new double[data.get(0).length - 1];for (double[] point : cluster) {for (int j = 0; j < center.length; j++) {center[j] += point[j];}}for (int j = 0; j < center.length; j++) {center[j] /= cluster.size();}centers.set(i, center);}}// 执行K-means聚类算法public void run() {initCenters();boolean converged = false;while (!converged) {updateLabels();List<double[]> oldCenters = new ArrayList<>(centers);updateCenters();converged = centers.equals(oldCenters);}}
}
手写总结
K-means聚类算法是一种基础的聚类算法,通过迭代更新样本的聚类标签和聚类中心来实现聚类的目的。算法的步骤如下:
- 初始化聚类中心:从数据集中随机选择k个样本作为初始聚类中心。
- 更新样本的聚类标签:计算每个样本与聚类中心的距离,将样本分配到距离最近的聚类中心对应的簇。
- 更新聚类中心:根据每个簇中的样本,计算新的聚类中心。
- 判断是否收敛:判断新的聚类中心与旧的聚类中心是否相等,如果相等则算法收敛,否则继续迭代。
- 重复步骤2-4,直到聚类中心不再改变。
K-means聚类算法的优点是简单、易于实现,并且在处理大规模数据集时具有较高的效率。然而,该算法对初始聚类中心的选择敏感,可能会陷入局部最优解。因此,可以采用多次运行算法并选择最优结果的方法来提高聚类的准确性。
通过手写实现K-means聚类算法,我们深入理解了算法的原理和实现细节。在实际应用中,可以根据具体问题的需求和特点,对算法进行改进和扩展,例如使用不同的距离度量方法、聚类评估指标等。此外,还可以进一步学习和探索其他聚类算法,如DBSCAN、层次聚类等,以应对更复杂的聚类任务。
相关文章:
Java手写聚类算法
Java手写聚类算法 1. 算法思维导图 以下是聚类算法的实现原理的思维导图,使用Mermanid代码表示: #mermaid-svg-AK9EgYRS38PkRJI4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AK9EgYRS38…...
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
目录 CAS什么是CASCAS的应用ABA问题异常举例 Synchronized 原理基本特征加锁过程偏向锁轻量级锁重量级锁 其他优化操作锁消除锁粗化 CAS 什么是CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,CAS涉及如下操作: 假设内存中的原数据…...
solid works草图绘制与设置零件特征的使用说明
(1)草图绘制 • 草图块 在 FeatureManager 设计树中,您可以隐藏和显示草图的单个块。您还可以查看块是欠定义 (-)、过定义 () 还是完全定义。 要隐藏和显示草图的单个块,请在 FeatureManager 设计树中右键单击草图块,…...
vue3使用router.push()页面跳转后,该页面不刷新问题
文章目录 原因分析最优解决 原因分析 这是一个常见问题,当使用push的时候,会向history栈添加一个新记录,这个时候,再添加一个完全相同的路由时,就不会再次刷新了 最优解决 在页面跳转时加上params参数时间 router.…...
如何理解数字工厂管理系统的本质
随着科技的飞速发展和数字化转型的推动,数字工厂管理系统逐渐成为工业4.0时代的重要工具。数字工厂系统旨在整合和优化工厂运营的各个环节,通过实时数据分析和处理,提升生产效率,降低成本,并增强企业的整体竞争力。为了…...
笔记1.3 数据交换
如何实现数据通过网络核心从源主机到达目的主机? 数据交换 交换网络: 动态转接动态分配传输资源 数据交换类型: (1)电路交换 (2)报文交换 (3)分组交换 电路交换的特…...
实时车辆行人多目标检测与跟踪系统(含UI界面,Python代码)
算法架构: 目标检测:yolov5 目标跟踪:OCSort其中, Yolov5 带有详细的训练步骤,可以根据训练文档,训练自己的数据集,及其方便。 另外后续 目标检测会添加 yolov7 、yolox,目标跟踪会…...
谷歌AI机器人Bard发布强大更新,支持插件功能并增强事实核查;全面整理高质量的人工智能、机器学习、大数据等技术资料
🦉 AI新闻 🚀 谷歌AI机器人Bard发布强大更新,支持插件功能并增强事实核查 摘要:谷歌的人工智能聊天机器人Bard发布了一项重大更新,增加了对谷歌应用的插件支持,包括 Gmail、Docs、Drive 等,并…...
NI SCXI-1125 数字量控制模块
NI SCXI-1125 是 NI(National Instruments)生产的数字量控制模块,通常用于工业自动化和控制系统中,以进行数字输入和输出控制。以下是该模块的一些主要产品特点: 数字量输入:SCXI-1125 模块通常具有多个数字…...
链表oj题1(Leetcode)——移除链表元素,反转链表,链表的中间节点,
链表OJ 一,移除链表元素1.1分析1.2代码 二,找到链表的中间节点2.1分析2.2代码 三,反转链表3.1分析3.2代码 四,找到链表中倒数第k个节点4.1分析4.2代码 一,移除链表元素 移除链表元素 1.1分析 这里的删除要分成两种…...
【libuv】与uvgrtrp的_SSIZE_T_定义不同
libuv的 #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) typedef intptr_t ssize_t;...
安卓ROM定制 修改必备常识-----初步了解system系统分区文件夹的基本含义 【二】
安卓修改rom 固件 修改GSI 移植rom 必备常识 lib--**so文件基本解析 一起来了解system目录相应文件的用途吧。(rom版本不同里面的app也会不一样) 简单打开img格式后缀文件 给大家说下最简单的方法提取img里面的文件,对于后缀img格式的文件可…...
GPT会统治人类吗
一 前言 花了大概两天时间看完《这就是ChatGPT》,触动还是挺大的,让我静下来,认真地想一想,是否真正理解了ChatGPT,又能给我们以什么样的启发。 二 思考 在工作和生活中,使用ChatGPT或文心一言,…...
win系统环境搭建(六)——Windows安装nginx
windows环境搭建专栏🔗点击跳转 win系统环境搭建(六)——Windows安装nginx 本系列windows环境搭建开始讲解如何给win系统搭建环境,本人所用系统是腾讯云服务器的Windows Server 2022,你可以理解成就是你用的windows10…...
Java中使用BigDecimal类相除保留两位小数
问题 遇到2个数相除,需要保留2位小数的结果。 解决 BigDecimal sum ...; BigDecimal yearValue ...;MathContext mathContext new MathContext(2, RoundingMode.DOWN); yearValue.divide(sum, mathContext);...
激光雷达在ADAS测试中的应用与方案
在科技高速发展的今天,汽车智能化已是必然的趋势,且自动驾驶汽车的研究也在世界范围内进行得如火如荼。而在ADAS测试与开发中,激光雷达以其高性能和高精度占据着非常重要的地位,它是ADAS测试与开发中不可缺少的组成。 一 激光雷达…...
malloc与free
目录 前提须知: malloc: 大意: 头文件: 申请空间: 判断是否申请成功: 使用空间: 结果: 整体代码: malloc申请的空间怎么回收呢? 注意事项: free:…...
计算周包材,日包材用来发送给外围系统
文章目录 1 Introduction2 code 1 Introduction In this example We get data from BOM and RESB . and calculate it . 2 code TYPES: BEGIN OF TY_ZPPT_0015_W,AUFNR TYPE ZPPT_0015-AUFNR,ZXH TYPE ZPPT_0015-ZXH,ZZJHID TYPE ZPPT_0015-ZZJHID,ZRJHID TYPE Z…...
R语言柱状图直方图 histogram
柱状图简介 柱状图也叫直方图,是展示连续性数值的分布状况。在x轴上将连续型数值分为一定数量的组,y轴显示对应值的频数。 R基本的柱状图 hist 我们用R自带的Orange数据来画图。 > head(Orange)Tree age circumference(圆周长) 1 1 118 …...
Linux磁盘管理:最佳实践
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
