人工智能与机器学习原理精解【20】

文章目录

  • KNN(K-Nearest Neighbor,K最近邻)算法
    • 概述
      • 1. 定义
      • 2. 性质
      • 3. 计算过程
      • 4. 例子和例题
      • 5. Julia实现
    • KNN算法的详细过程
      • 算法
      • 例子
      • 手动实现KNN算法
      • 使用现有库实现KNN
  • 参考文献

KNN(K-Nearest Neighbor,K最近邻)算法

是数据挖掘分类技术中最简单的方法之一,它既可以用于分类问题,也可以用于回归问题,但更常用于分类问题。下面将按照要求详细介绍KNN算法的定义、性质、计算过程、例子和例题,以及Julia语言的实现(由于Julia实现部分较为具体且可能涉及特定库,这里将提供一般性指导)。

概述

1. 定义

KNN算法是一种基于实例的学习,或者说是懒惰学习,它不需要显式地训练模型,而是将输入样本与训练集中的每个样本进行比较,找到最近的K个邻居,然后根据这些邻居的类别来预测输入样本的类别。

2. 性质

  • 简单直观:算法思想简单,易于理解和实现。
  • 无需显式训练:不需要像其他算法那样进行显式地模型训练,而是直接使用训练集进行分类。
  • 监督学习:需要有标签的数据集进行训练。
  • 对样本分布敏感:当样本分布不平衡时,分类结果可能偏向样本数量较多的类别。

3. 计算过程

KNN算法的计算过程主要包括以下几个步骤:

  1. 准备数据:包括收集、清洗和预处理数据。预处理可能包括归一化或标准化特征,以确保所有特征在计算距离时具有相等的权重。

  2. 选择距离度量方法:确定用于比较样本之间相似性的度量方法,常用的有欧氏距离、曼哈顿距离等。

  3. 确定K值:选择一个K值,即在分类时应考虑的邻居数量。这是一个超参数,可以通过交叉验证等方法来选择最优的K值。

  4. 计算距离:计算待分类样本与训练集中每个样本之间的距离。

  5. 选择邻居:根据计算得到的距离,选择与待分类样本距离最近的K个邻居。

  6. 投票或权重计算:对于分类问题,根据K个邻居的类别进行投票,选择票数最多的类别作为待分类样本的类别。对于回归问题,可以根据K个邻居的距离和标签进行加权计算,得到待分类样本的预测值。

  7. 评估和优化:使用适当的评价指标评估模型的性能,并根据需要调整参数以优化性能。

4. 例子和例题

例子:假设有一个二维平面上的点集,每个点都有一个类别标签(红或蓝)。现在有一个新的点需要分类,KNN算法会计算这个新点到所有已知点的距离,然后选择距离最近的K个点,看这些点中哪个类别的点最多,就将新点归为该类别。

例题:具体实现时,可以设定一个具体的K值(如K=3),然后计算待分类点到所有已知点的欧氏距离,选择距离最小的3个点,如果这3个点中有2个是红色,1个是蓝色,则待分类点被归类为红色。

5. Julia实现

由于Julia语言的实现细节可能因库和版本而异,这里只提供一个大致的框架性指导。在Julia中,可以使用Distances.jl库来计算距离,使用自定义函数或循环来实现KNN算法的核心逻辑。以下是一个简化的伪代码示例:

using Distancesfunction knn(x_test, x_train, y_train, k)# 初始化距离和索引数组distances = zeros(length(x_train))nearest_indices = zeros(Int, k)# 计算测试样本到每个训练样本的距离for (i, x_train_point) in enumerate(x_train)distances[i] = euclidean(x_test, x_train_point)  # 使用欧氏距离end# 选择距离最近的K个邻居的索引sorted_indices = sortperm(distances)[1:k]nearest_indices = sorted_indices# 根据邻居的类别进行投票class_votes = Dict{eltype(y_train), Int}()for index in nearest_indiceslabel = y_train[index]class_votes[label] = get(class_votes, label, 0) + 1end# 返回票数最多的类别max_vote = maximum(values(class_votes))most_common_class = first(filter(x -> class_votes[x] == max_vote, keys(class_votes)))return most_common_class
end

