一、K近邻算法K-NN(有监督学习)

news2024/9/25 9:32:11

一、算法思路

K近邻算法,k-nearest neighbor,即K-NN
通俗来说:给定一个元素,然后以该元素坐标为圆心开始画圆,其中K值是超参数需要人为给定,圆的半径逐渐增大(距离度量采用欧氏距离),直到包含其他K个元素为止,然后看所包含的K个元素都属于哪些类别,根据决策规则(采用少数服从多数原则),看K个元素属于哪些类别多,那么x就归为哪类。

应用场景:已知有两个类别绿色五边形和蓝色六边形,新加入一个橙色元素x,问x可归为哪一类?
在这里插入图片描述

三要素:距离度量、K值、决策规则

①距离度量

空间中,距离越近的元素越容易是同一个类别,因为其相似度较高。
距离度量方法很多,常用的有欧式距离、曼哈顿距离、余弦距离等

Ⅰ、欧氏距离

两点之间距离公式:在这里插入图片描述
当然可以是更高维度的距离,同样道理计算方法都一样,高维度也可以应用。

Ⅱ、曼哈顿距离

两个点在坐标系上的绝对轴距总和:在这里插入图片描述

Ⅲ、余弦距离

向量空间中两个向量夹角的余弦值:在这里插入图片描述

距离度量目的是看未知元素与哪个已存在的类别最近,那么新来的元素就可以归为这类

②K值

K值可以理解为结束条件,是个超参数,需要人为给定
不同的K值最终算法表现出来的效果也不尽相同,甚至可以会差异很大
通常使用交叉验证的方法来确定最优K值

③决策规则

常见的决策规则有:少数服从多数原则、加权平均原则等

Ⅰ、少数服从多数

这个很容易了解,比如K个元素,看哪个出现的类别多,那么新来的元素就是这个类别

Ⅱ、加权平均

这种情况提前是所有的类别均有对应的权值,将K个元素所对应的类别权重相加取平均,看该值离哪个类别权重值最近,就归为这个类别

二、官网API

官网API

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)

这里的参数还是比较多的,具体的参数使用,可以根据官网给的demo进行学习,多动手尝试;这里就以一些常用的参数进行说明。
导包:from sklearn.neighbors import KNeighborsClassifier

①n_neighbors

该参数就是三要素中的K值,就是结束的条件,找到K个元素之后就停止,然后看K个值中类别最多的那个,就把新来的元素规定为这个类别;默认情况下是5
在这里插入图片描述

使用方式

KNeighborsClassifier(n_neighbors=2)

②weights

权重函数设置选择
uniform’:所有元素的权重都是一样,一视同仁,默认使用
distance’:离的近的元素权重更大
当然也可以自定义权重函数
在这里插入图片描述

使用方式

KNeighborsClassifier(weights={'distance'})
KNeighborsClassifier(weights={'uniform'})

③algorithm

采用什么算法去计算相邻元素
在这里插入图片描述
ball_tree’:采用BallTree算法去求解
kd_tree’:采用KDTree算法去求解
'brute’:暴力BF算法求解
auto’:尝试根据传递给拟合方法的值决定最合适的算法

使用方式

KNeighborsClassifier(algorithm="ball_tree")
KNeighborsClassifier(algorithm="kd_tree")
KNeighborsClassifier(algorithm="brute")
KNeighborsClassifier(algorithm="auto")

其他参数的具体使用流程以及作用可以看官网进行学习

三、代码实现

①导包

这里需要评估、训练、保存和加载模型,以下是一些必要的包,若导入过程报错,pip安装即可

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import joblib
%matplotlib inline
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

②加载数据集

数据集可以自己简单整个,csv格式即可,我这里使用的是6个自变量X和1个因变量Y
在这里插入图片描述

fiber = pd.read_csv("./fiber.csv")
fiber.head(5) #展示下头5条数据信息

在这里插入图片描述

③划分数据集

前六列是自变量X,最后一列是因变量Y

常用的划分数据集函数官网API:train_test_split
在这里插入图片描述
test_size:测试集数据所占比例
train_size:训练集数据所占比例
random_state:随机种子
shuffle:是否将数据进行打乱
因为我这里的数据集共48个,训练集0.75,测试集0.25,即训练集36个,测试集12个

X = fiber.drop(['Grade'], axis=1)
Y = fiber['Grade']

X_train, X_test, y_train, y_test = train_test_split(X,Y,train_size=0.75,test_size=0.25,random_state=42,shuffle=True)

print(X_train.shape) #(36,6)
print(y_train.shape) #(36,)
print(X_test.shape) #(12,6)
print(y_test.shape) #(12,)

④构建KNN模型

参数可以自己去尝试设置调整

knn = KNeighborsClassifier(n_neighbors=4,algorithm="auto")

