机器学习系列(一)——K-近邻算法

news2024/12/26 23:54:32

1. 算法定义

KNN 算法属于基于实例的机器学习方法。在对未知数据进行分类或回归之前,我们不需要对数据进行显式的训练或建立复杂的模型。它的核心思想是:对一个新的样本点,寻找在特征空间上与其最相似的 K 个已知数据点,采取“投票”或加权平均的方式,来决定新样本点的类别或数值预测结果

2. 工作流程概括

KNN 算法的工作流程可以概括为以下几个步骤:

  1. 计算距离:对要预测的新样本点,分别与训练数据集中每一个样本计算距离(如欧几里得距离、曼哈顿距离等)。
  2. 选择 K 个近邻:根据计算的距离进行排序,选取距离最近的 K 个样本。
  3. 投票(分类)或加权平均(回归)
    • 分类:以 K 个近邻中出现频次最高的类别作为预测结果;
    • 回归:以 K 个近邻目标值的平均或加权平均作为预测结果。
  4. 输出结果:得到新样本的类别标签或回归值。

3. 距离度量

KNN 中最常见的距离度量是欧几里得距离(Euclidean Distance),也可以根据实际需求采用其他方法,比如曼哈顿距离(Manhattan Distance)、切比雪夫距离(Chebyshev Distance)或者余弦相似度(Cosine Similarity)等。具体选择与数据分布以及业务需求相关。

常见欧几里得距离的计算公式如下(假设两个样本点分别为 x = ( x 1 , x 2 , … , x n ) x = (x_1, x_2, \ldots, x_n) x=(x1,x2,,xn) y = ( y 1 , y 2 , … , y n ) y = (y_1, y_2, \ldots, y_n) y=(y1,y2,,yn)):

d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + … + ( x n − y n ) 2 d(x, y) = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + \ldots + (x_n - y_n)^2} d(x,y)=(x1y1)2+(x2y2)2++(xnyn)2

三、KNN 的特点

  1. 优点

    • 简单易理解:原理十分直观,不需要复杂的建模过程;
    • 对数据分布无强假设:无需像线性回归等算法一样假设数据线性可分;
    • 可同时进行分类和回归:只要合理选取距离和投票/加权方式,都可以运用于分类与回归场景。
  2. 缺点

    • 预测阶段开销大:每次预测都需要对新数据与训练数据集中所有样本计算距离,若训练数据集非常大,计算量将非常可观;
    • K 的选择敏感:选择过大或过小的 K 都可能导致预测效果下降,需要结合实际数据或交叉验证确定;
    • 易受数据分布不均影响:若某些类别在训练集中占比过大,或者不同维度特征间量纲差别大,会影响距离的计算效果;
    • 缺乏可解释的模型结构:KNN 算法并不会“学习”到一个可泛化的模型,无法像决策树或神经网络一样给出可视化的结构。

