当前位置: 首页 > news >正文

基于weka手工实现K-means

一、K-means聚类算法

K均值聚类(K-means clustering)是一种常见的无监督学习算法,用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。

K均值聚类的基本思想如下:

  1. 随机选择K个初始聚类中心(质心)。
  2. 对于每个样本,计算其与各个聚类中心之间的距离,并将样本分配到距离最近的聚类中心所代表的簇。
  3. 对于每个簇,计算簇中样本的均值,并将该均值作为新的聚类中心。
  4. 重复步骤2和步骤3,直到聚类中心不再变化或达到预定的迭代次数。

K均值聚类的关键是如何选择初始的聚类中心。常见的方法是随机选择数据集中的K个样本作为初始聚类中心,或者使用一些启发式的方法来选择。

K均值聚类的优点包括简单易实现、计算效率高和可扩展性好。它在许多领域中被广泛应用,如数据分析、图像处理、模式识别等。然而,K均值聚类也存在一些限制,例如对于初始聚类中心的敏感性、对于离群值的影响较大以及需要事先指定簇的个数K等。

在实际应用中,可以根据实际问题和数据集的特点来选择合适的K值,并进行多次运行以获得更稳定的结果。此外,K均值聚类也可以与其他算法相结合,如层次聚类(hierarchical clustering)和密度聚类(density-based clustering),以获得更好的聚类效果。

总的来说,K均值聚类是一种常用的无监督学习算法,用于将数据集中的样本划分为K个簇。它简单而高效,适用于许多聚类问题。然而,在使用K均值聚类时需要注意选择初始聚类中心和合适的K值,以及对其限制和局限性的认识。

二、基于weka手工实现K-means聚类算法

