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

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。

K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务。它的核心思想是:给定一个新的数据点,通过查找训练数据中最接近的 K 个邻居,并根据这些邻居的标签来预测新数据点的标签。

KNN 是一种 基于实例的学习(Instance-based learning)算法。在训练阶段,它并不构建显式的模型,而是将训练数据存储起来,在预测阶段计算待预测点与训练集中所有点的距离,然后选择 K 个最近的邻居,根据邻居的标签进行投票或平均来做出预测。

KNN 的优点在于其简单易懂、无需训练过程,并且适用于大多数任务。它能够处理复杂的非线性问题,不依赖数据分布假设,能够很好地适应复杂的决策边界。

然而,KNN 的缺点也很明显。它的计算开销大,因为每次预测都需要计算所有训练数据的距离,导致在大数据集上表现不佳。此外,KNN 需要存储所有训练数据,占用较大的内存空间,并且对异常值敏感,可能会影响预测结果的准确性。

KNN算法步骤:

  1. 选择 K 个邻居的数量,K 值通常是一个奇数,以避免平票的情况。
  2. 计算待预测数据点与训练数据集中每个点的距离。
  3. 根据计算出的距离选择 K 个最接近的点。
  4. 对于分类任务,返回 K 个邻居中最多的类别;对于回归任务,返回 K 个邻居标签的均值。

代码实现

数据处理:使用iris.data数据集,用PCA进行降维。

import numpy as np
import pandas as pddef pca(X: np.array, n_components: int) -> np.array:"""PCA 进行降维。"""# 1. 数据标准化(去均值)X_mean = np.mean(X, axis=0)X_centered = X - X_mean# 2. 计算协方差矩阵covariance_matrix = np.cov(X_centered, rowvar=False)# 3. 计算特征值和特征向量eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)# 4. 按特征值降序排序sorted_indices = np.argsort(eigenvalues)[::-1]top_eigenvectors = eigenvectors[:, sorted_indices[:n_components]]# 5. 投影到新空间X_pca = np.dot(X_centered, top_eigenvectors)return X_pcadef get_data():data = pd.read_csv('iris.csv', header=None)# print(data.dtypes)unq = data.iloc[:, -1].unique()for i, u in enumerate(unq):data.iloc[:, -1] = data.iloc[:, -1].apply(lambda x: i if x == u else x)# print(data.sample(5))xuanze = np.random.choice([True, False], len(data), replace=True, p=[0.8, 0.2])train_data = data[xuanze]test_data = data[~xuanze]train_data = np.array(train_data,dtype=np.float32,)test_data = np.array(test_data, dtype=np.float32)# 归一化train_data[:, :-1] = (train_data[:, :-1] - train_data[:, :-1].mean(axis=0)) / train_data[:, :-1].std(axis=0)test_data[:, :-1] = (test_data[:, :-1] - test_data[:, :-1].mean(axis=0)) / test_data[:, :-1].std(axis=0)return (pca(train_data[:, :-1], 2),train_data[:, -1].astype(np.int32),pca(test_data[:, :-1], 2),test_data[:, -1].astype(np.int32),)if __name__ == '__main__':x_train, y_train, x_test, y_test = get_data()print(y_train.dtype)print(x_test, y_test)print(x_train.shape, y_train.shape)

knn过程:

from data_processing import get_data
import numpy as np
import matplotlib.pyplot as pltdef euclidean_distance(x_train: np.array, x_test: np.array) -> np.array:"""计算欧拉距离"""return np.sqrt(np.sum((x_train - x_test) ** 2, axis=1))def knn(k: int, x_train: np.array, y_train: np.array, x_test: np.array) -> np.array:"""k近邻算法"""predictions = []for test in x_test:distances = euclidean_distance(x_train, test)nearest_indices = np.argsort(distances)[:k]  # 返回最近的k个点的索引nearest_labels = y_train[nearest_indices]  # 返回最近的k个点的标签prediction = np.argmax(np.bincount(nearest_labels))  # 返回最近的k个点中出现次数最多的标签predictions.append(prediction)return np.array(predictions)def accuracy(predictions: np.array, y_test: np.array) -> float:"""计算准确率"""return np.sum(predictions == y_test) / len(y_test)if __name__ == '__main__':k = 5x_train, y_train, x_test, y_test = get_data()predictions = knn(k, x_train, y_train, x_test)acc = accuracy(predictions, y_test)print(f'准确率为: {acc * 100:.2f}')# 绘制训练数据plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap='viridis', marker='o', label='Train Data', alpha=0.7)# 绘制测试数据plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap='coolwarm', marker='x', label='Test Data', alpha=0.7)# 绘制预测结果plt.scatter(x_test[:, 0],x_test[:, 1],c=predictions,cmap='coolwarm',marker='.',edgecolor='black',alpha=0.7,label='Predictions',)# 添加标题和标签plt.title('KNN Classification Results')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()# 显示图形plt.show()

在这里插入图片描述

相关文章:

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…...

redis之lua实现原理

文章目录 创建并修改Lua环境Lua环境协作组件伪客户端lua scripts字典 EVAL命令的实现定义脚本函数执行脚本函数 EVALSHA命令的实现脚本管理命令的实现SCRIPT FLUSHSCRIPTEXISTSSCRIPT LOADSCRIPT KILL 脚本复制复制 EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令* 复制EVALSHA命…...

[Android] 【汽车OBD软件】Torque Pro (OBD 2 Car)

