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

基于weka手工实现KNN

一、KNN模型

K最近邻(K-Nearest Neighbors,简称KNN)算法是一种常用的基于实例的监督学习算法。它可以用于分类和回归问题,并且是一种非常直观和简单的机器学习算法。

KNN算法的基本思想是:对于一个新的样本数据,在训练数据集中找到与其最接近的K个邻居,然后根据这K个邻居的标签或属性进行预测。预测的过程即为统计K个邻居中最常见的标签(对于分类问题)或计算K个邻居的平均值(对于回归问题)。

KNN算法的主要步骤如下:

  1. 准备训练数据集:包括样本数据和对应的标签(对于分类问题)或属性值(对于回归问题)。
  2. 选择一个合适的距离度量方法,常用的有欧氏距离、overlapping距离等。
  3. 对于一个新的样本数据,计算其与训练数据集中所有样本的距离。
  4. 根据距离的大小,选取与新样本距离最近的K个邻居。
  5. 对于分类问题,统计K个邻居中各类别的出现频率,选择频率最高的类别作为预测结果。
  6. 对于回归问题,计算K个邻居的平均值作为预测结果。
  7. 输出预测结果。

KNN算法的核心思想是基于样本之间的相似性进行预测。它假设相似的样本在特征空间中具有相似的输出,因此通过寻找最近的邻居来进行预测。KNN算法的优点包括简单易懂、无需模型训练和快速预测。然而,它也有一些限制,如对于大规模数据集的计算开销较大,对于高维数据和不平衡数据的处理能力较弱等。

在使用KNN算法时,需要注意选择合适的K值,较小的K值可能会导致对噪声敏感,较大的K值可能会导致模糊性增加。此外,对数据进行预处理(如特征缩放)也可能对KNN的性能产生影响。

总的来说,KNN算法是一种简单但有效的机器学习算法,适用于小规模数据集和简单分类或回归任务。它在实际应用中被广泛使用,特别是在模式识别、推荐系统和数据挖掘等领域。

关于KNN算法更加详细的介绍可以参考这篇博客:机器学习08:最近邻学习.

二、基于weka手工实现KNN算法

package weka.classifiers.myf;import weka.classifiers.Classifier;
import weka.core.*;/*** @author YFMan* @Description 自定义的 KNN 分类器* @Date 2023/5/25 14:35*/
public class myKNN extends Classifier {// 训练数据集protected Instances m_Train;// 类别数protected int m_NumClasses;// 设置 kNN 参数protected int m_kNN = 3;// 属性数protected double m_NumAttributesUsed;/** @Author YFMan* @Description 根据训练数据 建立 KNN 模型* @Date 2023/5/25 18:27* @Param [instances]* @return void**/public void buildClassifier(Instances instances) throws Exception {// 初始化类别数m_NumClasses = instances.numClasses();// 初始化训练集m_Train = instances;// 初始化属性数m_NumAttributesUsed = 0.0;for (int i = 0; i < m_Train.numAttributes(); i++) {if (i != m_Train.classIndex()) {m_NumAttributesUsed += 1.0;}}}/** @Author YFMan* @Description 对单个实例进行分类* @Date 2023/5/25 18:27* @Param [instance]* @return double[]**/public double[] distributionForInstance(Instance instance) throws Exception {// 计算 instance 与 instances 中每个实例的欧式距离double[] distances = new double[m_Train.numInstances()];for (int i = 0; i < m_Train.numInstances(); i++) {distances[i] = 0;// 计算 instance 与 instances 中每个实例的 d^2for (int j = 0; j < m_Train.numAttributes(); j++) {if (j != m_Train.classIndex()) {// 计算 overlap 距离
//                    if(instance.value(j)!=m_Train.instance(i).value(j)){
//                        distances[i] += 1;
//                    }// 计算 Euclidean 距离double diff = instance.value(j) - m_Train.instance(i).value(j);distances[i] += diff * diff;}}// 对 d^2 开根号distances[i] = Math.sqrt(distances[i]);}// 对 distances 进行排序 (得到的是排序后的下标)int[] sortedDistances = Utils.sort(distances);// 计算 distributiondouble[] distribution = new double[m_NumClasses];for (int i=0;i<m_NumClasses;i++){distribution[i] = 1.0;}int total = m_NumClasses;for (int i = 0; i < m_kNN; i++) {distribution[(int) m_Train.instance(sortedDistances[i]).classValue()] += 1.0;total += 1;}// 归一化for (int i=0;i<m_NumClasses;i++){distribution[i] /= total;}// 返回各个类别的 distributionreturn distribution;}/** @Author YFMan* @Description 主函数* @Date 2023/5/25 18:27* @Param [argv] 命令行参数* @return void**/public static void main(String[] argv) {runClassifier(new myKNN(), argv);}
}

相关文章:

基于weka手工实现KNN

一、KNN模型 K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法是一种常用的基于实例的监督学习算法。它可以用于分类和回归问题&#xff0c;并且是一种非常直观和简单的机器学习算法。 KNN算法的基本思想是&#xff1a;对于一个新的样本数据&…...

Lua 闭包

一、Lua 中的函数 Lua 中的函数是第一类值。意味着和其他的常见类型的值&#xff08;例如数值和字符串&#xff09;具有同等权限。 举个例子&#xff0c;函数也可以像其他类型一样存储起来&#xff0c;然后调用 -- 将 a.p 指向 print 函数 a { p print } -- 使用 a.p 函数…...

Java技术整理(1)—— JVM篇