package weka.clusterers.myf;import weka.clusterers.RandomizableClusterer;
import weka.core.*;import java.util.*;/*** @author YFMan* @Description 自定义的 KMeans 聚类器* @Date 2023/6/8 15:01*/
public class myKMeans extends RandomizableClusterer {// 聚类中心的数量private int m_NumClusters = 2;// 不同聚类中心的集合private Instances m_ClusterCentroids;// 聚类的最大迭代次数private int m_MaxIterations = 500;// 追踪收敛前完成的迭代次数private int m_Iterations = 0;// 构造函数public myKMeans() {super();// 设置随机种子m_SeedDefault = 10;setSeed(m_SeedDefault);}/** @Author YFMan* @Description //基类定义的接口,必须要实现* @Date 2023/6/8 16:37* @Param []* @return weka.core.Capabilities**/@Overridepublic Capabilities getCapabilities() {Capabilities result = super.getCapabilities();result.disableAll();result.enable(Capabilities.Capability.NO_CLASS);// attributesresult.enable(Capabilities.Capability.NOMINAL_ATTRIBUTES);result.enable(Capabilities.Capability.NUMERIC_ATTRIBUTES);result.enable(Capabilities.Capability.MISSING_VALUES);return result;}/** @Author YFMan* @Description //进行聚类* @Date 2023/6/8 16:38* @Param [data 用于聚类的数据集]* @return void**/@Overridepublic void buildClusterer(Instances instances) throws Exception {// 迭代次数m_Iterations = 0;// 初始化聚类中心m_ClusterCentroids = new Instances(instances, m_NumClusters);// 每个样本属于哪个聚类中心int[] clusterAssignments = new int[instances.numInstances()];// 伪随机数生成器Random RandomO = new Random(getSeed());int instIndex;HashSet<Instance> initC = new HashSet<>();// 初始化聚类中心,随机选择 m_NumClusters 个样本作为聚类中心for (int j = instances.numInstances() - 1; j >= 0; j--) {instIndex = RandomO.nextInt(j + 1);if (!initC.contains(instances.instance(instIndex))) {m_ClusterCentroids.add(instances.instance(instIndex));initC.add(instances.instance(instIndex));}instances.swap(j, instIndex);if (m_ClusterCentroids.numInstances() == m_NumClusters) {break;}}boolean converged = false;// 用于存储每个聚类中心的样本集合Instances[] tempI = new Instances[m_NumClusters];while (!converged) {m_Iterations++;converged = true;// 计算每个样本 属于哪个聚类中心for (int i = 0; i < instances.numInstances(); i++) {Instance toCluster = instances.instance(i);int newC = clusterInstance(toCluster);// 如果样本所属的聚类中心发生变化,则说明还没有收敛if (newC != clusterAssignments[i]) {converged = false;}clusterAssignments[i] = newC;}// 重新计算聚类中心m_ClusterCentroids = new Instances(instances, m_NumClusters);for (int i = 0; i < m_NumClusters; i++) {tempI[i] = new Instances(instances, 0);}for (int i = 0; i < instances.numInstances(); i++) {tempI[clusterAssignments[i]].add(instances.instance(i));}// 重新计算聚类中心for (int i = 0; i < m_NumClusters; i++) {// 计算每个属性的平均值m_ClusterCentroids.add(calculateCentroid(tempI[i]));}// 如果迭代次数达到最大值,则强制结束if (m_Iterations == m_MaxIterations) {converged = true;}}}/** @Author YFMan* @Description //计算某个聚类中心的中心点* @Date 2023/6/8 16:57* @Param [instances 聚类中心的样本集合]* @return weka.core.Instance 聚类中心的中心点**/private Instance calculateCentroid(Instances instances) {int numInst = instances.numInstances();int numAttr = instances.numAttributes();Instance centroid = new Instance(numAttr);double sum;for (int i = 0; i < numAttr; i++) {sum = 0;for (int j = 0; j < numInst; j++) {sum += instances.instance(j).value(i);}centroid.setValue(i, sum / numInst);}return centroid;}/** @Author YFMan* @Description //计算两个属性全为数值类型的样本之间的距离(欧式距离)* @Date 2023/6/8 16:47* @Param [first 第一个样例, second 第二个样例]* @return double**/private double distance(Instance first, Instance second) {// 定义欧式距离double euclideanDistance = 0;// 定义overlapping距离double overlappingDistance = 0;for (int index = 0; index < first.numAttributes(); index++) {if (index == first.classIndex()) {continue;}// 如果是数值类型的属性,则计算欧式距离if (first.attribute(index).isNumeric()) {double dis = first.value(index) - second.value(index);euclideanDistance += dis * dis;} else {// 如果是标称类型的属性,则计算是否相等if (first.value(index) != second.value(index)) {overlappingDistance += 1;}}}return Math.sqrt(euclideanDistance) + overlappingDistance;}/** @Author YFMan* @Description //对一个给定的样例进行分类* @Date 2023/6/8 16:50* @Param [instance 给定的样例]* @return int 返回样例所属的聚类中心id**/@Overridepublic int clusterInstance(Instance instance) throws Exception {double minDist = Double.MAX_VALUE;int bestCluster = 0;for (int i = 0; i < m_NumClusters; i++) {double dist = distance(instance, m_ClusterCentroids.instance(i));if (dist < minDist) {minDist = dist;bestCluster = i;}}return bestCluster;}/** @Author YFMan* @Description //返回聚类中心的数量* @Date 2023/6/8 16:34* @Param []* @return int**/@Overridepublic int numberOfClusters() throws Exception {return m_NumClusters;}/** @Author YFMan* @Description //主函数* @Date 2023/6/8 16:33* @Param [argv 命令行参数]* @return void**/public static void main(String[] argv) {runClusterer(new myKMeans(), argv);}
}

相关文章:

基于weka手工实现K-means

一、K-means聚类算法 K均值聚类&#xff08;K-means clustering&#xff09;是一种常见的无监督学习算法&#xff0c;用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。 K均值聚类的基本思想如下&#xff1a; …...

分布式系统监控zabbix安装部署及使用

分布式系统监控zabbix安装部署及使用 一.zabbix监控 1.什么是zabbix zabbix&#xff1a;是一款开源免费的&#xff0c;自动化发现服务与网络设备的分布式监控&#xff0c;可以监视应用层服务并以web前端页面集中管理并展示。 2.zabbix功能 监控服务器cpu负载、服务器内存使…...

【H5】使用 JavaScript 和 CSS 来完成实现鼠标接触时显示一个图片弹窗

