机器学习/数据分析--通俗语言带你入门K-邻近算法(结合案例)

news2025/1/9 14:19:58
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

前言

  • 机器学习是深度学习和数据分析的基础,接下来将更新常见的机器学习算法
  • 注意:在打数学建模比赛中,机器学习用的也很多,可以一起学习
  • 欢迎收藏 + 点赞 + 关注

文章目录

  • K-邻近算法模型简介
    • 1、模型简介
    • 2、模型难点与求解
      • KNN难点
      • 解决方法
        • K值选取问题
        • 选取K值后,如何遍历速度最快
        • 距离选取
          • 欧式距离
          • 曼哈顿距离
          • 切比雪夫距离
  • 案例求解
    • 1、导入数据
    • 2、统计分析
    • 3、数据预处理
    • 4、划分数据集
    • 5、模型的创建与训练
    • 6、预测结果
    • 7、模型评估

K-邻近算法模型简介

1、模型简介

解决了什么问题?

  • K-邻近,简称KNN,KNN解决了的分类与回归问题,主要运用解决分类问题

例子说明

在这里插入图片描述

首先上图,上图有三类不同形状,O是要预测他属于那一类,KNN算法的思想就是,选取与他最近的K的点,那个类别占比大,他就属于那个类别。上图中:

  • K值为3时候,三角形最多,故它属于三角形类
  • K值为5的时候,正方形最多,故它属于正方形那一类

2、模型难点与求解

KNN难点

  1. K值的选取问题
  2. 选取K值后,如何遍历速度最快?
  3. 距离如何计算问题

解决方法

K值选取问题