⑤模型训练

就这么简单,一个fit函数就可以实现模型训练

knn.fit(X_train,y_train)

⑥模型评估

把测试集扔进去,得到预测的测试结果

y_pred = knn.predict(X_test)

看看预测结果和实际测试集结果是否一致,一致为1否则为0,取个平均值就是准确率

accuracy = np.mean(y_pred==y_test)
print(accuracy) # 0.8333333333333333

⑦模型测试

拿到一条数据,使用训练好的模型进行评估
这里是六个自变量,我这里随机整个test = np.array([[16,18312.5,6614.5,2842.31,25.23,1147430.19]])
扔到模型里面得到预测结果,prediction = knn.predict(test)
看下预测结果是多少,是否和正确结果相同,print(prediction)

test = np.array([[16,18312.5,6614.5,2842.31,25.23,1147430.19]])
prediction = knn.predict(test)
print(prediction) #[2]

⑧保存模型

knn是模型名称,需要对应一致
后面的参数是保存模型的路径

joblib.dump(knn, './knn.model')#保存模型

⑨加载和使用模型

knn_yy = joblib.load('./knn.model')

test = np.array([[11,99498,5369,9045.27,28.47,3827588.56]])#随便找的一条数据
prediction = knn_yy.predict(test)#带入数据,预测一下
print(prediction) #[4]

完整代码

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import joblib
%matplotlib inline
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

fiber = pd.read_csv("./fiber.csv")

X = fiber.drop(['Grade'], axis=1)
Y = fiber['Grade']

X_train, X_test, y_train, y_test = train_test_split(X,Y,train_size=0.75,test_size=0.25,random_state=42,shuffle=True)

knn = KNeighborsClassifier(n_neighbors=4,algorithm="auto")

knn.fit(X_train,y_train)

y_pred = knn.predict(X_test)

accuracy = np.mean(y_pred==y_test)
print(accuracy) # 0.8333333333333333

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

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

相关文章

哪些企业需要数字化转型?

数字化转型是一个广泛且持续的过程,可以使各行业的公司受益。虽然数字化转型的具体需求和目标可能因企业而异,但这通常是保持竞争力和相关性的必要条件。以下是一些可能需要数字化转型的公司和行业的一些示例: 1.传统零售商:零售…

炫云云渲染3ds max效果图渲染教程

