当前位置: 首页 > 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年…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...