OpenCV与机器学习:使用opencv实现KNN

使用opencv实现KNN

  • 前言
  • OpenCV实现KNN
    • 生成随机数据
    • 使用matplotlib绘制数据
    • OpenCV用于KNN训练
    • 生成新数据并观察
    • 预测


前言

KNN算法,即K-Nearest Neighbor,是一种简单的机器学习算法。它的基本思想是:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法通过计算待分类样本与已知类别样本的距离,找出距离最近的K个样本,根据这K个样本的类别,通过投票的方式确定待分类样本的类别。

在KNN算法中,距离的度量方式主要有欧式距离、曼哈顿距离、余弦相似度等。其中,欧式距离是最常用的距离度量方式,计算的是两点之间的直线距离。

KNN算法的优点包括简单直观、易于实现、对异常点不敏感等。但同时,KNN算法也存在一些局限性,如对数据分布敏感、K值选择主观等。此外,对于大规模数据集和高维数据,KNN算法的效率可能会较低。

总的来说,KNN算法是一种基础且重要的机器学习算法,在数据分类、回归分析、聚类等领域都有广泛的应用。

OpenCV实现KNN

生成随机数据

import numpy as npdef generate_data(num_samples, num_features=2):data_size = (num_samples, num_features)train_data = np.random.randint(0, 100, size=data_size)labels_size = (num_samples, 1)labels = np.random.randint(0, 2, size=labels_size)return train_data.astype(np.float32), labels

我们构建了一个函数来生成数据集,num_samples代表的是数据量,num_features默认为2代表的是数据有两个特征。通过随机数生成数据和标签。

train_data, labels = generate_data(11)
train_data

生成的数据如下:
在这里插入图片描述

  • 注:由于随机种子的不同生成的数据很有可能不同,以实际运行结果为准(下面的画图也一样)

下面以第0个数据为例看一下数据和标签的对应

train_data[0], labels[0]

在这里插入图片描述

使用matplotlib绘制数据

import matplotlib.pyplot as pltplt.style.use('ggplot')
plt.plot(train_data[0, 0], train_data[0, 1], color='r', marker='^', markersize=10)
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')

在代码中plt.style.use(‘ggplot’)的作用是为了使得画图更加好看。随后随便画了数据中的一个点的效果如下:
在这里插入图片描述
为了方便展示数据,我们在下面构建一个绘图函数用不同的颜色和不同的形状表示不同类别的数据。

def plot_data(all_blue, all_red):plt.figure(figsize=(10, 6))plt.scatter(all_blue[:, 0], all_blue[:, 1], c='b', marker='s', s=180)plt.scatter(all_red[:, 0], all_red[:, 1], c='r', marker='^', s=180)plt.xlabel('x coordinate')plt.ylabel('y coordinate')

现在我们有了数据和展示函数,那么如何区分数据的类别呢,我们可以根据标签(labels)来选择不同类别的数据。不过生成的标签使用其实并不方便,在这里我们使用ravel()将数据展平。效果对比如下:

labels, labels.ravel()

在这里插入图片描述
现在我们已经有了数据的选择方式和画图方式,现在我们来画一下不同类别的数据。

blue = train_data[labels.ravel()==0]
red = train_data[labels.ravel()==1]
plot_data(blue, red)

在这里插入图片描述

OpenCV用于KNN训练

在cv2中的ml模块中有一些常见的机器学习方法,使用KNearest_create可以创建一个KNN的分类器,训练时需要传入的数据有数据、数据组织方式、标签

import cv2knn = cv2.ml.KNearest_create()
knn.train(train_data, cv2.ml.ROW_SAMPLE, labels)

在代码中使用的数据组织方式为cv2.ml.ROW_SAMPLE,即每一行就是一条数据。

生成新数据并观察

训练完之后我们再生成一个不含标签的数据

newcomer, _ = generate_data(1)
newcomer

在这里插入图片描述
画出原始数据和新生成的不含标签的数据,一起进行对比。

plot_data(blue, red)
plt.plot(newcomer[0, 0], newcomer[0, 1], 'go', markersize=14)

在下面的图中,绿色的圆形就是新的数据,这个数据不含标签。我们观察到这个数据和蓝色方块很近,所以大概率是属于蓝色方块的。即属于第0类。
在这里插入图片描述

预测

我们先来使用最近的一个点来进行预测,这里findNearest第二个参数是1

ret, results, neighbor, dist = knn.findNearest(newcomer, 1)
results, neighbor, dist

在这里插入图片描述
然后使用最近的三个点来进行预测,这里findNearest第二个参数是3

ret, results, neighbor, dist = knn.findNearest(newcomer, 3)
results, neighbor, dist

在这里插入图片描述
可以看到预测结果是正确的

与此同时我们也可以使用predict方法进行预测。但是,首先我们需要设置k,我们要根据最近的k个
数据点来判断新数据具体属于哪一类。

使用方式如下:

knn.setDefaultK(1)
knn.predict(newcomer)

