KNN 算法【python,机器学习,算法】

KNN(K-Nearest Neighbors)算法是一种基本的、易于理解的机器学习算法,用于分类和回归问题。在 KNN 中,一个对象的分类或值是基于其k个最近邻居的多数投票或平均值来决定的。

基本原理

  1. 距离度量:首先,KNN 算法需要一种方式来度量数据点之间的距离。常用的距离度量包括欧氏距离、曼哈顿距离等。
  2. 选择k值:k是一个超参数,表示要考虑的最近邻居的数量。k值的选择对算法的性能有很大影响。较小的k值可能导致过拟合,而较大的k值可能导致欠拟合。
  3. 确定邻居:对于数据集中的每个点,KNN算法都会找到其k个最近的邻居。
  4. 分类或回归:
  • 分类:对于分类问题,KNN算法会查看k个最近邻居的类别,并将该点分类为最常见的类别。
  • 回归:对于回归问题,KNN算法会计算k个最近邻居的平均值或加权平均值,并将该值作为预测值。

特点

  1. 简单性:KNN算法易于理解和实现。
  2. 懒惰学习:KNN算法属于懒惰学习或基于实例的学习,因为它不会在训练时立即进行学习,而是在查询时进行计算。
  3. 参数敏感:KNN算法的性能对k值的选择和距离度量的选择非常敏感。
  4. 计算量大:对于大型数据集,KNN算法的计算量可能很大,因为需要计算每个查询点与所有训练点之间的距离。

应用

KNN算法在许多领域都有应用,包括图像识别、文本分类、推荐系统等。然而,由于其计算量大和参数敏感性,它可能不是所有问题的最佳选择。

优化

为了提高KNN算法的性能,可以采取以下优化措施:

  1. 使用KD树或球树:KD树和球树是用于在多维空间中组织点的数据结构,可以加速KNN算法中最近邻居的搜索过程。
  2. 调整k值:通过实验选择最适合数据集的k值。
  3. 特征缩放:通过标准化或归一化特征来确保所有特征在相似尺度上,从而避免某些特征对距离度量产生过大的影响。
  4. 减少特征数量:通过特征选择或降维技术减少特征数量,可以加快KNN算法的计算速度并提高性能。
  5. 使用近似算法:对于非常大的数据集,可以使用近似KNN算法来加快计算速度,例如基于哈希的近似算法或基于图的近似算法。

对于给定的实现 KNN 算法,下面使用 Python 代码来做一个简单的实现。

import random
from scipy.spatial import distance# 设置样本集和预测数据
myDataset = {'data': [[2, 3, 0, 0], [3, 4, 0, 0], [4, 4, 0, 1], [5, 6, 0, 0]],'target': [2, 1, 0, 1]}
x_train, y_train = myDataset['data'], myDataset['target']
x_test = [[6, 6, 0, 0], [1, 2, 0, 0]]def knn_pre(k, x, y_train, x_train):dis_list = []for idx, x_train_point in enumerate(x_train):# 计算待预测数据与各个训练数据之间的距离,这里使用欧式距离来计算euclidean_distance = distance.euclidean(x, x_train_point)dis_list.append((euclidean_distance, y_train[idx]))# 按照距离的递增关系进行排序sort_list = sorted(dis_list, key=lambda x: x[0])# 选取与待预测数据距离最小前 K 个点tmp_list = sort_list[:k]# 确定前 K 个点所在类别的出现频率fre_dict = {}for p in tmp_list:fre_dict[p[1]] = fre_dict.get(p[1], 0) + 1max_value = max(fre_dict.values())max_keys = [k for k, v in fre_dict.items() if v == max_value]# 从个数最多的类别中随机选取一个x_pre = random.choice(max_keys)# 返回前 K 个点中出现频率最高的类别作为测试数据的预测分类return x_pre

调用示例

for x in x_test:print(knn_pre(3, x, y_train, x_train))

代码解释

  • knn_pre 函数中,首先创建一个空列表 dis_list
    来存储距离和对应的类别。然后遍历训练数据,计算待预测数据与每个训练数据的欧式距离,并将距离和类别添加到列表中。
  • 使用 sorted 函数对距离列表按距离递增排序。
  • 通过切片获取前 K 个点的信息,并创建一个字典 fre_dict 来统计每个类别出现的频率。
  • 找到频率最高的类别值,通过 random.choice 函数从这些频率最高的类别中随机选择一个作为预测结果。
  • 最后返回预测分类。

注意事项

  • 确保输入的数据格式正确,特别是样本集和预测数据的维度和类型要符合要求。
  • 选择合适的距离度量方式(这里使用了欧式距离),根据实际情况可以调整。
  • K 的值需要根据具体问题和数据特点进行合理选择。
  • 随机选择频率最高的类别时,可能存在一定的不确定性,在某些情况下可能需要进一步处理或分析。

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

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

相关文章

SRE养成计划之02-基本命令(持续更新)

基本命令(续) 软连接 软连接 --> 原始文档 --> 文档数据格式:ln -s 原始文件或目录 软连接文件若原始文件或目录被删除,链接文件将失效软连接可存放在不同分分区/文件系统 硬链接 硬链接 --> 文档数据格式&#xff1…

【Python数据预处理系列】Pandas 数据操作实战:掌握 .loc[] 方法进行高效数据选取

文章将详细介绍.loc[]方法的各种使用场景,帮助读者深入理解并掌握这一核心功能。 在Pandas库中,.loc[]方法是一种强大而灵活的数据选取工具。本文将通过详细的步骤和示例,手把手教您如何利用这一工具进行高效的数据操作。 首先,我…

waf安全事件的监控指标

