L4 KNN 算法

news2024/11/19 3:18:55
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊
    KNN 算法用于约会数据集分类

在这周中,学习如何使用 K 近邻(K-Nearest Neighbors, KNN)算法对一个约会数据集进行分类。KNN 是一种简单的、基于实例的分类算法,广泛用于解决分类和回归问题。

1. KNN 算法简介

KNN 算法的核心思想是:给定一个样本点,找到其在特征空间中最接近的 ( k ) 个邻居,然后通过邻居的类别多数投票来决定该样本的分类。它是一个非参数的、基于距离的算法。

1.1 公式推导

在 KNN 中,欧氏距离(Euclidean Distance)是最常用的距离度量方式,其公式为:

d ( x i , x j ) = ∑ n = 1 N ( x i , n − x j , n ) 2 d(x_i, x_j) = \sqrt{\sum_{n=1}^{N} (x_{i,n} - x_{j,n})^2} d(xi,xj)=n=1N(xi,nxj,n)2

其中:

  • ( d(x_i, x_j) ) 表示样本 ( x_i ) 和 ( x_j ) 之间的距离,
  • ( x_{i,n} ) 和 ( x_{j,n} ) 分别是样本 ( x_i ) 和 ( x_j ) 在第 ( n ) 个特征上的值,
  • ( N ) 是特征的总数。

通过计算测试样本与所有训练样本之间的距离,我们可以选出距离最近的 ( k ) 个邻居,并通过它们的类别标签来决定测试样本的分类结果。

2. 数据集介绍

我们使用的是一个模拟的约会数据集 datingTestSet2.txt,每一行包含 3 个特征以及 1 个标签(类别)。这些特征可能代表不同的度量,比如:

  • 每年获得的飞行常客里程数,
  • 玩游戏所占的时间百分比,
  • 每周消费的冰淇淋公升数。

3. Python 代码实现

接下来,我们通过 Python 实现 KNN 算法的分类过程,包括数据加载、模型训练和评估。

3.1 加载数据集

首先,我们通过 pandas 加载数据集,并将前 3 列作为特征,最后一列作为标签。

import pandas as pd

# 加载约会数据集
data = pd.read_table('data/datingTestSet2.txt', sep='\t', header=None)
data.head()

# 提取特征矩阵 X 和目标变量 y
X = data.iloc[:,:3]
y = data.iloc[:,3]
3.2 划分训练集与测试集

使用 train_test_split 函数将数据划分为 75% 的训练集和 25% 的测试集。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=3)
3.3 构建与训练 KNN 模型

我们使用 Scikit-learn 提供的 KNeighborsClassifier 进行模型构建。通过 fit 函数在训练集上训练模型。

from sklearn.neighbors import KNeighborsClassifier

# 实例化 KNN 模型
knc = KNeighborsClassifier()

# 训练模型
knc.fit(X_train, y_train)
3.4 模型预测与评估

训练好模型后,我们使用 predict 函数对整个数据集进行预测,并将结果加入到数据框中。同时,我们使用 score 函数评估模型在测试集上的准确率。

# 使用训练好的模型进行预测
data["预测结果"] = knc.predict(data.iloc[:,:3])

# 输出前 10 行数据,包含原始数据和预测结果
print(data.head(10))

# 计算模型在测试集上的准确率
scoreK = knc.score(X_test, y_test)
print(f"模型准确率: {scoreK}")
3.5 标准化数据(可选)

由于 KNN 基于距离进行分类,如果特征的量纲差异很大,可能会导致某些特征主导距离的计算,因此建议在 KNN 模型前对数据进行标准化。

from sklearn.preprocessing import StandardScaler

# 对特征进行标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 重新划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.25, random_state=3)

# 训练标准化后的 KNN 模型
knc.fit(X_train, y_train)

4. 结果与评估

当我们运行上述代码后,模型将对测试集进行预测,并输出测试集上的准确率。
在这里插入图片描述

模型准确率: 0.796

5. 超参数调优

KNN 模型的性能高度依赖于参数 ( k ) 的选择,常用的优化方法包括交叉验证来寻找最佳的 ( k ) 值。此外,正如上文提到的,特征标准化也是提升 KNN 模型性能的常用方法。

我们可以通过如下代码调整 ( k ) 值:

# 实例化 KNN 模型,设置 k 值
knc = KNeighborsClassifier(n_neighbors=5)

# 训练并评估模型
knc.fit(X_train, y_train)

6. 总结

KNN 算法是一种简单易用的分类算法,它的优点在于无需显式的训练过程,适合小规模的数据集,但在面对大数据集时计算复杂度较高。此外,特征的标准化和合理选择 k 值对模型性能至关重要。

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

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

相关文章

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本,后面的names是你自己的,我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…