1、什么是JVM&#xff1f; JVM是一个可运行Java代码的虚拟计算机&#xff0c;包括一套字节码指令集&#xff0c;一组寄存器&#xff0c;一个栈&#xff0c;一个垃圾回收&#xff0c;堆和一个存储方式栈。JVM 是运行在操作系统之上&#xff0c;并不与操作系统直接交互。 2、运行…...

bug解决:AssertionError: No inf checks were recorded for this optimizer.

这真的是最恶心的一个error&#xff08;比网络回传找哪层没有传播到还要恶心&#xff01;&#xff09;&#xff0c;找了好久的问题所在之处&#xff0c;最后偶然发现了这篇文章&#xff1a; 解决pytorch半精度amp训练nan问题 - 知乎 然后发现自己用的混合精度训练&#xff0c;发…...

Django笔记之数据库查询优化汇总

1、性能方面 1. connection.queries 前面我们介绍过 connection.queries 的用法&#xff0c;比如我们执行了一条查询之后&#xff0c;可以通过下面的方式查到我们刚刚的语句和耗时 >>> from django.db import connection >>> connection.queries [{sql: S…...

JVM内存区域

预备 为了更好的理解类加载和垃圾回收&#xff0c;先要了解一下JVM的内存区域&#xff08;如果没有特殊说明&#xff0c;都是针对的是 HotSpot 虚拟机。&#xff09;。 Java 源代码文件经过编译器编译后生成字节码文件&#xff0c;然后交给 JVM 的类加载器&#xff0c;加载完…...

某行业CTF一道流量分析题

今晚看了一道题&#xff0c;记录学习下。 给了一个hacktrace.pcapng&#xff0c;分析主要内容如下&#xff1a; 上传两个文件&#xff0c;一个mouse.m2s&#xff0c;一个mimi.zip&#xff0c;将其导出。 mimi.zip中存放着secret.zip和key.pcapng 不过解压需要密码&#xff…...

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;、基于 zookeeper 协调…...

Kafka API与SpringBoot调用

文章目录 首先需要命令行创建一个名为cities的主题&#xff0c;并且创建该主题的订阅者。 1、使用Kafka原生API1.1、创建spring工程1.2、创建发布者1.3、对生产者的优化1.4、批量发送消息1.5、创建消费者组1.6 消费者同步手动提交1.7、消费者异步手动提交1.8、消费者同异步手动…...

JavaScript构造函数和类的区别

原文 构造函数 没有显式的创建对象创建对象时使用new操作符。所有属性和方法赋值给this对象。没有return语句按照惯例&#xff0c;构造函数的方法名首字母应该使用大写字母&#xff0c;用于区分普通函数&#xff0c;其实构造函数也是函数&#xff0c;其主要功能是用来创建对象…...

Spring与Spring Bean

Spring 原理 它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring 仍然可 以和其他的框架无缝整合。 Spring 特点 轻量级 控制反转 面向切面 容器 框架集合 Spring 核心组件 Spring 总共有十几个组件核心容器(Spring core) S…...

并发相关面试题

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 如何理解volatile关键字 在并发领域中&#xff0c;存在三大特性&#xff1a;原子性、有序性、可见性。volatile关键字用来修饰对象的属性…...

Hadoop+Python+Django+Mysql热门旅游景点数据分析系统的设计与实现(包含设计报告)

系统阐述的是使用热门旅游景点数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…...

php中nts和ts

PHP语言解析器:官方提供了2种类型的版本&#xff0c;线程安全(TS)版和非线程安全(NTS)版 TS: TS(Thread-Safety)即线程安全&#xff0c;多线程访问时&#xff0c;采用了加锁机制&#xff0c;当一个线程访问该类的某个数据时进行数据加锁保护&#xff0c;其他线程不能同时进行访…...

设计模式之责任链模式【Java实现】

责任链&#xff08;Chain of Resposibility&#xff09; 模式 概念 责任链&#xff08;chain of Resposibility&#xff09; 模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者 通过前一对象记住其下一个对象的引用而连成一条…...

Android 12.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android12.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…...

服务器安装JDK

三种方法 方法一&#xff1a; 方法二&#xff1a; 首先登录到Oracle官网下载JDK JDK上传到服务器中&#xff0c;记住文件上传的位置是在哪里&#xff08;我放的位置在/www/java&#xff09;&#xff0c;然后看下面指示进行安装 方法三&#xff1a; 首先登录到Oracle官网下载…...

cpu查询

1.mpstat查看系统cpu状况 mpstat 1 1或者mpstat -P ALL查看每个cpu使用状态&#xff0c;&#xff08;用户态cpu是用来&#xff0c;内核态cpu使用率&#xff0c;等待IO使用率&#xff09; 2.vmstat 可以查看系统运行任务数&#xff08;正在cpu运行进程和就绪队列进程&#xff0…...

【muduo】关于自动增长的缓冲区

目录 为什么需要缓冲区自动增长的缓冲区buffer数据结构buffer类 写详细比较费时间&#xff0c;就简单总结下。 总结自Linux 多线程服务端编程&#xff1a;使用 muduo C 网络库 Muduo网络编程&#xff1a; IO-multiplexnon-blocking 为什么需要缓冲区 Non-blocking IO 的核心…...

原型和原型链理解

这个图大概能概括原型和原型链的关系 1.对象都是通过 _proto_ 访问原型 2.原型都是通过constructor 访问构造函数 3.原型是构造函数的 prototype 4.原型也是对象实例 也是通过 _proto_ 访问原型(Object.prototype) 5.Object.prototype的原型通过 _proto_ 访问 为null 那么…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...