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

古墓丽影暗影无法启动提示msvcr120.dll丢失终极解决2026版

当你满怀期待地点击《古墓丽影&#xff1a;暗影》的启动图标&#xff0c;却换来一句“无法启动此程序&#xff0c;因为计算机中丢失msvcr120.dll”的弹窗时&#xff0c;确实非常扫兴。先别急着卸载游戏&#xff0c;这个问题绝大多数情况下不需要重装那几十个G的文件。解决路径其…...

终极指南:如何用APK-Installer在Windows上快速安装安卓应用

终极指南&#xff1a;如何用APK-Installer在Windows上快速安装安卓应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行安卓应用&…...

AI艺术新体验:丹青识画系统开箱即用,为照片注入东方美学

AI艺术新体验&#xff1a;丹青识画系统开箱即用&#xff0c;为照片注入东方美学 1. 引言&#xff1a;科技与美学的完美邂逅 在数字时代&#xff0c;我们每天都会拍摄和分享大量照片&#xff0c;但你是否曾想过&#xff0c;这些影像可以拥有更深层次的文化内涵&#xff1f;「丹…...

智能窗口管理解决方案:如何用PowerToys FancyZones实现3倍多任务处理效率

智能窗口管理解决方案&#xff1a;如何用PowerToys FancyZones实现3倍多任务处理效率 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Tre…...

Phi-4-mini-reasoning在操作系统概念教学中的惊艳效果

Phi-4-mini-reasoning在操作系统概念教学中的惊艳效果 1. 当AI遇见操作系统教学 操作系统课程向来是计算机专业的"拦路虎"&#xff0c;那些抽象的概念和复杂的机制常常让学生们一头雾水。传统的教学方式依赖静态的PPT和教科书图示&#xff0c;很难让学生真正理解进…...

Youtu-VL-4B-Instruct环境部署:WSL2+Windows本地开发环境完整配置流程

Youtu-VL-4B-Instruct环境部署&#xff1a;WSL2Windows本地开发环境完整配置流程 想在自己的Windows电脑上跑一个能“看懂”图片、识别文字、分析图表的AI模型吗&#xff1f;今天&#xff0c;我就带你一步步在Windows系统上&#xff0c;通过WSL2&#xff08;Windows Subsystem…...

PROJECT MOGFACE Keil5开发效率提升:工程配置自动化与调试脚本生成

PROJECT MOGFACE Keil5开发效率提升&#xff1a;工程配置自动化与调试脚本生成 你是不是也经历过这样的场景&#xff1f;拿到一块新的STM32开发板&#xff0c;比如最常见的STM32F103&#xff0c;兴冲冲地打开Keil5准备大干一场&#xff0c;结果第一步就被卡住了——新建工程、…...

仅限前500名技术决策者获取:2026奇点大会《大模型工具调用成熟度评估矩阵》(含9维打分表+自测链接)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;大模型工具调用 2026奇点智能技术大会(https://ml-summit.org) 工具调用范式的根本性演进 在2026奇点智能技术大会上&#xff0c;大模型工具调用&#xff08;Tool Use&#xff09;已从早期的提示工程驱动&#xff0c;跃迁…...

Exploring Hallucination in Large Language Models: Causes, Detection, and Mitigation Strategies

1. 大语言模型幻觉现象的本质与分类 当你向ChatGPT询问"第一个登月的人是谁"&#xff0c;它却回答"1951年的查尔斯林德伯格"——这个明显违背常识的答案就是典型的大语言模型幻觉。这种现象就像AI的"创造性谎言"&#xff0c;模型会生成看似合理但…...

如何设计AI框架转换工具的函数参数?Ivy项目的完整实现规范指南

如何设计AI框架转换工具的函数参数&#xff1f;Ivy项目的完整实现规范指南 【免费下载链接】ivy Convert Machine Learning Code Between Frameworks 项目地址: https://gitcode.com/gh_mirrors/iv/ivy Ivy作为一款强大的机器学习框架转换工具&#xff0c;其核心功能在于…...