路由器WAN口和LAN口的区别

一.路由器WAN口和LAN口的区别简单来说:LAN口输出(内网),WAN口输入(互联网),接线方法"光猫网口"——>"路由器WAN口","路由器LAN口"——>"打…

SD-WebUI forge支持flux模型。算力互联forge镜像使用教程

SD-WebUI Forge运行截图: 以下为教程: 启动SD 首先要选择使用我的镜像创建容器实例 1.进入Jupyter 2.双击打开左边main.ipynb,打开脚本 3.选中运行的代码,点击上面的运行符号 4.出现7860端口开放,说明运行成功了 …

C++入门基础知识95——【关于C++ 自增自减运算符】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 自增自减运算符的相关内容&#xff01…

Difference of Convex Relaxation (DC)

问题背景 minimize ⁡ m ∥ m ∥ 2 s u b j e c t t o ∥ m H h k e ∥ 2 ≥ 1 , ∀ k . \begin{aligned}&\underset{m}{\operatorname*{minimize}}\quad\|\boldsymbol{m}\|^2\\&\mathrm{subject~to}\quad\|\boldsymbol{m}^\mathsf{H}\boldsymbol{h}_k^e\|^2\geq1,\for…

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目: 题解: class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…

问题解决实录 | bash 中 tmux 颜色显示不全

点我进入博客 如下图,tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入: touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …

【学习笔记】手写 Tomcat 八

目录 一、NIO 1. 创建 Tomcat NIO 类 2. 启动 Tomcat 3. 测试 二、解析请求信息 三、响应数据 创建响应类 修改调用的响应类 四、完整代码 五、测试 六、总结 七、获取全部用户的功能 POJO 生成 POJO 1. 在 Dao 层定义接口 2. 获取用户数据 3. 在 Service 层定…

仪器数码管数字识别系统源码分享

仪器数码管数字识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

21.2 k8s中etcd的tls双向认证原理解析

本节重点介绍 : tls单向认证原理tls双向认证原理 在k8s中etcd监控的应用以ca.crt client.crt client.key创建的secret并挂载到prometheus中prometheus配置证书信息打到采集etcd的目的 tls单向认证 在单向SSL身份认证过程中,客户端需要验证服务端证书,…

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法,第一次使用结点 s s s作为源结点,第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格,给出每次while循环后的 d d d值和 π π π值,以及集合 S S S中的所有结点。如果要写代码&#xff0c…

鸿蒙开发知识点速记全解

入门 1、API涵盖应用框架、系统、媒体、图形、应用服务、AI六大领域。 应用框架相关Kit开放能力:Ability Kit(程序框架服务)、ArkUI(方舟UI框架)等。系统相关Kit开放能力:Universal Keystore Kit&#xf…

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

如何通过Dockfile更改docker中ubuntu的apt源

首先明确我们有一个宿主机和一个docker环境,接下来的步骤是基于他们两个完成的 1.在宿主机上创建Dockerfile 随便将后面创建的Dockerfile放在一个位置,我这里选择的是 /Desktop 使用vim前默认你已经安装好了vim 2.在输入命令“vim Dockerfile”之后,…

昇思MindSpore进阶教程--报错分析

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 概述 本章节用于介绍MindSpore为神经网络…

CSS画出三角形的做法

引言: 在网页中,会有三角形的出现,我们脑海里会有很多想法,如何去实现他们,我来提供一种比较好玩的做法。 方法: 我们实现一个三角形,当然可以使用精灵图、或者iconfont的做法,这…

redis中的数据类型(Set与ZSet)

(一)set set在我们目前有两个意思,首先就是这里使用的集合,第二个是我们的set和get方法 因为set是一个集合,所以他具有集合的一些特点: 1.集合中的元素无序 2.集合中的元素是不可重复的 3.集合间是可…

关于按键状态机解决Delay给程序带来的问题

问题产生 我在学习中断的过程中,使用EXTI15外部中断,在其中加入HAL_Delay();就会发生报错 错误地方 其它地方配置 问题原因 在中断服务例程(ISR)中使用 HAL_Delay() 会导致问题的原因是: 阻塞性: HAL_D…

Codeforces Round 976 (Div. 2 ABCDE题)视频讲解

A. Find Minimum Operations Problem Statement You are given two integers n n n and k k k. In one operation, you can subtract any power of k k k from n n n. Formally, in one operation, you can replace n n n by ( n − k x ) (n-k^x) (n−kx) for any no…

计算机的错误计算(一百一十)

摘要 计算机的错误计算(四十五)探讨了(二)中一个循环迭代案例的错误计算原因。本节分析(二)中例1循环迭代错误计算的原因。 例1. 已知 计算 在 的错数,并用实例分析计算过程中的错误数…