在这里插入图片描述

knn.setDefaultK(3)
knn.predict(newcomer)

在这里插入图片描述

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

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

相关文章

标注数据集 --labelimg

前言:我们想要训练自己的数据集时,通常需要自己标注数据集。无论是标注成yolo可识别的txt格式还是voc数据集的xml格式。使用labelimg标注都是一个不错的选择。 下面我们就从创建环境,使用labelimg进行标注两个方面来说明。 1.创建labelimg环境…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

Python实战:爬取微博,获取南京地铁每日客流数据

在这篇文章中,我们将使用 Python 进行网络爬虫,爬取微博上的南京地铁每日客流数据。 一、分析网页 在“南京地铁”微博主页搜索“昨日客流”关键词,搜索到每天发布的昨日客流数据。 “南京地铁”微博主页地址https://weibo.com/u/26382762…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

京东采销急眼,隔空喊话“针对”拼多多,焦虑之下为哪般?

农历新年将至,无论是线下各大商超还是线上电商平台,皆为年终大促而“忙的不亦乐乎”,尤其是近期发生的京东采销人员在直播间向拼多多喊话,“恳请拼多多停止屏蔽,恳请拼多多直接比价”,更是将年底这场朴实无…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc,配置任务运行,过了几天后,任务无故取消,超时,导致taskmanager挂掉,相关异常如下: 异常1: did not react to cancelling signal interrupting; it is stuck for 30 s…

ElasticSearch基础用法

什么是ElasticSearch? Elasticsearch是一个开源的、分布式的、实时的搜索和分析引擎。它允许用户近乎实时地存储、检索大量数据,并能够高效地对其进行全文搜索、聚合和分析。 部署ES和Kibana 通常采用docker-compose部署ES(ElasticSearch)服…

寒假思维训练day17 C. Equal Frequencies

不知不觉已经过了差不多一个月了,坚持一件事情还是有点收获的,今天更新一道1600的构造。 寒假训练计划day17 摘要: Part1 题意 Part2 题解 (有数学推导,latex形式) Part3 代码 (C版本,有详细注释) Part4 我对构造题…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

【电子科技大学】计算机高级图形学总复习

第一章:绪论 图形学和图像学 走样的原因和反走样 走样指的是:用离散量表示连续量引起的失真 反走样:为了提高图形的显示质量,需要减少或消除因走样带来的阶梯形或闪烁的效果,用于减少或消除这种效果的方法称为反走样…

【51单片机Keil+Proteus8.9】门锁控制电路

门锁控制电路 二、设计思路 电路设计 1.电源部分:使用BATTERY为整个电路提供电源,可以在电路中加入一个电 源开关,以便控制电源的开启和关闭。 2.处理器部分:使用AT89C51芯片作为主处理器,通过编写程序实现门锁的 …

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器(iterator)是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中,通常使用函数表示迭代器:每一次调用函数时,函数会返回集合中的“下一个”元素。 一个闭包就是一个…

SD-WAN有哪些组网方式?

随着企业网络需求的不断增长和变化,SD-WAN作为一种先进的网络架构技术,提供了多种灵活的组网方式,以适应不同企业的需求。本文将介绍SD-WAN常见的几种组网方式,帮助企业更好地理解如何利用SD-WAN构建高效的网络。 1、点对点&#…

离线使用Element UI和Vue

需要依赖如下: 1.vue.js; 2.index.js(Element UI) 3.index.css(Element UI) 4.element-icons.ttf(Element UI字体) 5.element-icons.woff(Element UI图标) 下载链接如下: 链接:https://pan.baidu.com/s/1nGOi0Vm_xExRGmVp6oVLoA 提取…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

【读点论文】SPTS Single-Point Text Spotting

SPTS Single-Point Text Spotting ABSTRACT 现有的场景文本识别(即,端到端文本检测和识别)方法依赖于昂贵的边界框注释(例如,文本行,词级或字符级边界框)。我们首次证明,训练场景文本识别模型可以通过对每个实例的单点进行极低成…

线性代数----------学习记录

线性代数发展历程 (1)线性方程组:例如二元一次方程组; (2)行列式:determinant,克莱默,莱布尼兹; (3)矩阵:方程个数与未知数的个数可…

黑马程序员前端web入门:新浪新闻

黑马程序员前端web入门:新浪新闻 几点学习到的: 设置li无圆点: list-style: none;设置a无下划线:text-decoration: none;a属于行内元素,高度hegiht不起作用,可以设置 display: block; 把它变成块元素。此时&#xff0c…

万户 ezOFFICE wpsservlet SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

操作系统-调度算法-1(先来先服务算法 短作业优先 高响应比优先 )

文章目录 总览先来先服务算法例题 短作业优先例题(非抢占式的短作业优先调度算法)例题(抢占式的短作业优先调度算法)注意 FCFS和SJF两种算法的思考高响应比优先例题 小结 总览 先来先服务算法 不会导致饥饿:只要该进程…