KNN分类算法与鸢尾花分类任务

鸢尾花分类任务

  • 1. 鸢尾花分类步骤
    • 1.1 分析问题,搞定输入和输出
    • 1.2 每个类别各采集50朵花
    • 1.3 选择一种算法,完成输入到输出的映射
    • 1.4 第四步:部署,集成
  • 2. KNN算法原理
    • 2.1 基本概念
    • 2.2 核心理念
    • 2.3 训练
    • 2.4 推理流程
  • 3. 使用 sklearn 完成分类任务
    • 3.1 代码实现
    • 3.2 输出结果
  • 4. 距离度量
      • 计算内积
      • 计算模
      • 计算余弦相似度

1. 鸢尾花分类步骤

1.1 分析问题,搞定输入和输出

  • 输入:花;
  • 输出:类别
  • 如何数字化一个实体(entity)?
    • 用这个实体的特征/属性来刻画这个实体!!!
    • 四个属性:花瓣长,花瓣宽,花萼长,花萼宽
  • 输出:从零开始编号:0, 1, 2 …(zero index),鸢尾花一共3类
  • 一个样本:花瓣长,花瓣宽,花萼长,花萼宽,类别编号

1.2 每个类别各采集50朵花

  • 花瓣长1,花瓣宽1,花萼长1,花萼宽1,类别编号1
  • 花瓣长2,花瓣宽2,花萼长2,花萼宽2,类别编号2
  • 花瓣长3,花瓣宽3,花萼长3,花萼宽3,类别编号3
  • 花瓣长150,花瓣宽150,花萼长150,花萼宽150,类别编号150

1.3 选择一种算法,完成输入到输出的映射

  • 分类算法
    • KNN:K紧邻算法
    • GNB:高斯贝叶斯
    • DT:决策树算法
    • SVM:支持向量机
    • RF:随机森林算法
    • 集成学习算法

1.4 第四步:部署,集成

2. KNN算法原理

2.1 基本概念

  • KNN: K-Nearest Neighbors K个最近的邻居,所以也叫 K-近邻 算法

2.2 核心理念

  • 近朱者赤,近墨者黑
  • 跟什么样的人在一起,你就会变成什么样的人!!!

2.3 训练

  • 惰性计算算法
  • 规则 + 数据,不是严格意义上的人工智能算法

2.4 推理流程

  • 给定一朵花,如何判定它是第几类?
  • 第一步:找出这朵花 K 个最近的邻居(最好的兄弟,闺蜜)
    • 相似度的度量
      几何视角: 1. 欧式空间,距离计算,2. 勾股定理
      • 向量视角:1. 余弦相似度
  • 第二步:K个邻居进行投票,选出类别出现次数最多的类

3. 使用 sklearn 完成分类任务

3.1 代码实现

  • knn_demo