[Android] 【汽车OBD软件】Torque Pro (OBD 2 & Car) 链接:https://pan.xunlei.com/s/VOIyKOKHBR-2XTUy6oy9A91yA1?pwdm5jm# 获取 OBD 故障代码、汽车性能数据等等。Torque 使用连接到您的 OBD2 发动机管理/ECU 的 OBD II 蓝牙适配器。…...

安全问答—安全的基本架构

前言 将一些安全相关的问答进行整理汇总和陈述,形成一些以问答呈现的东西,加入一些自己的理解,欢迎路过的各位大佬进行讨论和论述。很多内容都会从甲方的安全认知去进行阐述。 1.安全存在的目的? 为了支持组织的目标、使命和宗…...

Java 运行时常量池笔记(详细版

📚 Java 运行时常量池笔记(详细版) Java 的运行时常量池(Runtime Constant Pool)是 JVM 方法区的一部分,用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示,具有动态…...

mysql增加字段操作以及关键字报错

修改mysql DDL语言 修改代码中domain 修改mapper中信息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near index, date, scroll_id, shard_ser…...

Wireshark 输出 数据包列表本身的值

在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…...

日常开发中,使用JSON.stringify来实现深拷贝的坑

使用JSON.stringify的方式来实现深拷贝的弊端 弊端一:无法拷贝NaN、Infinity、undefined这类值 无法拷贝成功的原因: 对于JSON来说,它支持的数据类型只有null、string、number、boolean、Object、Array,所以对于它不支持的数据类…...

【探商宝】:大数据与AI赋能,助力中小企业精准拓客引

引言:在数据洪流中,如何精准锁定商机? 在竞争激烈的商业环境中,中小企业如何从海量信息中快速筛选出高价值客户?如何避免无效沟通,精准触达目标企业? 探商宝——一款基于大数据与AI技术的企业信…...

Javascript网页设计案例:通过PDF.js实现一款PDF阅读器,包括预览、页面旋转、页面切换、放大缩小、黑夜模式等功能

前言 目前功能包括: 切换到首页。切换到尾页。上一页。下一页。添加标签。标签管理页面旋转页面随意拖动双击后还原位置 其实按照自己的预期来说,有很多功能还没有开发完,配色也没有全都搞完,先发出来吧,后期有需要…...

各类系统Pycharm安装教程

各类系统Pycharm安装教程 一、安装前的准备 1. 系统要求 操作系统: Windows:Windows 10 或更高版本(64位)。macOS:macOS 10.14 或更高版本。Linux:Ubuntu 18.04+、Fedora 30+ 等主流发行版。硬件要求: 内存:至少 4GB(推荐 8GB 以上)。磁盘空间:至少 2.5GB 可用空间…...

哈希表(C语言版)

文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中,小写字母出现的次数? 显然,我们可以用数组 int table[26] 来存储每个小写字母出现的次数,而且这样处理,效率奇高。假如我们想知道字…...

内容中台驱动企业数字化内容管理高效协同架构

内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...

LLaMA-Factory DeepSeek-R1 模型 微调基础教程

LLaMA-Factory 模型 微调基础教程 LLaMA-FactoryLLaMA-Factory 下载 AnacondaAnaconda 环境创建软硬件依赖 详情LLaMA-Factory 依赖安装CUDA 安装量化 BitsAndBytes 安装可视化微调启动 数据集准备所需工具下载使用教程所需数据合并数据集预处理 DeepSeek-R1 可视化微调数据集处…...

vue 文件下载(导出)excel的方法

目前有一个到处功能的需求,这是我用过DeepSeek生成的导出(下载)excel的一个方法。 1.excel的文件名是后端生成的,放在了响应头那里。 2.这里也可以自己制定文件名。 3.axios用的是原生的axios,不要用处理过的&#xff…...

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.3 RNN与LSTM在自然语言处理中的应用案例】

咱今天来聊聊在人工智能领域里,特别重要的两个神经网络:循环神经网络(RNN)和长短时记忆网络(LSTM),主要讲讲它们在自然语言处理里的应用。你想想,平常咱们用手机和别人聊天、看新闻、听语音助手说话,背后说不定就有 RNN 和 LSTM 在帮忙呢! 二、RNN 是什么? (一)…...

LLMs Ollama

LLMs 即大型语言模型(Large Language Models),是人工智能领域基于深度学习的重要技术,以下是关于它的详细介绍: 定义与原理 定义:LLMs 是一类基于深度学习的人工智能模型,通过海量数据和大量计…...

Blackbox.AI:高效智能的生产力工具新选择

前言 在当今数字化时代,一款高效、智能且功能全面的工具对于开发者、设计师以及全栈工程师来说至关重要。Blackbox.AI凭借其独特的产品特点,在众多生产力工具中脱颖而出,成为了我近期测评的焦点。以下是我对Blackbox.AI的详细测评&#xff0…...

计算机专业知识【 轻松理解数据库四大运算:笛卡尔积、选择、投影与连接】

在数据库的世界里,有几个关键的运算操作,就像是神奇的魔法工具,能帮助我们对数据进行各种处理和组合。今天,咱们就来聊聊笛卡尔积运算、选择运算、投影运算和连接运算这四大运算,用超简单的例子让小白也能轻松理解。 …...

C/C++字符串格式化全解析:从printf到std::format的安全演进与实战指南

目录 C 语言中的格式化函数对比 1. printf / fprintf / sprintf 的异同 C 中的字符串格式化 1. 流式输出 (std::ostringstream) 2. C20/23 格式化库 (std::format,需编译器支持) 跨语言对比与最佳实践 实战建议 总结 C 语言中的格式化函数对比 1. printf / …...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节&#xf…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

SQLSERVER-DB操作记录

在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...