在李航老师的《统计学习方法》上所说:

  1. 选择较小的K值,就相当于用较小的领域中的训练实例进⾏预测, “学习”近似误差会减小,只有与输⼊实例较近或相似的训练实例才会对预 测结果起作⽤,与此同时带来的问题是“学习”的估计误差会增⼤, 换句话说,**K值的减小就意味着整体模型变得复杂,容易发生过拟合; **
  2. 选择较大的K值,就相当于⽤较⼤领域中的训练实例进⾏预测, 其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增⼤。这时候,与输⼊实例较远(不相似的)训练实例也会对预测器作⽤,使预测发⽣错误。 且**K值的增大就意味着整体的模型变得简单。 **
  3. K=N(N为训练样本个数),则完全不足取, 因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。 在实际应⽤中,K值⼀般取⼀个比较小的数值,例如采⽤交叉验证法(简单来 说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。

方法:网格搜索

网格搜索解决的问题是,当有多个参数选择的时候,选取最优解的参数,如下:

model = KNeighborsClassifier()   # algorithm:自动选择算法确定K值
# 网格搜索查找最优 n_neighors
grid_search = {"n_neighbors": [1, 3, 5, 7, 9]}
model = GridSearchCV(model, param_grid=grid_search, cv=5)  # 交叉验证设置为 5
选取K值后,如何遍历速度最快

这个方法在sklearn库中很好解决,在使用KNeighborsClassifier()创建模型的时候,KNeighborsClassifier()参数列表中有一个algorithm的参数,它包含了一下几个参数,默认是auto,有兴趣的同学可以查阅资料学习Kd_tree的原理,推荐在b站中kd树相关的教程。

  1. ‘auto’:
    • 当选择 'auto' 时,scikit-learn 会根据训练数据的大小和维度自动选择最合适的算法。这是默认选项,通常是一个好的起点,因为它可以根据数据的特性来选择最佳算法。
  2. ‘ball_tree’:
    • 使用 Ball Tree 数据结构。适用于高维空间中的最近邻搜索。Ball Tree 是一种树形数据结构,它可以有效地处理高维数据。
  3. ‘kd_tree’:
    • 使用 KD Tree 数据结构。适用于低至中等维度的空间中的最近邻搜索。KD Tree 也是一种树形数据结构,但更适合低维数据。
  4. ‘brute’:
    • 使用蛮力(Brute Force)方法来计算最近邻。这种方法直接计算每个样本之间的距离,没有使用任何加速数据结构。虽然简单,但在大样本集或高维数据中效率较低。
距离选取

通过查阅资料,发现主要的距离选取分为以下几种类型:

欧式距离

欧氏距离(Euclidean Distance)是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离,他的公式如下:

在这里插入图片描述

曼哈顿距离

在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离(Manhattan Distance)”。曼哈顿距离也称为“城市街区距离”(City Block distance)。

在这里插入图片描述

切比雪夫距离

国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离(Chebyshev Distance)。

在这里插入图片描述

在这里插入图片描述

案例求解

背景: 海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:

  • ①不喜欢的人;
  • ②魅力一般的人;
  • ③极具魅力的人。

她现在总结好的数据中(即训练集)包含三种特征:

  • ①每年获得的飞行常客里程数
  • ②玩视频游戏所耗时间百分比
  • ③每周消费的冰淇淋公升数

她希望根据现有的数据来判断一个陌生男人会被她归到哪一类。

求解步骤

  1. 导入数据
  2. 统计分析
  3. 数据预处理
  4. 划分数据集
  5. 模型的创建与训练
  6. 预测结果
  7. 模型评估

1、导入数据

import pandas as pd 

data = pd.read_table('./datingTestSet2.txt', sep='\t', header=None)    
data.head()
0123
0409208.3269760.9539523
1144887.1534691.6739042
2260521.4418710.8051241
37513613.1473940.4289641
4383441.6697880.1342961

分析:pd.read_table(‘./datingTestSet2.txt’, sep=‘\t’, header=None)

  • 第一个参数:路径
  • sep:表示数据字段中用什么分割
  • header:第一行是否是标题,不是,则用0、1、2……代替

2、统计分析

# 查看维度
data.shape

答案:

(1000, 4)
# 查看数据基本信息
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   0       1000 non-null   int64  
 1   1       1000 non-null   float64
 2   2       1000 non-null   float64
 3   3       1000 non-null   int64  
dtypes: float64(2), int64(2)
memory usage: 31.4 KB
# 查看统计
data.describe()
0123
count1000.0000001000.0000001000.0000001000.000000
mean33635.4210006.5599610.8320731.985000
std21957.0068334.2436180.4972390.818196
min0.0000000.0000000.0011561.000000
25%13796.0000002.9339630.4089951.000000
50%31669.0000006.5952040.8094202.000000
75%47716.25000010.0565011.2728473.000000
max91273.00000020.9193491.6955173.000000
# 查看缺失值
data.isnull().sum()   

答案:

0    0
1    0
2    0
3    0
dtype: int64

经过分析,每一列都没有缺失值

# 每个特征之间的相关性
data.iloc[:, :3].corr()
012
01.0000000.465847-0.009171
10.4658471.0000000.008874
2-0.0091710.0088741.000000

3、数据预处理

KNN,特征值来源于生活统计,特征一与特征二、三差距很大,故为了确保特征值在计算距离的时候准确率高一点,故这里对特征数据进行归一化处理

from sklearn.preprocessing import MinMaxScaler
import seaborn as sns
import matplotlib.pyplot as plt 
import numpy as np
 
# 标准化,对特征
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data.iloc[:, :3])   
# 将标准化后的数据转为DataFrame
data_scaled = pd.DataFrame(data_scaled)
# 标准化后数据统计信息
print("标准化后数据统计信息:\n", data_scaled.describe())
# 可视化前后数据分布
plt.figure(figsize=(16, 6))
# 标准化前的分布
plt.subplot(1, 2, 1)
sns.histplot(data.iloc[:, 0], kde=True, color='blue')
plt.title('Distribution of Median Income before Standardization')
# 标准化后的分布
plt.subplot(1, 2, 2)
sns.histplot(data_scaled.iloc[:, 0], kde=True, color='red')
plt.title('Distribution of Median Income after Standardization')
plt.show()
标准化后数据统计信息:
                  0            1            2
count  1000.000000  1000.000000  1000.000000
mean      0.368514     0.313583     0.490401
std       0.240564     0.202856     0.293467
min       0.000000     0.000000     0.000000
25%       0.151151     0.140251     0.240703
50%       0.346970     0.315268     0.477032
75%       0.522786     0.480727     0.750543
max       1.000000     1.000000     1.000000

在这里插入图片描述

# 赋值给原数据
data.iloc[:, :3] = data_scaled.iloc[:, :3]
data
0123
00.4483250.3980510.5623343
10.1587330.3419550.9872442
20.2854290.0689250.4744961
30.8232010.6284800.2524891
40.4201020.0798200.0785781
...............
9950.1221060.1630370.3722242
9960.7542870.4768180.3946211
9970.2911590.5091030.5107953
9980.5271110.4366550.4290053
9990.4794080.3768090.7857183

1000 rows × 4 columns

4、划分数据集

from sklearn.model_selection import train_test_split

X = data.iloc[:, :3]
y = data.iloc[:, 3]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

5、模型的创建与训练

from sklearn.neighbors import  KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

model = KNeighborsClassifier()   # algorithm:自动选择算法确定K值
# 网格搜索查找最优 n_neighors
grid_search = {"n_neighbors": [1, 3, 5, 7, 9]}
model = GridSearchCV(model, param_grid=grid_search, cv=5)  # 交叉验证设置为 5
model.fit(X_train, y_train)

