机器学习——KNN算法

1、:前提知识

  • KNN算法是机器学习算法中用于分类或者回归的算法,KNN全称为K nearest neighbour(又称为K-近邻算法)

  • 原理:K-近邻算法采用测量不同特征值之间的距离的方法进行分类。

  • 优点:精度高

  • 缺点:时间和空间复杂度高

  • K近邻算法思想:有N个样本分布在m个类别中,要判定第x个样本为什么类别,就要求出x到N个样本每个样本的距离集合,从中找出K个最近的样本,然后通过k个样本的比例判断x所属类别,例如在k个样本中第一类占比较多,就判定x是第一类数据。注意:计算x到N个样本之间的距离方法有两种,第一种是曼哈顿距离,第二种是欧式距离,他们的计算如下:
    在这里插入图片描述
    可以看出,曼哈顿距离计算复杂度较低,计算速度快。

  • 实现方法:基于谷歌公司开发的第三方python库sklearn

  • 实现步骤:

    • 1、导入numpy、pandas、matplotlib、from sklearn.neighbors import KNeighborsClassifier第三方库
    • 2、导入原始数据(导入数据后可以通过散点图进行数据可视化简单了解下数据)
    • 3、将数据划分为训练数据(x_train、y_train)和测试数据(x_test、y_test),注意:在KNN中输入数据x为二维数据,输出数据y为一维数据。(注意:二维数据代表数据只能有行和列两个维度,但x可以有多个,x也叫做特征)
    • 4、设定KNN算法参数,引入KNN模型
    • 5、通过fit函数输入训练数据,训练KNN模型
    • 6、通过测试数据测试KNN模型
    • 7、计算模型准确率

2、案例:

  • 我有一份原始数据,数据中有两个变量,分别为“武打镜头”和“接吻镜头”,通过这两个变量可以判断这部影片为动作片还是爱情片,规则就是:武打镜头大于接吻镜头为动作片,武打镜头小于接吻镜头为爱情片,原始数据如下:
    在这里插入图片描述
  • 代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入KNN分类库
from sklearn.neighbors import KNeighborsClassifier# 1、导入数据
movie = pd.read_excel('./tests.xlsx',sheet_name="Sheet2")
# 2、数据可视化
plt.scatter(movie.loc[:,'武打镜头'],movie.loc[:,'接吻镜头'])
plt.show
# 3、训练数据赋值,x(二维)、y(一维)
x_train = movie.loc[:,['武打镜头','接吻镜头']]
y_train = movie.loc[:,'分类情况']
print(type(x_train),type(y_train))
# 4、设置KNN参数(近邻数量为5,距离计算方法为曼哈顿),引入KNN模型
KNN = KNeighborsClassifier(n_neighbors=5,p=1)
# 5、训练模型
KNN.fit(x_train,y_train)
# 6、设置测试数据测试训练完的KNN模型
x_test = np.array([[30,2],[3,36],[2,15],[30,2]])
y_test = np.array(['动作片','爱情片','爱情片','动作片'])
y_pred = KNN.predict(x_test)
print(y_pred)
# 7、计算测试集准确率(accuracy)
KNN.score(x_test,y_test)

3、鸢尾花分类任务实战:

  • 1、学习sklearn中自带的数据集调用方法
    • 导入鸢尾花数据集:from sklearn.datasets import load_iris(同过tab键代码补齐的方法就能靠大概记忆输入此行代码)
    • 使用数据集:load_iris(),如下所示为调用结果,结果为字典形式,其中data为数据键,对应的值为array二维数组(150行*4列),其中第一列特征为花萼的长度(sepal length (cm)),第二列特征为花萼的宽度’sepal width (cm)‘,第三列特征为花瓣的长度’petal length (cm)’,第四列特征为花瓣的宽度 ‘petal width (cm)’。target键对应的为150组数据对应的分类标签,其中0代表’setosa’鸢尾花,1 代表’versicolor’鸢尾花, 2代表’virginica’鸢尾花。其他键表示的就是一些数据集的相关信息。
  • 2、通过字典调用方式获取数据集中的相关数据,再根据pandas或者numpy处理数据。