以下是一个示例&#xff0c;演示了如何在鼠标接触时显示一个图片弹窗&#xff1a; HTML: <a href"#" class"popup-link" target"_blank"><i class"fab fa-weixin"></i> </a><div id"popup-containe…...

CSS选择器分类梳理并高亮重点

前言 主要内容来自菜鸟教程 CSS 选择器 | 菜鸟教程 分类是我自己理解的分类&#xff0c;示例说明优化统一了表述风格。 正文 选择器CSS示例示例说明基础*2*选择所有元素:root3:root选择文档的根元素element1p选择所有<p>元素:not(selector)3:not(p)选择所有并非p元素…...

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…...

程序设计 树基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

Java 并发编程与CAS基本原理

一、Java并发基础知识 Java里的程序天生就是多线程的&#xff0c;那么有几种新启线程的方式&#xff1f; 两种,启动线程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start&#xff1b; 2、X implements Runnable&#xff1b;然后交给Thread运行。 Java…...

qt creater运行按钮灰色,问题记录

第一次安装还没运行就出了三个错误&#xff1a; 1.F:\wei\Qt\Tools\CMake_64\share\cmake-3.24\Modules\CMakeTestCXXCompiler.cmake:62: error: The C compiler "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/cl.exe" is not able to compil…...

【jvm】类加载器的分类

目录 一、说明二、示例2.1 代码2.2 截图 三、启动类加载器四、扩展类加载器五、应用程序类加载器 一、说明 1.jvm支持两种类型的类加载器&#xff0c;分别是引导类加载器&#xff08;bootstrap classloader&#xff09;和自定义类加载器&#xff08;user-defined classloader&a…...

电路基础之电容

电容器&#xff08;Capacitor&#xff09;是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等&#xff0c;而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素&#xff1a; 电极&#xff1a;电容器的电极是两个导体…...

函数柯里化

文章目录 基本概念柯里化&#xff08;Currying&#xff09;是什么&#xff1f;通用的柯里化实现ES5 实现ES6 实现 基本概念 在讲柯里化之前我们先来了解一些基本概念&#xff1a; Function.length&#xff1a; length 属性指明函数的形参个数 function func1() {} function …...

【HBZ分享】ES中的Reindex重建索引

Reindex如何实现索引重建&#xff1f; 滚动索引 批量复制 Reindex存在的问题 如果新的索引没有提前创建好&#xff0c;并指定字段类型&#xff0c;那么重建后的新索引类型极有可能会和旧的索引不一致&#xff0c;因为ES他会推断类型&#xff0c;而推断错误率从实战来说那是…...

【PostgreSQL】几个提高性能的小特性

一、LOCALE 与 “operator class” 在PostgreSQL里&#xff0c;LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置&#xff0c;包括字母表、排序、数字格式等。 LOCALE里有一个比较重要的规则LC_COLLATE&#xff0c;即排序方式(Collation)&#xff0c;它会对数据…...

[C语言] 指针

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么&#xff1f; 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针…...

win10在vmware15中安装macos10.13系统

第一步、安装vmware版本信息如下 第二步、下载unlocker-main和darwin.iso放到安装文件夹 第三步、管理员身份运行win-install.cmd 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS 10.13并选择语言 第六步、选择磁盘工具抹掉磁盘 第七步、格式化完成后退出磁盘工…...

Node.js:实现遍历文件夹下所有文件

Node.js&#xff1a;实现遍历文件夹 代码如下 const fs require(fs) const path require(path)function traverseFolder(folderPath) {// 读取文件夹列表const files fs.readdirSync(folderPath)// 遍历文件夹列表files.forEach(function (fileName) {// 拼接当前文件路径…...

Git详解及使用

Git简介 Git 是一种分布式版本控制系统&#xff0c;它可以不受网络连接的限制&#xff0c;加上其它众多优点&#xff0c;目前已经成为程序开发人员做项目版本管理时的首选&#xff0c;非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…...

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…...

【ARM 嵌入式 编译系列 7.1 -- GCC 链接脚本中节区及各个段的详细介绍】

