机器学习 -- k近邻算法

场景

我学习Python的初衷是学习人工智能,满足现有的业务场景。所以必须要看看机器学习这一块。今天看了很久,做个总结。
机器学习分为深度学习和传统机器学习

深度学习

深度学习模型通常非常复杂,包含多层神经网络,每一层都包含大量的神经元(节点)。这些模型可以包含数百万甚至数十亿个参数。深度学习模型可以自动学习数据的特征表示,而无需手动设计特征。通过多层神经网络,深度学习模型可以逐层提取和组合特征,从而更好地捕捉数据中的复杂模式。深度学习模型通常需要大量的数据来进行训练,以充分学习复杂的参数。这意味着深度学习在大规模数据集上表现良好,但在小数据集上可能会过拟合。而且深度学习更像是一个黑盒子,你也不知道它为什么会得到这个结果。还有,深度学习通常需要大量的计算资源,例如高性能GPU,以加速模型的训练。这使得深度学习在硬件要求上更为苛刻。深度学习更适合于计算机视觉,自然语言处理,自动驾驶等场景。

传统机器学习

传统机器学习模型通常比深度学习模型简单,包括线性回归、决策树、支持向量机(SVM)、K近邻(K-NN)等。这些模型具有较少的参数。传统机器学习通常需要手动设计和提取特征。特征工程是一个关键的步骤,需要领域专业知识和经验来选择和创建适当的特征。传统机器学习模型在小规模数据集上也可以表现良好,并且通常不容易过拟合。相对于深度学习,传统机器学习算法通常需要较少的计算资源,因此在资源受限的环境中更具可行性。传统学习很适用于有明确输入与输出数据的场景,如图像识别、语音识别和文本分类。在这些任务中,算法通过训练数据集来学习,其中包含输入数据及其对应的正确输出。

在传统机器分类学习中,有一个很经典的算法叫做 “k近邻算法”。

k近邻算法

众所周知,有很多种类电影,爱情电影,动作电影。爱情电影里有kiss片段,但是可能也会有武打片段。动作片里有动作片段,可能也有Kiss片段。但是,经常看电影的肯定知道,爱情片里的动作片段远远小于动作片段,反之亦然。基于某一场景是否可以给电影分类呢?这种场景就很适合k近邻算法。

概述

k近邻算法是一种简单但非常有效的机器学习算法,主要用于分类和回归问题。其核心思想是基于相似性原则进行预测:即相似的数据点具有相似的输出。

距离度量:改算法首先计算测试数据与每个训练数据点之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离和闵可夫斯基距离。 例如:测试样例特征是 [0,0],样本集特征是 [1,2] 那么距离就是
[(1-0) **2 + (2-0) **2] **0.5 (欧氏距离) 如果距离测试样例的三个样本的值分别是 0,1,2 k是2 ,那么样本1类型如果为A,样本2类型为A,那么测试类型为A。
决策规则:
分类:对于分类问题,算法通常采用“多数投票”原则,即测试数据点被分配到邻居中最常见的类别。
回归:对于回归问题,算法通常计算K个邻居的输出值的平均值,作为预测值。

特点
简单有效:k近邻算法是一种理解起来直观且实现简单的算法。
惰性学习:与其他机器学习算法不同,k近邻算法不需要在训练阶段进行显著的学习过程。它在预测阶段才进行计算,因此属于惰性学习算法。
无参数:k近邻算法不假设数据的分布,因此是一种非参数算法。
内存密集型:由于算法需要存储所有训练数据,因此对内存要求较高。

缺点
K值的选择:K的选择对算法的性能有重要影响。较小的K值使模型对噪声数据更敏感,而较大的K值则可能导致分类/回归边界的平滑化。
维度诅咒:在高维数据中,计算距离变得困难,这会影响k近邻算法算法的性能。
标准化:k近邻算法对数据的尺度非常敏感,因此通常需要进行特征标准化。
计算成本:对于大型数据集,计算每个测试实例的邻居可能非常耗时。

demo

我们根据上述所说,编写k近邻算法的代码:

def classify0(inX, dataSet, labels, k):# 获取数据集的行数dataSetSize = dataSet.shape[0]# 计算输入向量与数据集中每个数据点的差值矩阵diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet# 计算差值矩阵中每个元素的平方sqDiffMat = diffMat ** 2# 计算每行的平方差值和,得到平方距离的数组sqDistances = sqDiffMat.sum(axis=1)# 对平方距离数组开平方,得到距离数组distances = sqDistances ** 0.5# 对距离数组进行排序,返回排序后的索引sortedDistIndices = distances.argsort()# 创建一个字典,用于存储最近的 k 个数据点的类别及其出现次数classCount = {}# 遍历排序后的前 k 个索引for i in range(k):# 获取当前最近数据点的类别voteIlabel = labels[sortedDistIndices[i]]# 更新字典中该类别的出现次数classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1# 对字典中的类别及其出现次数进行排序,按出现次数降序排列sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)# 返回最频繁出现的类别return sortedClassCount[0][0]