6、预测结果

# 对整个模型进行预测
data["预测结果"] = model.predict(data.iloc[:, :3])
data.head(10)
0123预测结果
00.4483250.3980510.56233433
10.1587330.3419550.98724422
20.2854290.0689250.47449611
30.8232010.6284800.25248911
40.4201020.0798200.07857811
50.7997220.4848020.60896111
60.3938510.3265300.71533533
70.4674550.6346450.32031233
80.7395070.4126120.44153611
90.3887570.5866900.88936033
# 查看后 10 行
data.tail(10)
0123预测结果
9900.3040330.4085570.07527933
9910.1081150.1288270.25476422
9920.2008590.1888800.19602922
9930.0414140.4711520.19359822
9940.1992920.0989020.25305822
9950.1221060.1630370.37222422
9960.7542870.4768180.39462111
9970.2911590.5091030.51079533
9980.5271110.4366550.42900533
9990.4794080.3768090.78571833

7、模型评估

scorek = model.score(X_test, y_test)

scorek

答案:

0.93

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

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

相关文章

初识Linux · yum和vim

目录 前言&#xff1a; 1 yum 1.1 yum是什么&#xff1f; 1.2 Centos的生态和yum的本地配置 1.3 yum的相关操作 2 vim 前言&#xff1a; 我们学习Linux的时候&#xff0c;是有编程语言的基础的&#xff0c;那么呢&#xff0c;我们学习Linux的时候最迫切的就是希望能打印…

Flat Ads:全球金融应用现状与发展趋势深度解析

随着全球数字化进程的加速,金融科技(FinTech)应用正逐渐成为现代生活不可或缺的一部分。从移动银行到数字支付,再到智能理财工具,金融应用正在重新定义传统金融服务的边界,并推动行业的深刻变革。 本篇文章 Flat Ads 将从全球视角出发,深入剖析当前金融应用市场的现状,探讨未来…

开关电源测试系统方案:系统结构功能、特点、测试项目

为了应对开关电源测试中的复杂挑战&#xff0c;我们推出了NSAT-8000系列开关电源ate测试系统&#xff0c;它以其全面的功能和灵活性&#xff0c;适应了电源产品测试场景&#xff0c;解决了测试难题。 开关电源测试系统 NSAT-8000系列之开关电源测试系统适用于AC/DC和DC/DC开关电…

苹果macbook电脑怎么玩《黑神话:悟空》游戏教程来了

火爆全网《黑神话&#xff1a;悟空》是一款基于中国神话故事《西游记》改编的动作角色扮演游戏&#xff0c;它在PC平台上的系统要求已经公布&#xff0c;但目前官方尚未发布Mac版本。不过&#xff0c;Mac用户可以通过使用系统兼容工具如CrossOver来尝试在Mac上运行这款游戏。Cr…

《黑神话:悟空》游戏攻略:第一回合打法教程!

《黑神话&#xff1a;悟空》是一款以西游记为背景的动作角色扮演游戏&#xff0c;玩家在游戏中将面对各式各样的强大敌人和BOSS。在游戏的第一回合中&#xff0c;你将遇到牯护院、灵虚子、幽魂等多个BOSS。以下是详细的BOSS打法攻略&#xff0c;帮助你在战斗中游刃有余。你可以…

Ubuntu22安装MySQL8,并关闭大小写

最近因为设置MySQL不区分大小写踩了很多坑&#xff0c;把解决过程记录下来。 首先我这个是阿里云全新服务器&#xff0c;操作系统&#xff1a;Ubuntu 22.04 64位 连接到服务器后&#xff1a; 1 安装MySQL 1.1 更新软件包 以下命令皆已单独放至代码块内&#xff0c;直接复制…

服务器配置miniconda环境

目录 1. 查看服务器的操作系统2. 查看服务器的cuda版本3. 配置开发环境3.1 安装miniconda3环境3.2 创建虚拟环境3.3 在虚拟环境中安装pytorch3.4 在虚拟环境中安装库 1. 查看服务器的操作系统 执行代码&#xff1a; uname -a发现是Ubuntu 22.04 2. 查看服务器的cuda版本 执…

鸿蒙OS应用开发例题

单选题 第24/60题 自动跳下一题0 在编译构建HAP时&#xff0c;会从HAP模块及依赖的模块中收集资源文件&#xff0c;如果不同模块下的资源文件出现重名冲突 时&#xff0c;会按照优先级进行覆盖&#xff0c;现在有一个HAP依赖了两个HAR,依赖配置如下所示: // oh-package. j…

柔性织物处理 | 山大宋锐老师 | 最新演讲