文章目录 什么是Section(节区)输入文件常见节区有哪些&#xff1f;什么是 glue code&#xff1f;.glue_7和.glue_7的作用是什么&#xff1f;链接脚本中的 KEEP 关键字是什么呢作用&#xff1f;链接脚本中的 PROVIDE 关键字是什么呢作用&#xff1f; 上篇文章&#xff1a;ARM 嵌…...

一文读懂HTML

文章目录 HTML的历史HTML的作用HTML的基本语言 HTML的历史 HTML&#xff08;HyperText Markup Language&#xff09;的历史可以追溯到20世纪90年代早期&#xff0c;它是互联网发展的重要里程碑之一。以下是HTML的历史概述&#xff1a; 早期阶段&#xff08;1980年代末 - 1990年…...

第4天:RNN应用(心脏病预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…...

微信小程序带参分享、链接功能

分享链接的功能是右上角点...然后复制链接&#xff0c;可以直接点击 #小程序://**商城/p5XqHti******* 这种链接直接从其他地方跳转到小程序 wx.onCopyUrl(() > {return {query: "shareCode" this.shareCode,}; }); query就是参数&#xff0c;直接在onload里…...

多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案

一、技术优势与适配性分析 1. 任务分工的合理性 YOLO&#xff08;目标检测&#xff09; 核心价值&#xff1a;快速定位工业开关在图像中的位置&#xff08;边界框&#xff09;&#xff0c;为后续分割和分类提供ROI&#xff08;感兴趣区域&#xff09;。工业场景适配性&#xf…...

基于J2EE架构的在线考试系统设计与实现【源码+文档】

目录 摘要: Abstract: 1 引言 2 在线考试系统构架 2.1 在线考试系统一般需求分析 2.2 当前在线考试系统现状分析 2.3 基于J2EE的在线考试系统架构介绍及拥有的优势 2.3.1 结构总体介绍 2.3.2 客户层组件 2.3.2.1 Applets 2.3.2.2 应用程序客户端 2.3.3 …...

App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)

很多开发者以为 App 一旦上线&#xff0c;安全策略也就定型了。但现实是&#xff0c;App 上线只是攻击者的起点——从黑产扫描符号表、静态分析资源文件、注入调试逻辑&#xff0c;到篡改功能模块&#xff0c;这些行为都可能在你“以为很安全”的上线版本里悄然发生。 本篇文章…...

C++中const关键字详解:不同情况下的使用方式

在 C 中&#xff0c;const 关键字用于指定一个对象或变量是常量&#xff0c;意味着它的值在初始化之后不能被修改。下面详细介绍 const 修饰变量、指针、类对象和类中成员函数的区别以及注意事项。 修饰变量 详细介绍 当 const 修饰变量时&#xff0c;该变量成为常量&#x…...

App使用webview套壳引入h5(三)——解决打包为app后在安卓机可物理返回但是在苹果手机无法测滑返回的问题

话不多说&#xff0c;直接放最终版本代码。 解决思路是&#xff1a;如果设备是ios设备在myH5中监听 touchstart 和touchend事件。 经过 App使用webview套壳引入h5的最终代码如下 myApp中&#xff0c;entry.vue代码如下&#xff1a; <template><view class"ent…...

SON.stringify()和JSON.parse()之间的转换

1.JSON.stringify() 作用&#xff1a;将对象、数组转换成字符串 const obj {code: "500",message: "出错了", }; const jsonString JSON.stringify(obj); console.log(jsonString);//"{"code":"Mark Lee","message"…...

装载机防撞系统:智能守护,筑牢作业现场人员安全防线

在尘土飞扬、机械轰鸣的建筑工地上&#xff0c;装载机是不可或缺的 “大力士”&#xff0c;承担着土方搬运、物料装卸等繁重任务。然而&#xff0c;传统作业模式下&#xff0c;装载机的安全隐患时刻威胁着现场人员的生命安全与工程进度。随着智能化技术的突破&#xff0c;唯创安…...

AI对测试行业的应用

AI对测试行业的应用 AI技术在软件测试领域的应用已从概念验证全面迈向工程化落地&#xff0c;正在重构测试流程、提升效率边界&#xff0c;并为质量保障体系带来范式级变革。以下从技术突破、行业实践与未来趋势三个维度展开深度解析&#xff1a; ⚙️ 一、核心技术突破&#…...