请注意,上述代码是一个简化的示例,并未处理所有可能的边缘情况,且可能需要根据实际情况进行调整。在实际应用中,还需要考虑数据的预处理、性能优化(如使用KD树等数据结构加速邻居搜索)等因素。
K最近邻(K-Nearest Neighbors, KNN)算法是一种基本的分类与回归方法,通常用于监督学习。在这里,我们主要讨论KNN用于分类的情况。KNN算法的核心思想是:一个样本的标签大多数情况下与它最近邻的k个样本的标签相同。

KNN算法的详细过程

算法

  1. 收集数据
    收集训练数据集,包括样本的特征和对应的标签。

  2. 处理数据

    • 如果数据集中的特征量纲不同,需要进行归一化或标准化处理,以确保每个特征对距离计算的影响是相同的。
    • 确定K值,即最近邻的个数。K值的选择通常需要通过交叉验证等方法来优化。
  3. 计算距离
    对于待分类的样本,计算它与训练集中每个样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离、切比雪夫距离等。

  4. 选择最近邻
    根据计算出的距离,选择距离待分类样本最近的K个训练样本。

  5. 投票表决
    统计这K个最近邻样本的标签,选择出现次数最多的标签作为待分类样本的预测标签。

  6. 评估模型
    使用测试数据集来评估KNN模型的性能,如准确率、召回率、F1分数等。

例子

假设我们有一个简单的二维数据集,包含以下样本和对应的标签:

样本编号特征1特征2标签
11.02.0A
21.51.8A
35.07.0B
46.08.0B

现在,我们有一个待分类的样本,其特征为(3.0, 3.0),我们需要确定这个样本的标签。

  1. 处理数据
    在这个例子中,特征量纲相同,因此不需要进行归一化处理。我们假设K=3。

  2. 计算距离
    使用欧氏距离公式,计算待分类样本与每个训练样本之间的距离:

    • 与样本1的距离:(\sqrt{(3.0-1.0)^2 + (3.0-2.0)^2} = \sqrt{5})
    • 与样本2的距离:(\sqrt{(3.0-1.5)^2 + (3.0-1.8)^2} \approx \sqrt{2.61})
    • 与样本3的距离:(\sqrt{(3.0-5.0)^2 + (3.0-7.0)^2} = \sqrt{20})
    • 与样本4的距离:(\sqrt{(3.0-6.0)^2 + (3.0-8.0)^2} = \sqrt{29})
  3. 选择最近邻
    根据计算出的距离,选择距离最小的3个样本,即样本1、样本2和样本3。

  4. 投票表决
    统计这3个样本的标签,发现样本1和样本2的标签为A,样本3的标签为B。因此,选择出现次数最多的标签A作为待分类样本的预测标签。

  5. 得出结论
    待分类样本(3.0, 3.0)的预测标签为A。

这个简单的例子展示了KNN算法的基本流程。在实际应用中,KNN算法的性能受到K值选择、距离度量方法、数据预处理等多种因素的影响,需要通过实验来优化这些参数。
在Julia中实现K最近邻(K-Nearest Neighbors, KNN)算法可以从两个角度进行:一是手动编写算法,二是使用现有的库。下面我将分别展示这两种方法。

手动实现KNN算法

首先,我们手动实现一个简单的KNN算法。这个实现将包括计算欧氏距离、找到最近的K个邻居,并进行投票表决。

using LinearAlgebra # for Euclidean distance calculation# Define a function to calculate the Euclidean distance between two vectors
function euclidean_distance(a, b)return sqrt(sum((a - b) .^ 2))
end# Define the KNN function
function knn(train_data, train_labels, test_point, k)distances = []# Calculate the distance between the test point and each training pointfor i in 1:size(train_data, 1)push!(distances, (euclidean_distance(train_data[i, :], test_point), train_labels[i]))end# Sort the distances and select the k nearest neighborssorted_distances = sort(distances, by = x -> x[1])nearest_neighbors = sorted_distances[1:k]# Count the labels of the nearest neighborslabel_counts = Dict()for (_, label) in nearest_neighborsif label in keys(label_counts)label_counts[label] += 1elselabel_counts[label] = 1endend# Find the most common labelmost_common_label = max(label_counts, by = x -> x[2])[1]return most_common_label
end# Example usage
train_data = [1.0 2.0; 1.5 1.8; 5.0 7.0; 6.0 8.0]
train_labels = ["A", "A", "B", "B"]
test_point = [3.0, 3.0]
k = 3predicted_label = knn(train_data, train_labels, test_point, k)
println("Predicted label: ", predicted_label)