笔者是清华在读研究生&#xff0c;主要关注人形机器人、具身智能。将持续分享行业前沿动态、学者观点整理、论文阅读笔记、知识学习路线等。欢迎交流 最近听了宋老师的演讲&#xff0c;以下是学习整理。部分图截自直播&#xff0c;若模糊望见谅 演讲信息&#xff1a; 【会议】…

郁李:花语与植物特征的魅力探寻

一、花语的奥秘 郁李的花语丰富多样&#xff0c;其中 “忠实” 代表着坚定不移的忠诚和信任&#xff0c;寓意着一份真挚而深厚的情感&#xff0c;无论外界如何变化&#xff0c;都能保持初心不变。“困难” 这一花语似乎不太讨喜&#xff0c;它可能象征着人生道路上难免会遭遇的…

iOS 通知

iOS 通知分为本地推送和远程推送两类 一. 本地推送使用流程 1. 注册通知 //请求通知权限 UNUserNotificationCenter *center [UNUserNotificationCenter currentNotificationCenter];[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizati…

Java学习_18_Stream流

文章目录 前言一、不可变集合二、Stream流思想第一步&#xff1a;得到Stream流第二步&#xff1a;Stream流的中间方法Stream流的终结方法 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 一、不可变集合 不可变集合就是长度和内容都不可…

HTML+CSS浮动和清除浮动的效果及其应用场景举例

一、清除浮动的效果 解释 .container&#xff1a;用于展示浮动和清除浮动效果的容器&#xff0c;具有边框和背景色以便于区分。 .float-box&#xff1a;浮动元素&#xff0c;用不同的背景色标识。 .clearfix&#xff1a;使用伪元素清除浮动的类&#xff0c;应用于第二个容器。 …

【chips】个人笔记系列-SystemVerilog

Title&#xff1a;System Verilog 学习 背景与发展 什么是SV 啥是SystemVerilog&#xff1f; 就是用来专门写验证和测试的 Verilog 升级版——在verilog的基础上加了些C的思想、语法、模块。 为啥要搞出一个SystemVerilog&#xff1f; 设计IC (integrated circuit)时用的是 …

02_TensorFlow2 Eager Execution:让AI编程从‘慢条斯理’变‘急不可耐’的神奇魔法!

1. Eager execution 的特性 即刻执行&#xff08;Eager execution&#xff09;是TensorFlow2.0的新特性&#xff0c;如同python解释器一样&#xff0c;执行即可获得计算结果&#xff0c;不需要手动建立图结构和会话&#xff0c;与python的兼容性更强, 为快速搭建和测试算法模型…

C语言 之 内存函数 memcpy、memmove函数的使用和模拟实现 memset、memcmp函数的使用

文章目录 1.memcpy函数的使用和模拟实现例子&#xff1a;模拟实现: 2.memmove函数的使用和模拟实现例子&#xff1a;模拟实现&#xff1a; 3.memset函数的使用**例子&#xff1a;** 3.memcmp函数的使用例子&#xff1a; 首先 我们要明确下面这些函数之所以被称作内存函数&#…

130-横向移动PTH哈希PTT票据PTK密匙Kerberos

pass the hash &#xff08;哈希传递攻击&#xff0c;简称pth&#xff09;利用lm&#xff08;老版本哈希&#xff09;或ntlm&#xff08;新版本&#xff09;的值进行的渗透测试 pass the ticket &#xff08;票据传递攻击&#xff0c;简称ptt&#xff09;利用的票据凭证TGT进行…

sql手工注入——sqli-labspage第六关到第十关

第六关 一确定攻击点判断闭合方式 跟个双引号引起报错 说明页面有报错语句的位置 http://127.0.0.1/Less-6/?id1%22http://127.0.0.1/Less-6/?id1%22尝试闭合 闭合成功 http://127.0.0.1/Less-6/?id1%22%20--http://127.0.0.1/Less-6/?id1%22%20-- 二.查询数据库名 ht…

多商户小程序审核存在商户入口无法通过

小程序拒绝如下&#xff1a; 需要注意的地方如下&#xff1a; 关闭店铺展示关闭商户入驻关闭diy中的申请入口、店铺街入口等关闭个人中心广告的申请入口关闭分销关闭支付宝

基于Java语言的能源管理系统中软网关的应用

介绍 软网关适用于建筑、工厂、商场、医院、园区、高耗能企业、城市双碳建设平台等的水、电、气、热、油等能源数据采集、加工、分析、预警、碳指标、碳排放计算等场景&#xff1b; 企业通过软网关采集底层电表数据&#xff0c;传输给时序库&#xff0c;从而完成能源管理系统…