四、KNN 算法使用要点与优化

  1. 归一化或标准化
    当各特征量纲差异较大时,直接计算距离可能会导致某些特征对结果的影响过于突出。为了消除量纲影响,建议在使用 KNN 之前先对数据进行标准化或归一化处理。

  2. 距离加权
    如果要进行回归,或者想让距离更近的邻居对分类决策权重更大,可以对距离进行一定的加权。常见的做法是对每个邻居设置权重 w = 1 d w = \frac{1}{d} w=d1 ( d (d (d 为距离),距离越近,权重越大。

  3. 数据降维或特征选择
    当维度过高时(即“维度灾难”),距离的计算会变得难以区分。如果数据维度过高或有大量无关特征,可以尝试使用特征选择或降维方法(例如 PCA、LDA 等),以提升 KNN 的效果和效率。

  4. 索引结构(加速检索)
    为了降低查询时间成本,可以建立诸如 k-d 树或 Ball Tree 等数据结构。对大规模数据集,还可以考虑使用近似最近邻搜索(Approximate Nearest Neighbor,ANN)算法加速检索。

numpy 实现如下:

import numpy as np
from collections import Counter

def euclidean_distance(x1, x2):
    """计算欧氏距离"""
    return np.sqrt(np.sum((x1 - x2) ** 2))

def knn(X_train, y_train, X_test, k=3):
    """
    K-NN分类函数
    
    参数:
    X_train (ndarray): 训练数据集特征,形状为 (n_samples, n_features)
    y_train (ndarray): 训练数据集标签,形状为 (n_samples,)
    X_test (ndarray): 测试数据集特征,形状为 (m_samples, n_features)
    k (int): 邻居个数
    
    返回:
    y_pred (ndarray): 预测的标签,形状为 (m_samples,)
    """
    y_pred = []
    
    for test_point in X_test:
        # 计算每个训练数据点与测试点的欧氏距离
        distances = [euclidean_distance(test_point, x_train) for x_train in X_train]
        
        # 找到距离最小的k个点的索引
        k_indices = np.argsort(distances)[:k]
        
        # 找到这k个点对应的标签
        k_nearest_labels = [y_train[i] for i in k_indices]
        
        # 使用多数表决来决定预测的标签
        most_common = Counter(k_nearest_labels).most_common(1)
        y_pred.append(most_common[0][0])
    
    return np.array(y_pred)

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

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

相关文章

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候,验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时,使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码

一、麋鹿优化算法 麋鹿优化算法(Elephant Herding Optimization,EHO)是2024年提出的一种启发式优化算法,该算法的灵感来源于麋鹿群的繁殖过程,包括发情期和产犊期。在发情期,麋鹿群根据公麋鹿之间的争斗分…

设计模式——装饰模式

文章目录 1.定义2. 结构组成3. 组合模式结构4. 示例代码5. 模式优势6. 应用场景 1.定义 装饰模式就像是给你的对象穿上不同的 “时尚服装”,在程序运行时,你可以随意地给对象搭配各种 “服装” 来增加新的功能,而且完全不用对对象本身的 “身…

python+reportlab创建PDF文件

目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…

<数据集>芝麻作物和杂草识别数据集<目标检测>

数据集下载链接 <数据集>芝麻作物和杂草识别数据集<目标检测>https://download.csdn.net/download/qq_53332949/90181548数据集格式:VOCYOLO格式 图片数量:1300张 标注数量(xml文件个数):130…

Python爬虫:速卖通aliexpress商品详情获取指南

在数字化时代,数据已成为企业竞争的关键资源。对于电商行业而言,获取竞争对手的商品信息是洞察市场动态、优化自身产品策略的重要手段。速卖通(AliExpress)作为全球知名的跨境电商平台,其商品信息的获取自然成为了许多…

【绿色碳中和】全国各省各地级市绿色金融数据(1990-2022年)

数据介绍:绿色金融指数采用熵值法进行测算,综合评价体系如下: 绿色金融指标体系 二级指标 三级指标 指标说明 绿色信贷 高能耗行业利息支出占比 六大高能耗行业利息支出/工业总利息 A股上市公司环保企业新增银行贷款占比 …

React引入Echart水球图

在搭建React项目时候,遇到了Echart官方文档中没有的水球图,此时该如何配置并将它显示到项目中呢? 目录 一、拓展网站 二、安装 三、React中引入 1、在components文件夹下新建一个组件 2、在组件中引入 3、使用水波球组件 一、拓展网站 …

Vue使用Tinymce 编辑器

目录 一、下载并重新组织tinymce结构二、使用三、遇到的坑 一、下载并重新组织tinymce结构 下载 npm install tinymce^7 or yarn add tinymce^7重构目录 在node_moudles里找到tinymce文件夹,把里面文件拷贝一份放到public下,如下: -- pub…

STM32-笔记10-手写延时函数(SysTick)

1、什么是SysTick Systick,即滴答定时器,是内核中的一个特殊定时器,用于提供系统级的定时服务。该定时器是一个24位的倒计数定时器‌。它从设定的初值(即重载值)开始计数,每经过一个系统时钟周期&#xff0…

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…

设计模式详解(建造者模式)

1、简述 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将对象的构造过程与表示分离&#xff0c;使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 2、什么是建造者模式&#xff1f; 建造者模式…

【Git 常用操作:pull push】

Git 基本概念 Git 是一个先进的开源的分布式版本控制系统&#xff0c;常用于管理工作内容、项目代码等功能。 Git 工作流程 图片来源&#xff1a;https://www.runoob.com/git/git-basic-operations.html 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff…

个人笔记:ORM数据库框架EFCore使用示例,运行通过,附源码

个人笔记&#xff1a;ORM数据库框架EFCore使用示例&#xff0c;运行通过&#xff0c;附源码 0.新建项目1. 设置环境1.1. 添加 NuGet 包1.2. 创建模型类 2. 创建上下文类3. 创建数据库和表3.1. 启用迁移3.2. 更新数据库 4. 插入数据5. 查询数据6. 更新数据7. 删除数据8. 完整示例…

IndexOf Apache Web For Liunx索引服务器部署及应用

Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…

Ubuntu 24.04.1 LTS快速源码安装postgresql15

虽然在Ubuntu中我们可以通过apt直接获取postgresql安装&#xff0c;但有些时候&#xff0c;为了自行配置postgresql安装路径和部分组件参数&#xff0c;我们需要源码安装postgresql。今天我们就通过源码编译postgresql15源码进行安装。 一、获取安装包 我们登录postgresql官网…

数据结构之栈,队列,树

目录 一.栈 1.栈的概念及结构 2.栈的实现 3.实现讲解 1.初始化栈 2.销毁栈 3.压栈 4.出栈 5.返回栈顶元素 6.返回栈内元素个数 7.判断栈内是否为空 二.队列 1.队列的概念及结构 2.队列的实现 3.实现讲解 1.初始化队列 2.销毁队列 3.单个成员入队列 4.单个成员…

Git基本操作快速入门(30min)

Git基本操作快速入门&#xff08;30min&#xff09; 文章目录 Git基本操作快速入门&#xff08;30min&#xff09;1. 建立本地仓库2. 本地仓库链接到远端仓库3. 将本地仓库推送到远端4. Git常用命令 作为一名程序员&#xff0c;使用Github来进行代码的版本管理是必修课&#xf…

汽车IVI中控开发入门及进阶(42):OpenVG

概览: OpenVG是一个无版权、跨平台的API,它为高级用户界面和矢量图形库(如SVG)提供了一个低级硬件加速接口。OpenVG主要针对需要便携式加速高质量矢量图形以获得引人注目的用户界面和文本的消费电子产品、手持设备、可穿戴设备和汽车设备,同时使硬件加速能够在非常低的功…