机器学习 -- 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值较小,即考虑的邻居数量较少时,如果有噪声和脏数据,那么这个训练算是废了。没有自己纠正自己的能力,这就要求数据必须要有预处理,否则很容易出问题!
相关文章:
机器学习 -- k近邻算法
场景 我学习Python的初衷是学习人工智能,满足现有的业务场景。所以必须要看看机器学习这一块。今天看了很久,做个总结。 机器学习分为深度学习和传统机器学习 深度学习 深度学习模型通常非常复杂,包含多层神经网络,每一层都包含…...
安全测试之SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
php composer安装
引言 Composer 是 PHP 中的依赖管理工具。它允许您声明您的项目所依赖的库,并且它将为您管理(安装/更新)它们。 官网链接:Introduction - Composer 安装 要在当前目录中快速安装 Composer,请在终端中运行以下脚本。…...
【MyBatis】MyBatis基础操作
文章目录 前言注解方式书写 MyBatis打印 MyBatis 日志参数传递MyBatis 增加操作返回主键 MyBatis 删除操作MyBatis 修改操作MyBatis 查找操作1. 对查询结果进行别名2. Results注解3. 开启驼峰命名(推荐) XML 配置文件方法书写 MyBatis配置数据库的相关配…...
Automatic merge failed; fix conflicts and then commit the result.如何处理
当你在Git中遇到 “Automatic merge failed; fix conflicts and then commit the result.” 的错误时,这意味着你尝试合并两个分支时出现了冲突。Git无法自动解决这些冲突,因此需要你手动解决。以下是处理这种情况的步骤: 找出冲突文件: 运行…...
一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)
Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…...
Qt3D QGeometryRenderer几何体渲染类使用说明
Qt3D中的QGeometryRenderer派生出来的几何体类包括: Qt3DExtras::QConeMesh, Qt3DExtras::QCuboidMesh, Qt3DExtras::QCylinderMesh, Qt3DExtras::QExtrudedTextMesh, Qt3DExtras::QPlaneMesh, Qt3DExtras::QSphereMesh, Qt3DExtras::QTorusMesh, and Qt3DRender::QMesh 有球…...
pandasDataFrame读和写csv文件
从.csv文件读数据 import pandas as pd# 从CSV文件中读取数据 train_df pd.read_csv("datasets/train01.csv") val_df pd.read_csv("datasets/val01.csv") test_df pd.read_csv("datasets/test01.csv")# 显示数据框的前几行,确保…...
力扣122. 买卖股票的最佳时机 II
动态规划 思路: 假设 dp[i][0] 是第 i 天手上没有股票时的最大利润, dp[i][1] 是第 i 天手上有 1 支股票的最大利润;dp[i][0] 的迁移状态为: dp[i - 1][0],前一天手上已经没有股票,没有发生交易࿱…...
Go语言断言和类型查询
Go语言断言和类型查询 1、类型断言 类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接 口或者具体的类型。 在Go语言中类型断言的语法格式如下: // i.(TypeNname) value, ok : x.(T)其中&…...
02 Deep learning algorithm
Neural Networks target: inference(prediction)training my own modelpractical advice for building machine learning systemdecision Tress application: speech(语音识别) ----> images(计算机视觉)—> t…...
代码随想录算法训练营第二十四天 | 回溯算法
理论基础 代码随想录原文 什么是回溯法 回溯也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率 虽然回溯法很难,不好理解,但是回溯法并不是什么高效的算法。因为回溯的本…...
Spring Cloud Gateway 缓存区异常
目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…...
Spring Boot依赖版本声明
链接 官网 Spring Boot文档官网:https://docs.spring.io/spring-boot/docs/https://docs.spring.io/spring-boot/docs/ Spring Boot 2.0.7.RELEASE Spring Boot 2.0.7.RELEASE reference相关:https://docs.spring.io/spring-boot/docs/2.…...
Java项目:109SpringBoot超市仓管系统
博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发,系统使用shiro框架做权限安全控制,超级管理员登录系统后可根据自己的实际需求配角色&…...
【React系列】Redux(三) state如何管理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…...
3D 纹理的综合指南
在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…...
LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人
在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…...
VLOOKUP的使用方法
VLOOKUP是Excel中一个非常有用的函数,用于在一个表格或范围中查找某个值,并返回该值所在行或列的相应数据。 VLOOKUP函数的基本语法如下: VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])lookup_value:要查…...
数据加密、端口管控、行为审计、终端安全、整体方案解决提供商
PC端访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释: 数据加密:这是一种通过加密算法和密钥将明文转换为密文,以及通过解密算法和解密密钥将密文恢复为明文…...
编码器原理详解
编码器 什么是编码器 编码器可以用来将信息编码成为二进制代码,有点类似于取代号,人为的将二进制代码与对应的信息联系起来。 如下图所示: 假设有这三种情况会发生,且每次只发生一种情况 为了给这三种情况做一个区分ÿ…...
linux下docker搭建mysql8
1:环境信息 centos 7,mysql8 安装docker环境 2.创建mysql容器 2.1 拉取镜像 docker pull mysql:8.0.23 2.2 查询镜像拉取成功 docker images 2.3 创建挂载的目录文件 mkdir /usr/mysql8/conf mkdir /usr/mysql8/data ##给data文件赋予操作权限 chmod 777 /…...
书生·浦语大模型实战1
书生浦语大模型全链路开源体系 视频链接:书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度,一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络: (1)又被称为贝叶斯网…...
前端JS加密对抗由浅入深-1
前言: 本文主要讲解,针对前端加密数据传输站点,如何进行动态调试以获取加密算法、秘钥,本次实验不涉及漏洞挖掘,仅为学习演示,环境为本地搭建环境 此次站点加密方式为AES加密方式,现如今越来越…...
八股文打卡day17——计算机网络(17)
面试题:拥塞控制是怎么实现的? 我的回答: 1.慢启动 在连接刚建立的时候,会缓慢调大滑动窗口的大小,从而加大网络传输速率,避免速率太快,造成拥塞。 2.拥塞避免 慢启动之后,会进入拥…...
Java-经典算法-logcat获取数据
1 需求 2 语法 3.1 示例:打印本次查询数据 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;/*** 功能:adb logcat -b main -s PRIVA_LOG -d*/ public class Test {public …...
APache 网页优化
技能目标: 掌握 Apache 网页压缩 掌握 Apache 网页缓存 掌握 Apache 网页防盗链 掌握 Apache 隐藏版本信息 4.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置&…...
C语言实现关键字匹配算法(复制即用)
文章目录 前言功能要求运行截图全部代码 前言 无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中,请统计该文件中关键字出现的频度,并按此频度对关键字进行排序。要…...
【大数据】安装 Zookeeper 单机版
安装 Zookeeper 单机版 下面安装 Zookeeper,由于它是 Apache 的一个顶级项目,所以域名是 zookeeper.apache.org,所有 Apache 的顶级项目的官网都是以项目名 .apache.org 来命名的。 点击 Download 即可下载,这里我们选择的版本是 …...
Django 快速整合 Swagger:实用步骤和最佳实践
Django ,作为 Python 编写的一个优秀的开源 Web 应用框架,特别适用于快速开发的团队。对于很多场景来说,我们需要一份 API 文档,好处实在太多了: 提高开发效率:开发者可以基于 API 文档 快速学习和尝试 AP…...
阿里云网站怎么备案域名解析/软文推广发布平台
题目 思路 先把A1到An按值从小到大排序假定货舱选在任意一个位置x处,则f(x)f(x)f(x)如上图 一前一后依次给他们分组 若要∣a−x∣∣b−x∣|a-x||b-x|∣a−x∣∣b−x∣取最小值,只有a≤x≤ba≤x≤ba≤x≤b时,最小值为b−ab-ab−a(在…...
微博 分享 wordpress/东莞seo网站制作报价
package Chap2; /*** 一只青蛙一次可以跳上1级台阶,也可以跳上2级。* 求该青蛙跳上一个n级的台阶总共有多少种跳法。*/ public class JumpFloor {/*** 到达1级台阶只有1种可能,到达2级台阶有2种可能;可记为f(1) 1,f(2) 2* 要到达3级台阶&am…...
企业品牌vi设计公司/谷歌seo 外贸建站
jboss7 webJBoss AS 7已于本月初发布,同时支持Java EE Web Profile和OSGi 4.2。 此外,此版本还引入了新的微型容器体系结构,对Java上下文和依赖注入的支持以及其他更新列表。 在这次采访中,我们与Red Hat企业应用程序平台工程小…...
辛集市住房和城乡建设局网站/企业网站注册域名的步骤
企业管理软件现在最大的竞争,我个人感觉是外包公司。 现在外包行当不好做了,所以很自然都纷纷开始在国内市场出击。这些经历了国外客户锤炼和要求的外包公司,在项目管理、文档、测试、质量均有明显优势。而国内客户对于国内的企业管理软件&am…...
网站关键词可以做几个/企业邮箱哪个好
点击上方“蓝色字”可关注我们!暴走时评:日本交易所集团最近发布超级账本研究报告,对比目前主要的几种DLT方案,阐述该技术如何提高交易效率,以及该技术在金融服务中的可行性。作者提到秘密资产交易可能带来中心化和交易…...
建工网论坛/seo基础课程
测试机器学习算法 现在你对机器学习算法的分类已经有了一个大体的了解,但在更进一步了解每个算法的细节之前,你还需要对如何测试机器学习算法有一个大体的认识。 在大多数情况下,将会出现以下三类数据:训练数据集(trai…...