使用现有库实现KNN

在Julia中,你可以使用scikit-learn的Julia接口ScikitLearn.jl来轻松实现KNN。首先,你需要安装这个包:

(julia) pkg> add ScikitLearn

然后,你可以使用以下代码来调用KNN算法:

using ScikitLearn
using ScikitLearn.CrossValidation: train_test_split
using ScikitLearn.Neighbors: KNeighborsClassifier
using ScikitLearn.Metrics: accuracy_score# Prepare the data
train_data = [1.0 2.0; 1.5 1.8; 5.0 7.0; 6.0 8.0]
train_labels = ["A", "A", "B", "B"]# Convert labels to numerical format for scikit-learn
label_mapping = {"A" => 0, "B" => 1}
train_labels_numeric = [label_mapping[label] for label in train_labels]# Split data into training and testing sets (in this case, we'll just use the whole dataset for training)
X_train, X_test, y_train, y_test = train_test_split(train_data, train_labels_numeric, test_size=0.0) # no test set# Create the KNN classifier
knn = KNeighborsClassifier(n_neighbors=3)# Fit the model
fit!(knn, X_train, y_train)# Predict the label for the test point
test_point = [[3.0, 3.0]]
predicted_label_numeric = predict(knn, test_point)# Convert the predicted label back to the original format
predicted_label = (for (key, value) in label_mapping if value == predicted_label_numeric[1] key end).next()println("Predicted label: ", predicted_label)

注意

  1. ScikitLearn.jl 是对 Python 的 scikit-learn 库的封装,因此它依赖于 Python 和 scikit-learn 的安装。
  2. 在上面的例子中,由于我们的数据集很小,我们没有划分训练集和测试集。在实际应用中,你应该划分数据集来评估模型的性能。
  3. ScikitLearn.jl 的接口可能会随着版本的更新而发生变化,因此请查阅最新的文档以获取准确的信息。

参考文献

  1. 文心一言

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

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

相关文章

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度(4位)2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

代码随想录算法训练营第三十二天 | 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

第三十二天打卡&#xff0c;动态规范第一天&#xff01;今天比较简单&#xff0c;主要理解dp的概念 509.斐波那契数列 题目链接 解题过程 状态转移方程 dp[i] dp[i - 1] dp[i - 2]; 动态规划 class Solution { public:int fib(int n) {if (n < 2) return n;int dp[n …

SQL进阶的技巧:如何实现某列的累计乘积?

目录 0 场景描述 1 数据准备 2 问题分析 3 完全情况查询 4 小结 0 场景描述 在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一场景,通过某种条件找到一列数据[X1,X2,X3...Xn],然后想要求y=X1X2X3...Xn。下面给出一个具体案例来详细解释这一问题,如下图所示…

学成在线练习(HTML+CSS)

准备工作 项目目录 内部包含当前网站的所有素材&#xff0c;包含 HTML、CSS、图片、JavaScript等等 1.由于元素具有一些默认样式&#xff0c;可能是我们写网页过程中根本不需要的&#xff0c;所有我们可以在写代码之前就将其清除 base.css /* 基础公共样式&#xff1a;清除…

大模型入门3:理解LLAMA

LLama在transformers库中的代码&#xff0c;以及各部分原理Llama3.1技术报告LLama 33b 微调尝试 Model a stack of DecoderBlocks(SelfAttention, FeedForward, and RMSNorm) decoder block 整体结构&#xff1a;最大的区别在pre-norm x -> norm(x) -> attention() -…

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源&#xff0c;作用&#xff1a;1.使IO口的不确定电平稳定在高点平&#xff0c;2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连&#xff0c;作用&#xff1a;1.从器件输出电流 2.当IO口为输入状态时&#xff0c;引脚的…