很多人在第一次使用炫云云渲染渲染效果图的时候不知道怎么使用,其实现在使用炫云渲染效果图真的很简单,我们一起来看看。 一客户端安装 1、打开炫云云渲染官网,点击右上角的客户端下载,选择炫云客户端(NEXT版&#xf…

[linux]服务器挂代理提升下载权重速度

写在前面 这里主要以huggingface下载权重为例,介绍如何在linux中部署代理提升下载速度 实际操作 第一步:服务器安装clash文件 https://github.com/Dreamacro/clash/releases#下载clash链接第二步:使用自己的配置文件 将config.yaml替换掉…

DSOX3012A是德科技keysight DSOX3012A示波器

181/2461/8938是德科技DSOX3012A(安捷伦)示波器 是德科技DSOX3012A(安捷伦)是InfiniiVision 3000 X系列中的双通道型号。这款可升级示波器采用突破性技术设计,提供卓越的性能和功能。其独特的5仪器合一设计为相同的预算提供了更大的范围。 是德科技DSOX3012A示波器…

Vue系列(一)之 Vue入门

一. Vue简介 1.1 概述 Vue是一个构建用户界面(UI)的[渐进式]JavaScript框架。 2.2 特点 1.声明式编码,遵循MVVM原则 2.编码简单,体积小 3.组件化,复用率高,代码维护容易 2.3 MVVM介绍 MVVM,一种更好的UI模式解决…

Linux 或者 Docker 容器通过 date 设置系统时间

目录 1. Linux2. Docker 容器2.1 进入容器内部修改2.2 可能会遇到的问题 1. Linux 要在Linux系统中设置日期和时间,可以使用date命令。 使用以下命令格式来设置日期和时间: sudo date -s "YYYY-MM-DD HH:MM:SS"其中,YYYY表示年份…

Postman应用——Collection、Folder和Request

文章目录 Collection新建CollectionCollection重命名保存Request到Collection在Collection下创建Request删除Collection Folder新建FolderFolder重命名保存Request到Folder在Folder下创建Request在Folder下创建Folder删除Folder Request创建临时RequestRequest重命名删除Reques…

东芝电视Z750的音画效果好吗?调校的够真实吗?

精准匹配声音与画面,呈现“音画合一”的影院级视听盛宴,东芝电视Z750真的很不错,东芝电视拥有70余年的原色调校技术,色彩看起来细腻且舒服,饱和度和景深等都处理的很恰当,而且还有火箭炮音响系统,也是经过日本专业调校的,针对不同家居场景,都有不同的声音处理方案,让我们听到的…

基因组大小查询(二)|基因组组装结果查询

基因组大小(size of genome)是指单倍体细胞核中的所含的DNA的总量。在进行基因组测序之前,生物学家是用质量来衡量不同生物之间基因组的大小。对于已经测序发表的基因组,可以直接通过查询相关数据库中提交的基因组信息&#xff0c…

最新USB3.2接口,速度每秒传输2GB

你还用U盘吗?根据最新的USB结构规范来看,你的U盘或许该换新了。USB Promoter Group近日宣布USB 3.2规格将让现有的USB Type-C数据线传输速度提升一倍:作为USB3.1的升级版,它最主要的改变就是将理论传输速率从1GB/s提升到2GB/s。 根…

气传导耳机对耳朵有伤害吗?气传导耳机哪款好?

​随着气传导耳机的快速发展,在运动、办公等场合能够经常看到,带来了前所未有的舒适体验。作为一种新型耳机类型,相较传统入耳式耳机来说,更有利于耳道卫生,在听歌时还能保持对环境声的感知。面对市面上这么多气传导耳…

html排版标签

1.标题标签h1-h6align 2.水平线<hr> 和换行<br/>3.html实体标签 半角空格&emsp; 全角空格< >> <其他的html实体 4.div和span标签5.段落标签<p> html常用标签分类&#xff1a;排版标签、图片标签、超链接标签、表格标签、列表标签、表单标签 …

坐标休斯顿,TDengine 受邀参与第九届石油天然气数字化大会

美国中部时间 9 月 14 日至 15 日&#xff0c;第九届石油天然气数字化大会在美国德克萨斯州-休斯顿-希尔顿美洲酒店举办。本次大会汇聚了数百名全球石油天然气技术高管及众多极具创新性的数据技术方案商&#xff0c;组织了上百场硬核演讲&#xff0c;技术专家与行业从业者共聚一…

【PyTorch 攻略 (4/7)】张量和梯度函数

一、说明 W在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数相对于给定参数的梯度进行调整。损失函数计算神经网络产生的预期输出和实际输出之间的差异。 目标是获得尽可能接近零的损失函…

一款 Linux 邮件客户端—Nylas Mail

导读Linux 上面有许多邮件客户端&#xff0c;Geary、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务&#xff0c;但是我发现了值得一试的软件&#xff1a; Nylas Mail。 为什么使用 Nylas&#xff1f; ​很多人因为种种原因选择了 Nylas Mail。让我们…

雷池社区WAF:保护您的网站免受黑客攻击 | 开源日报 0918

keras-team/keras Stars: 59.2k License: Apache-2.0 Keras 是一个用 Python 编写的深度学习 API&#xff0c;运行在机器学习平台 TensorFlow 之上。它 简单易用&#xff1a;减少了开发者认知负荷&#xff0c;使其能够更关注问题中真正重要的部分。灵活性强&#xff1a;通过逐…

Learn Prompt-ChatGPT 精选案例:代码助理

你可以使用 ChatGPT 进行代码生成、生成测试用例、注释、审查和漏洞检测。 代码生成​ 我们可以让 ChatGPT 自动生成一个排序算法中的快速排序的Python代码。 简单的代码生成对于 ChatGPT 来说小事一桩。 测试用例​ 用例来源出自StuGRua 在待测函数函数定义清晰的情况下…

什么是气传导耳机?气传导耳机值得入手吗?

​随着生活节奏的加快&#xff0c;人们越来越关注听力健康。气传导耳机以其独特的传导方式和舒适的佩戴感受&#xff0c;逐渐成为耳机市场的新宠。气传导耳机不入耳设计听音&#xff0c;让你在享受音乐的同时&#xff0c;也能保护你的听力安全。今天我们就一起来看看几款值得大…

无涯教程-JavaScript - COMBINA函数

描述 COMBINA函数返回给定数量的项目的组合数量(重复)。 语法 COMBINA (number, number_chosen)争论 Argument描述Required/OptionalNumber 必须大于或等于0,并且大于或等于Number_chosen。 非整数值将被截断。 RequiredNumber_chosen 必须大于或等于0。 非整数值将被截断。…

国际上被广泛认可的电子邮箱服务有哪些?

随着全球化的发展&#xff0c;越来越多的企业开始涉足国际贸易。在众多的邮箱服务提供商中&#xff0c;哪些是国际上比较认可的呢&#xff1f;本文将为您详细介绍几款在全球范围内广受好评的邮箱服务&#xff1a;Gmail(谷歌邮箱)、Outlook(微软邮箱)、Yahoo Mail(雅虎邮箱)、Zo…