from sklearn.datasets import load_iris
# 加载数据
X,y = load_iris(return_X_y=True)
print(X.shape,y.shape)
# 数据集切分
from sklearn.model_selection import train_test_split
# 参数:shuffle=True:打乱数据集,random_state=0 指定随机种子,方便复现结果
X_train,X_test,y_train,y_test =  train_test_split(X,y,test_size=0.2,shuffle=True,random_state=0)# 引入一个模型
from sklearn.neighbors import KNeighborsClassifier  
# 1.构建模型
knn=KNeighborsClassifier(n_neighbors=3)
# 2.训练模型
knn.fit(X_train,y_train)
# 3.预测
y_pred=knn.predict(X_test)
print(y_pred)
print(y_test)
print(y_pred==y_test)
# 4.评估模型
acc = (y_pred==y_test).mean()
print(acc)# 决策树
from sklearn.tree import DecisionTreeClassifier
# 构建模型
dtc = DecisionTreeClassifier()
# 训练模型
dtc.fit(X_train,y_train)
# 预测
y_pred = dtc.predict(X_test)
# 评估模型
acc = (y_pred==y_test).mean()
print(acc)# 支持向量机
from sklearn.svm import SVC
svc = SVC()
svc.fit(X_train,y_train)
y_pred = svc.predict(X_test)    
acc = (y_pred==y_test).mean()
print(acc)# 以下是自己手动写一个KNN的过程
import joblib
joblib.dump(value=knn, filename="knn.aura")class MyKNeighborsClassifier(object):"""自定义KNN分类器算法"""def __init__(self, n_neighbors=5):"""初始化方法:- 输入:- 超参 Hyper-Parameter(人为置顶的,不是系统学习的)- 输出:- 没有输出"""# 超参设置self.n_neighbors = n_neighborsdef fit(self, X, y):"""训练过程- 输入:- X:训练集的特征(矩阵)- y:训练集的标签(向量)- 输出:- 无输出"""import numpy as np# 类型转换X = np.array(X)y = np.array(y)# 形状校验if X.ndim != 2 or y.ndim != 1 or X.shape[0] != y.shape[0]:raise ValueError("入参有误")# 把训练集挂载到模型上self.X = Xself.y = ydef predict(self, X):"""预测过程:- 输入:- X:待预测的样本的特征(批量)- 输出:- y:预测的类别"""import numpy as npfrom collections import Counter# 类型转换X = np.array(X)# 形状校验if X.ndim != 2 or X.shape[1] != self.X.shape[1]:raise ValueError("入参有误")# 推理过程results = []for x in X:distances = np.sqrt(((self.X - x) ** 2).sum(axis=-1))idxes = np.argsort(distances)[:self.n_neighbors]labels = self.y[idxes]label = Counter(labels).most_common(1)[0][0]results.append(label)return np.array(results)# 1, 构建模型
my_knn = MyKNeighborsClassifier()# 2,训练
my_knn.fit(X=X_train, y=y_train)# 3, 预测
y_pred = my_knn.predict(X=X_test)print(y_pred)
print(y_test)acc = (y_pred == y_test).mean()
print(acc)
  • 模型部署
import joblib
knn = joblib.load(filename="knn.aura")# 预测  数据都是批量预测的,所以要写成二维结构,就算是一个数据,也要假装是多个
import numpy as np
X = np.array([[6.3,3.3,6.,2.5]])
print(X.shape)
result = knn.predict(X=X)
print(result)

3.2 输出结果

在这里插入图片描述

4. 距离度量

计算内积

计算模

计算余弦相似度

import numpy as np
a = np.array([2, 5])
b = np.array([1, 8])
d = np.sqrt(((a - b) ** 2).sum())
d

3.1622776601683795

# 手动计算 a 和 b 的内积
(a * b).sum()

42

# 计算内积更优雅的方式
a @ b

42

# 这样也能计算内积
np.dot(a, b)

42

# 同样是计算内积
a.dot(b)

42

# 手动计算 a 的模
np.sqrt((a ** 2).sum())

5.385164807134504

# 计算 a 的模更优雅的方式,使用 numpy 效率更高
np.linalg.norm(a)

5.385164807134504

# 余弦相似度
cosine_similarity = a @ b / np.linalg.norm(a) / np.linalg.norm(b)
cosine_similarity

0.9673722233802454

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

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

相关文章

elasticsearch 查询超10000的解决方案

前言 默认情况下,Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页,以及查询批量数据更新的情况 问题:当请求form size >10000 时&#xff0c…

【FreeRTOS】IAR的FreeRTOSConfig.h中在添加头文件的问题

1、今天在\FreeRTOSConfig.h中添加个头文件,总是在头文件的函数定义处报错: Error[40]: Bad instruction 2、百度了半天也没有找到问题 3、原来是这个原因: IAR的Freertos中需加上一个portasm.s的驱动文件,而该文件需要调…

印尼Facebook直播网络需要达到什么要求?

在全球化浪潮的推动下,海外直播正受到企业、个人和机构的广泛关注和青睐。无论是用于营销、推广还是互动,海外直播为各种组织提供了更多机会和可能性。本文将探讨在进行印尼Facebook直播前,需要满足哪些网络条件以确保直播的质量和用户体验。…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作,它可以帮助企业展示产品、服务和品牌形象,吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段,需要和客…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容,图片以及扫描的PDF也可以支持批量提取指定区域内容了,主要是通过截图指定区域,然后使用OCR来识别该区域的文字来实现的,所以精度可能会有点不够,但是如果是数字的话,问题不大;…

一周年——相遇知音

——献给ZINCFFO 有梦便追,何惧? “杂乱无章”的代码片在昏暗的灯光下显得让人心生些许倦意。“我为什么天天都要练习呢?”无奈地合上笔记本电脑,当时多么想把电脑䣹(fāi)在地上,那就仿佛放下…