【爱给网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人&#xff0c;就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库&#xff0c;它基于 Flutter 框架&#xff0c;首先支持的是用 Python 语言开发软件…

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一&#xff0c;地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址&#xff0c;把整个机器内存比作一个酒店&#xff0c;内存单元就是这个酒店的各个房间&#xff0c;给这些房间编的门牌号&#xff0c;类比回来就是内存单元的物理地址 在第一篇介绍debug的…

文心智能体应用:美国旅游助手的诞生

创造灵感 在如今的数字化时代&#xff0c;旅行体验越来越依赖于智能技术的辅助。从机票预订到行程安排&#xff0c;再到当地美食推荐&#xff0c;智能助手在旅行中的作用愈发重要。尤其在美国这样一个广袤且多样化的国家&#xff0c;拥有一个智能旅行助手能够极大地提升游客的…

C++3D迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(char strmaze[5][5][5]) {cout << "-----" << endl;int i 0;int ia 0…

力扣爆刷第176天之贪心全家桶(共15道题)

力扣爆刷第176天之贪心全家桶&#xff08;共15道题&#xff09; 文章目录 力扣爆刷第176天之贪心全家桶&#xff08;共15道题&#xff09;零、贪心算法的解题思路&#xff1a;一、455. 分发饼干二、376. 摆动序列三、53. 最大子数组和四、122. 买卖股票的最佳时机 II五、55. 跳…

经典sql题(六)查找用户每月累积访问次数

使用聚合开窗查找用户每月累积访问次数&#xff0c;首先介绍一下使用 GROUP BY和开窗的区别 GROUP BY 行数变化&#xff1a;使用 GROUP BY 后&#xff0c;原始数据会按指定列进行分组&#xff0c;结果中每组只保留一行&#xff0c;因此行数通常减少。作用&#xff1a;适用于需…

react18基础教程系列--安装环境及packagejson文件分析

一个React项目中&#xff0c;默认会安装: react:React框架的核心react-dom:React 视图渲染的核心「基于React构建WebApp(HTML页面)J—>react-native:构建和渲染App的react-scripts: 脚手架为了让项目目录看起来干净一些&#xff0c;把webpack打包的规则及相关的插件/LOADER…

《OpenCV计算机视觉》—— 图像金字塔

文章目录 什么是图像金字塔&#xff1f;一、定义与基本原理二、主要类型三、构建过程四、应用领域 图像金字塔中的下采样和上采样一、下采样&#xff08;Downsampling&#xff09;二、上采样&#xff08;Upsampling&#xff09;三、总结 代码实现 什么是图像金字塔&#xff1f;…

YOLOv8目标检测模型——遥感小目标检测经验分享

小目标检测——YOLOV8 一、引言 背景介绍 &#xff08;1&#xff09;目标检测的重要性 目标检测在许多领域都具有极其重要的作用。在自动驾驶中&#xff0c;目标检测能够识别道路上的障碍物和行人&#xff0c;确保行车安全。在视频监控中&#xff0c;目标检测能够实时发现异…

从登录到免登录:JSP与Servlet结合Cookie的基本实现

前言 JSP中应用Cookie解析&#xff1a; 用户登录成功后&#xff0c;将用户信息保存到Cookie中&#xff0c;在页面读取Cookie并显示&#xff0c;不需要再次登录可以直接进入页面 第一步&#xff1a;创建JavaWeb项目&#xff0c;配置pom.xml文件 创建maven项目&#xff0c;项目名…

利用LlamaIndex构建ARG本地知识库

文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式&#xff0c;以及启用流式响应 在现代的人工智能应…

基于鸿蒙API10的RTSP播放器(九:进度总结)

一、前言 基于鸿蒙API10和三方库ijkpalyer2.0.4&#xff0c;实现RTSP流的流畅播放&#xff0c;支持H.264和H.265硬编码&#xff0c;既可以在基于X86的模拟机上运行&#xff0c;也可以在基于armabi-v7a的真机上运行。 二、已实现功能 视频画面尺寸调整&#xff08;2:1比例&am…

【前后端】大文件切片上传

Ruoyi框架上传文件_若依微服务框架 文件上传-CSDN博客 原理介绍 大文件上传时&#xff0c;如果直接上传整个文件&#xff0c;可能会因为文件过大导致上传失败、服务器超时或内存溢出等问题。因此&#xff0c;通常采用文件切片&#xff08;Chunking&#xff09;的方式来解决这些…