作为java老本行,自然得有java版。


/*** k近邻算法* @Author: Herche Jane* @Date: 2024/01/04*/
public class KNNClassifier {public static String classify0(double[] inX, double[][] dataSet, String[] labels, int k) {int dataSetSize = dataSet.length;// 计算距离double[] distances = new double[dataSetSize];for (int i = 0; i < dataSetSize; i++) {double[] data = dataSet[i];double distance = 0;for (int j = 0; j < inX.length; j++) {distance += Math.pow(inX[j] - data[j], 2);}distances[i] = Math.sqrt(distance);}// 获取距离的排序索引Integer[] sortedDistIndices = getSortedIndices(distances);// 计算前k个最近邻的类别及其出现次数Map<String, Integer> classCount = new HashMap<>();for (int i = 0; i < k; i++) {String label = labels[sortedDistIndices[i]];classCount.put(label, classCount.getOrDefault(label, 0) + 1);}// 对类别出现次数进行排序List<Map.Entry<String, Integer>> sortedClassCount = new ArrayList<>(classCount.entrySet());sortedClassCount.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));// 返回最频繁的类别return sortedClassCount.get(0).getKey();}private static Integer[] getSortedIndices(double[] array) {Integer[] indices = new Integer[array.length];for (int i = 0; i < array.length; i++) {indices[i] = i;}Arrays.sort(indices, Comparator.comparingDouble(i -> array[i]));return indices;}
}

测试调用

致敬java

public static void main(String[] args) {// 示例:数据集和标签double[][] dataSet = {{1.0, 2.0}, {2.0, 3.0}, {3.0, 4.0}};String[] labels = {"A", "B", "B"};double[] inX = {1.5, 2.5};// 使用KNN进行分类String result = classify0(inX, dataSet, labels, 3);System.out.println("分类结果: " + result);}

调用结果:

分类结果: B

结束

k近邻算法是分类最简单最有效的方案,k近邻算法必须保存所有的训练集,这就意味着很吃内存。这个算法我们根本就不知道平均实例样本和典型实例样本是什么。当K值较小,即考虑的邻居数量较少时,如果有噪声和脏数据,那么这个训练算是废了。没有自己纠正自己的能力,这就要求数据必须要有预处理,否则很容易出问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在SQL脚本中删除所有的 prompt那一行

在SQL脚本中删除所有的 prompt 命令&#xff0c;您可以手动编辑SQL文件&#xff0c;移除所有包含 prompt 关键字的行。具体操作取决于您使用的是哪种文本编辑器。大多数文本编辑器支持查找和替换功能&#xff0c;可以用它来删除所有 prompt 行。 以下是在不同编辑器中进行操作…

html+css 对input的使用以及详解

表单 form标签主要用于收集用户信息&#xff0c;对表单结果的处理和发送 使用场景&#xff1a;登录页面、注册页面、搜索区域 form属性描述action规定当提交表单时向何处发送表单数据method规定用于发送表单数据的 HTTP 方法name规定表单的名称target规定在何处打开 action …

mysql知识学习

0 mysql的隔离级别有4个&#xff0c;读未提交&#xff0c; 读已提交&#xff08;rc&#xff09;&#xff0c; 可重复读&#xff08;rr&#xff09;,串行化&#xff0c;mysql默认的隔离级别时rr 1聚簇索引就是主键索引&#xff0c; 可以一步到位i的索引 非聚簇索引就是要通过二…

Golang - http请求InsecureSkipVerify 字段为 true 来忽略忽略 SSL验证

在Golang中&#xff0c;可以通过设置 tls.Config 的 InsecureSkipVerify 字段为 true 来忽略 SSL 验证。 下面是一个简单的示例代码&#xff1a; package mainimport ("crypto/tls""fmt""net/http" )func main() {// 创建一个自定义的 Transp…

矩阵式键盘按键值的数码管显示实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14P1^4; //将P14位定义为P1.4引脚 sbit P15P1^5; //将P15位定义为P1.5引脚 sbit P16P1^6; //将P16位定义为P1.6引脚 sbit P17P1^7; //将P17位定义为P1.7引脚 unsigned char code Tab[ ]…

CTF-PWN-栈溢出-高级ROP-【SROP】

文章目录 linux信息处理2017 360春秋杯 smallest检查源码思路第一次要执行ret时的栈执行write函数时修改rsp到泄露的栈地址上去 输入/bin/sh并sigreturn调用系统调用回忆exp注意一个离离原上谱的地方 参考链接 SROP(Sigreturn Oriented Programming) 于 2014 年被 Vrije Univer…

简单多状态dp问题(打家劫舍Ⅱ)

通过分类谈论&#xff0c;将环形的问题&#xff0c;转化成两个线性的 “ 打家劫舍Ⅰ ” 1.状态表示 2.状态转移方程 3.初始化 f[ 0 ] nums[ 0 ] g[ 0 ] 0 4.填表顺序 从左往右填表&#xff0c;两个表一块填 5.返回值 max( f[ n-1 ] , g [ n - 1 ] )

【Bug】Android BottomNavigationView 图标黑色色块问题

最近在研究Android Jetpack组件&#xff0c;在使用Navigation配合底部导航栏时&#xff0c;发现一个奇怪的问题&#xff0c;如下&#xff1a; 说明&#xff1a;图标来源于Iconfont开源图标库 我的第三个图标变成了一个黑色色块&#xff0c;这个问题前两天我遇见过&#xff0c…

.NetCore部署微服务(一)

目录 前言 什么是微服务 微服务的优势 微服务的原则 创建项目 在Docker中运行服务 客户端调用 简单的集群服务 前言 写这篇文章旨在用最简单的代码阐述一下微服务 什么是微服务 微服务描述了从单独可部署的服务构建分布式应用程序的体系结构流程&#xff0c;同时这些…

C# 使用Microsoft消息队列(MSMQ)

写在前面 Microsoft Message Queuing (MSMQ) 是在多个不同的应用之间实现相互通信的一种异步传输模式&#xff0c;相互通信的应用可以分布于同一台机器上&#xff0c;也可以分布于相连的网络空间中的任一位置。 使用消息队列可以实现异步通讯&#xff0c;无需关心接收端是否在…

海康威视摄像头+服务器+录像机配置校园围墙安全侦测区域入侵侦测+越界侦测.docx

一、适用场景 1、校园内&#xff0c;防止课外时间翻越围墙到校外、从校外翻越围墙到校内&#xff1b; 2、通过服务器摄像头的侦测功能及时抓图保存&#xff0c;为不安全因素提供数字化依据&#xff1b; 3、网络录像机保存监控视频&#xff0c;服务器保存抓拍到的入侵与越界&am…

UI自动化Selenium iframe切换多层嵌套

IFRAME是HTML标签&#xff0c;作用是文档中的文档&#xff0c;或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。 简单来说&#xff0c;就像房子内的一个个房间一样&#xff1b;你要去房间里拿东西&#xff0c;就得先开门&#xff1b; 如上图…

指针大礼包5

三、程序改错 共10题 &#xff08;共计100分&#xff09; 第1题 &#xff08;10.0分&#xff09; 题号:72 难度:中 第8章 /*------------------------------------------------------- 【程序改错】 ---------------------------------------------…

出现 No such instance field: ‘XXXX‘ 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 作为一个全栈的开发玩家,需要调试前后端的数据传输,方便发现问题所在! 在debug整个项目的时候,检查传输数据的时候,发现前端可以传输,但是后端一直拿不到 出现如下问题:No such instance field: parentModel 截图…

UI5与后端的文件交互(四)

文章目录 前言一、后端开发1. 新建管理模板表格2. 新建Function&#xff0c;动态创建文档 二、修改UI5项目1.Table里添加下载证明列2. 实现onClickDown事件 三、测试四、附 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。 这篇的主要内容有&…

Leetcode的AC指南 —— 字符串/卡码网:55. 右旋字符串

摘要&#xff1a; Leetcode的AC指南 —— 字符串/卡码网&#xff1a;55. 右旋字符串。题目介绍&#xff1a;字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字…

灸哥问答:数据结构对软件开发的作用

在软件开发的浩瀚海洋中&#xff0c;数据结构如同一座坚固的灯塔&#xff0c;为开发者指明方向&#xff0c;确保他们在构建复杂系统时不会迷失。数据结构不仅仅是编程的基础&#xff0c;更是高效、稳定、可扩展软件的核心。 一、提升算法效率 数据结构与算法紧密相连&#xf…

Java实战项目三:图书借阅系统

文章目录 一、实战概述二、知识点概览&#xff08;一&#xff09;数据库操作及连接&#xff08;二&#xff09;对象关系映射&#xff08;ORM&#xff09;&#xff08;三&#xff09;业务逻辑处理 三、思路分析&#xff08;一&#xff09;系统架构设计&#xff08;二&#xff09…

antd——a-date-picker——日期的限制功能——js基础积累

antd——a-date-picker——日期的限制功能——js基础积累 禁用日期一、限制只能选明天及之后的日期&#xff08;今天不可选中&#xff09;二、限制只能选今天及之后的日期&#xff08;今天可选中&#xff09;三、限制只能选昨天及之前的日期&#xff08;今天不可选中&#xff0…

Java业务功能并发问题处理

业务场景&#xff1a; 笔者负责的功能需要调用其他系统的进行审批&#xff0c;而接口的调用过程耗时有点长&#xff08;可能长达10秒&#xff09;&#xff0c;一个订单能被多个人提交审批&#xff0c;当订单已提交后会更改为审批中&#xff0c;不能再次审批&#xff08;下游系…