概述 Web应用防火墙(WAF)是一种网络安全设备,主要用于保护网站免受各种网络攻击,如SQL注入、跨站脚本(XSS)等。WAF通过监视和分析传入的应用程序流量,根据预设的规则集对流量进行过滤&#xff…

加入 Microsoft Build 2024 的 .NET 团队!

作者:Mehul Harry 排版:Alan Wang Microsoft Build 2024 为 .NET 爱好者带来了一系列精彩的会议。无论您是经验丰富的开发人员还是刚刚开始您的开发之旅,每个人都能找到适合自己的东西。 活动形式:混合体验 大会通过现场和在线会…

力扣180题:连续出现的数字

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中,我们将详细解读力扣第180题“连续出现的数字”。通过学习本篇文章,读者将掌握如何使用SQL语句来解决这一问题,并了解相关的复杂…

掌握SVG基础:从零开始学习

格栅图可以实现图片的清晰显示,但这也意味着如果要在各种设备上使用格栅图,就会增加大量不同规格的格栅图,以适应各种尺寸的设备。这也直接导致资源文件体积的增加,矢量图没有这个问题。本文将SVG代码编写与即时设计工具相结合&am…

C++ Primer 总结索引 | 第十五章:面向对象程序设计

继承和动态绑定 对程序的编写 有两方面的影响:一是 我们可以更容易地定义与其他类相似 但不完全相同的新类;二是 在使用这些彼此相似的类编写程序时,我们可以在一定程度上 忽略掉它们的区别 在很多程序中都存在着一些相互关联 但是有细微差别…

第6章 支持向量机

SVM(Support Vector Machine, 支持向量机)有很多实现,但是本章其中最流行的一种实现,即序列最小优化(Sequence Minimal Optimization, SMO)算法。 最小优化(Sequence Minimal Optimization, SMO)算法 一种求…

PDF批量加水印 与 去除水印实践

本文主要目标是尝试去除水印,但是为了准备测试数据,我们需要先准备好有水印的pdf测试文件。 注意:本文的去水印只针对文字悬浮图片悬浮两种特殊情况,即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…

Pspark从hive读数据写到Pgsql数据库

前提条件 要使用PySpark从Hive读取数据并写入到PostgreSQL数据库,你需要确保以下几点: 你的PySpark环境已经配置好,并且能够连接到你的Hive数据。 PostgreSQL JDBC驱动程序已经添加到你的PySpark环境中。 你已经在PostgreSQL中创建好了相应…

【Web API DOM10】日期(时间)对象

一:实例化 1 获取系统当前时间即创建日期对象 const date new Date() console.log(date) 2024年6月5日周三 2 获取指定的时间 以获取2025年6月29日为例 const date new Date(2025-6-29) console.log(date) 二:日期对象方法 1 使用场景&#xf…

关于信号翻转模块(sig_flag_mod)的实现

关于信号翻转模块(sig_flag_mod)的实现 语言 :Verilg HDL 、VHDL EDA工具:ISE、Vivado、Quartus II 关于信号翻转模块(sig_flag_mod)的实现一、引言二、实现信号翻转模块的方法(1)输入接口(2)输出接口&…

新手学习编程网站一站式合集

LTPP在线开发平台 探索编程世界的新天地,为学生和开发者精心打造的编程平台,现已盛大开启!这个平台汇集了近4000道精心设计的编程题目,覆盖了C、C、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3以及C#等众多编程语…

力扣904.水果成篮

力扣904.水果成篮 哈希表记录水果种类 超过两个就把之前的去了 class Solution {public:int totalFruit(vector<int>& fruits) {int res0,n fruits.size();unordered_map<int,int> cnt;for(int i0,j0;i<n;i){cnt[fruits[i]] ;while(cnt.size() > 2){…

【javaEE初阶】

&#x1f308;&#x1f308;&#x1f308;关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE&#xff0c;一般称为java企业版&#xff0c;实际上java的历史可以追溯到上个世纪90年代&#xff0c;当时主要的语言主流的还是C语言和C&#xff0c;但是在那个时期嵌入式初…

小熊家务帮day13-day14 门户管理(ES搜索,Canal+MQ同步,索引同步)

目录 1 服务搜索1.1 需求分析1.2 技术方案1.2.1 使用Elasticsearch进行全文检索&#xff08;为什么数据没有那么多还要用ES&#xff1f;&#xff09;1.2.2 索引同步方案1.2.2.1 Canal介绍1.2.2.1 Canal工作原理 1 服务搜索 1.1 需求分析 服务搜索的入口有两处&#xff1a; 在…

c# 学习 2

常量 转义字符 类型转换

深入对比:Transformer与LSTM的详细解析

在深度学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer和长短时记忆网络&#xff08;LSTM&#xff09;是两个备受瞩目的模型。它们各自拥有独特的优势&#xff0c;并在不同的任务中发挥着重要作用。本文将对这两种模型进行详细对比&#xff0c;帮助…

Java 基础面试300题 (231-260)

Java 基础面试300题 &#xff08;231-260&#xff09; 231 String::toUpperCase是什么类型的方法引用&#xff1f; String::toUpperCase是任意方法引用的示例。它指的是String 类的toUpperCase方法&#xff0c;但不是指任何特定对象。 通常在遍历集合或流时使用。例如&#x…

强化训练:day12(删除公共字符、两个链表的第一个公共结点、mari和shiny)

文章目录 前言1. 删除公共字符1.1 题目描述1.2 解题思路1.3 代码实现 2. 两个链表的第一个公共结点2.1 题目描述2.2 解题思路2.3 代码实现 3. mari和shiny3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 删除公共字符   2. 两个链表的第一个公共结点   3. mari和shiny…