OpenGL笔记五之VBO与VAO

OpenGL笔记五之VBO与VAO 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记五之VBO与VAO1.VBO2.VAO3.VBO与VAO对比 1.VBO 代码 void prepareVBO() {//1 创建一个vbo *******还没有真正分配显存*********GLuint vbo 0;GL_CALL(glGenBuffers(1, &vbo))…

使用uni-app和Golang开发影音类小程序

在数字化时代,影音内容已成为人们日常生活中不可或缺的一部分。个人开发者如何快速构建一个功能丰富、性能优越的影音类小程序?本文将介绍如何使用uni-app前端框架和Golang后端语言来实现这一目标。 项目概述 本项目旨在开发一个个人影音类小程序&#…

微分方程建模

微分方程建模是数学建模的重要方法,因为许多实际问题的数学描述将导致求解微分方程的定解问题。在高教杯数学建模竞赛中每年都会有一道微分方程建模问题,大体上可以按以 下几步: 1. 根据实际要求确定要研究的量(自变量、未知函数、必要的参数…

云盘挂载 开机自动模拟 cmd- alist server

云盘挂载 开机自动模拟 cmd- alist server 打开Kimi智能助手, 网址:Kimi.ai - 帮你看更大的世界 (moonshot.cn) 问他: 帮我写一个vbs命令:在D:\sky目录下, 然后cmd, 进入命令行后, 输入 alist server 然后回车 这里 这个目录, 换成自己的 alist.exe所在目录 下面是我完善的示…

GitHub连接超时问题 Recv failure: Connection was reset

用手机热点WIF拉取git项目的时候,遇到Recv failure: Connection was reset问题。 解决办法 一、手动开启本地代理 二、在终端(cmd)输入命令 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https:…

大模型-基于大模型的数据标注

法来自于这篇论文:Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine。 一.背景 假设,存在一批标注好的数据D_labeled,其包含m个标注样本(x, y)。 目标是,基于D_labeled&#xff…

Linux安全技术与防火墙

一、安全技术和防火墙 1.1 安全技术 入侵检测系统:特点是不阻断网络访问,主要是提供报警和时候报警,不主动介入。 入侵防御系统:透明模式工作,对数据包、网络监控、服务攻击、木马蠕虫、系统漏洞等等进行准确的分析和…

MySql 数据库 (基础) - 下载安装

MySQL数据库 简单介绍 数据库 数据存储的仓库数据库管理系统 操作和管理数据库的大型软件SQL 操作关系型数据库的变成语言,是一套标准 版本 MySQL官方提供了两种不同的版本: 社区版 免费,MySQL不提供任何的技术支持商业版 收费&#xff0c…

【研路导航】重庆大学计算机保研面试真题分享交流

写在前面 在保研的道路上,面试是非常重要的一环。这里是成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答 ! Q 快速排序和合并排序: 快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列&#xf…

树的概念与二叉树的实现

目录 一. 树的概念 二. 访问树的方法 1. 左孩子右兄弟法 2. 双亲表示法 3. 顺序表存孩子的指针(孩子表示法) 三. 二叉树 1. 二叉树的定义 2. 特殊二叉树 3. 二叉树的性质 4. 存储方式 四. 二叉树的前中后序遍历 1. 前序遍历 2. 中序遍历 3. …

通用型I2C接口的应用之综合应用(N32G45XVL-STB)

通用型I2C接口的应用之综合应用(N32G45XVL-STB) 目录 概述 1 软硬件接口 1.1 硬件接口 1.2 开发软硬件信息 1.3 SHT-20模块电路 1.4 0.9寸OLED模块介绍 2 驱动接口实现 2.1 SHT20驱动接口 2.2 OLED驱动接口 3 应用接口实现 3.1 软件框架 3.…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

Open-TeleVision——通过VR沉浸式感受人形机器人视野的远程操作

前言 7.3日,我司大模型机器人(具身智能)线下营群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接,我当时快速看了一遍,还是有价值的一个工作(其有受mobile aloha工作的启发)&#x…

锂电池剩余寿命预测 | Matlab基于Transformer的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer的锂电池剩余寿命预测 Matlab基于Transformer的锂电池剩余寿命预测(单变量) 运行环境Matlab2023b及以上 NASA数据集,B0005号电池数据训练,B00…