# 获取输入数据
data = s_data['data']
pd.DataFrame(data)
# 获取输出数据
target = s_data['target']
  • 3、将数据集划分为训练数据和测试数据(使用sklearn库中model_selection模块中的train_test_split函数)
# 导入sklearn自带的切分训练数据和测试数据的包
from sklearn.model_selection import train_test_split# 将数据切分为训练集输入、训练集输出、测试集输入、测试集输出
# test_size的参数如果是整数就会从所有数据中取多少条作为测试数据
# test_size的参数如果是0~1的小数就会从所有数据中按比例取多少条作为测试数据
# random_state参数可以让每次数据切分都一样
x_train, x_test, y_train, y_test = train_test_split(data,target,test_size=10)
  • 4、导入KNN模型,训练数据,并测试分类效果
# 获取KNN算法
KNN = KNeighborsClassifier()
# 训练KNN算法
model = KNN.fit(x_train,y_train)
# 测试模型分类效果
model.predict(x_test)
print(y_test)
# 计算分类准确度
model.score(x_test,y_test)

4、补充

  • 1、DataFrame数据可以直接用matplotlib中的plot画出数据的折线图,下面的例子是画出鸢尾花数据集的特征数据折线图
s_data = load_iris()
# 获取输入数据
data = s_data['data']
data = pd.DataFrame(data,columns=s_data['feature_names'])
# 用DataFrame直接画图查看数据集
data.plot()

在这里插入图片描述

  • 2、绘制分类分界图:目的是将一个数据集中的数据放在一个坐标系中,然后让除了数据以外坐标系中其他区域也显示分类情况
# 1、先划分坐标系
x = np.linspace(data2.iloc[:, 0].min(), data2.iloc[:, 0].max(), 1000)   # 把x等分成1000份
y = np.linspace(data2.iloc[:, 1].min(), data2.iloc[:, 1].max(), 1000)   # 把y等分成1000份X, Y = np.meshgrid(x, y) # 按行复制y个x,按列复制x个y
XY = np.c_[X.ravel(), Y.ravel()] # 将x扁平化,将y扁平化,再一对一组合,最终XY形状为(1000000, 2)
# 用KNN模型预测
knn = KNeighborsClassifier()
knn.fit(data2, target)
y_pred = knn.predict(XY)
y_pred
# 分界图
plt.scatter(XY[:, 0], XY[:, 1], c=y_pred)

在这里插入图片描述
注意:上面绘图需要等待,可以使用matplotlib自带的绘图函数,绘图就不用等待了。
pcolormesh(): 画分界图,边界图
plt.pcolormesh(X, Y, y_pred.reshape(1000, 1000))

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

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

相关文章

【Eclipse】汉化简体中文教程(官方汉化包,IDE自带软件安装功能),图文详情

目录 0.环境 1.步骤 1)查看eclipse的版本 2)在官网找语言包,并复制链接 3)将链接复制到eclipse中 4)汉化完成 0.环境 windows11,64位; eclipse 2021-6版本 1.步骤 思路:在官网找…

LabVIEW利用线性压缩弹簧开发重量测量系统

LabVIEW利用线性压缩弹簧开发重量测量系统 柔性传感器的曲率半径相对于指定重量的变化特性可用作力测量方法。在许多应用中,例如:汽车和工业控制,计算机外围设备,操纵杆和测量设备,带有压缩弹簧和柔性传感器的重量测量…

python中以 _ _ 开头的属性 和方法

在Python中,以下划线 (_) 开头的属性和方法通常被视为内部使用或私有的。而以双下划线 (__)开头并且不以双下划线结尾的属性和方法叫做“名称修饰(name mangling)”。 以单下划线 (_) 开头的属性和方法: 这种命名约定暗…

MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

文章目录 1 准备工作1.1 下载源码1.2 测试集下载2 配置环境3 dtu数据集 重建演示3.1 重建效果查看4 补充解释4.1 bash 脚本文件超参数解释4.2 lists/dtu解释5 Meshlab查看三维点云时 ,使用技巧总结1 Meshlab查看三维点云时 ,换背景颜色2 Meshlab查看三维点云时,点云颜色很暗…

咸鱼之王俱乐部网站开发

我的俱乐部 最新兑换码 *注意区分大小写,中间不能有空格! APP666 HAPPY666 QQ888 QQXY888 vip666 VIP666 XY888 app666 bdvip666 douyin666 douyin777 douyin888 happy666 huhushengwei888 taptap666 周活动 宝箱周 宝箱说明 1.木质宝箱开启1个…

电容器件选型与应用案例

关注参数(1)容量和误差 实际电容量和标称电容量允许的最大偏差范围。在选型上注意精度等级,用字母表示:D—0.5%、F—1%、G—2%、J—5%、K—10%、M—20% (2)额定工作电压 电容器在电路中能够长期稳定、可靠工…

lintcode 1132 · 合法的三角数【中等】

题目链接,描述 https://www.lintcode.com/problem/1132 给定一个包含非负整数的数组,你的任务是计算从数组中选出的可以制作三角形的三元组数目,如果我们把它们作为三角形的边长。给定数组的长度不会超过 1000. 给定数组内的整数在 [0, 100…

2023SpringMvc和spring之八股文——面试题

概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级 Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的 web应用分成逻辑…

【C++入门到精通】C++入门 —— deque(STL)

阅读导航 前言一、deque简介1. 概念2. 特点 二、deque使用1. 基本操作(增、删、查、改)2. 底层结构 三、deque的缺陷四、 为什么选择deque作为stack和queue的底层默认容器总结温馨提示 前言 文章绑定了VS平台下std::deque的源码,大家可以下载…

【C/C++】探索内存对齐的奥秘与优势

目录 一,前言 二,什么是内存对齐? 三,内存对齐的原理 四,内存对齐的优势 五,如何实现内存对齐?(看这节就行) 1.使用 #pragma pack 来实现内存对齐的示例 七&#…

R包开发-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

目录 4-添加C函数 5-编辑元数据 6-启用Roxygen,执行文档化。 7-单元测试 8-在自己的计算机上安装R包: 9-程序发布 参考: 为什么要写这篇文章的更新日期?因为R语言发展很快,很多函数或者方式,现在可以使…

Yolo系列-yolov1

YOLO-V1 经典的one-stage方法 YouOnlyLookOnce,名字就已经说明了一切!把检测问题转化成回归问题,一个CNN就搞定了!可以对视频进行实时检测,应用领域非常广! 核心思想: Yolov1的核心思想是将对象…

【Docker系列】Docker-核心概念/常用命令与项目部署实践

写在前面 Docker是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现快速部署和高效运行。Docker的核心概念包括镜像、容器、仓库等。本文将详细介绍Docker的基本概念、安装方法以及常用命令。 一、Doc…

搭建开发环境-WSL+Ubuntu(一键搭建开发环境)

概述 所谓工欲善其事必先利其器,搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说,很多东西都已经习惯成自然,也就没有刻意和初学者说。但对于很多初学者,却是受益良多。 这个系列,先从操作系统开始…

前端工程化

早期混合开发: 1.沟通成本高 2.分工不明确 3.不变管理 4.不便维护和管理 前后端分离开发: 前端开发--------------(请求/响应)------------后端开发【依照接口文档(原型需求)】 需求分析-->接口定义--&g…

前端需要理解的工程化知识

1 Git 1.1 Git 常见工作流程 Git 有4个区域:工作区(workspace)、index(暂存区)、repository(本地仓库)和remote(远程仓库),而工作区就是指对文件发生更改的地方&#xff…

第一个VUE程序?

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…

matlab 根据索引提取点云

目录 一、语法二、说明三、名称-值对应参数1、输入参数2、输出参数四、代码示例五、结果展示六、参考链接一、语法 ptCloudOut = select(ptCloud,indices) ptCloudOut = select(ptCloud,row,column

如何使用HTML5新增的标签来优化SEO?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用HTML5新增的标签来优化SEO&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…

【kubernetes】使用kubepshere部署中间件服务

KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群&#xff0c;一主两从&#xff0c;master也作为工作节点&#xff1b;KubeSphere k8skubesphere devops比较占用磁…