OpenCV与机器学习:使用opencv和sklearn实现线性回归

前言

线性回归是一种统计分析方法,用于确定两种或两种以上变量之间相互依赖的定量关系。在统计学中,线性回归利用线性回归方程(最小二乘函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模。

线性回归主要分为一元线性回归和多元线性回归。一元线性回归涉及两个变量,其关系可以用一条直线近似表示。而多元线性回归则涉及两个或两个以上的自变量,因变量和自变量之间是线性关系。线性回归的目标是找到一个数学公式,能够尽可能完美地组合所有自变量,以接近目标值。

线性回归

生成数据

一般来说我们会借助sklearn当中的linear_model来实现线性回归,我们首先生成一个可以用于线性回归的数据。

import numpy as npx = np.linspace(0, 10, 100)
y_hat = x * 5 + 5
np.random.seed(42)
y = x * 5 + 20 * (np.random.rand(x.size) - 0.5) + 5

其中x是数据,而y_hat是我们希望回归得到的回归值(由于这里是自己生成数据,所以这个值我们是知道的,处理现实问题时,这个值我们一般是不知道的)。y是采用随机数生成的用于训练的标签值,我们通过x和y进行线性回归,最终目的是回归出y_hat。

画图展示数据

为了更好的展现效果,下面我们使用matplotlib画一下图

import matplotlib.pyplot as pltplt.style.use('ggplot')
plt.figure(figsize=(10, 6))
plt.plot(x, y_hat, linewidth=4)
plt.plot(x, y, 'x')
plt.xlabel('x')
plt.ylabel('y')

在这里插入图片描述
其中蓝色的点代表的就是数据,而红色的直线就是我们经过线性回归应当得到的结果(最终结果有可能会有些偏差,但一般和这条红线相近)

划分数据并训练

依旧是借助sklearn中的model_selection.train_test_split对数据集进行划分

from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)

使用sklearn进行回归
使用sklearn的训练十分的简单,如果熟悉sklearn可以发现,这个过程非常符合sklearn的使用风格。


from sklearn import linear_modellinreg = linear_model.LinearRegression()
linreg.fit(x_train.reshape(-1, 1), y_train.reshape(-1, 1))
y_sklearn = linreg.predict(x.reshape(-1, 1))

使用OpenCV进行回归
我们可以借助cv2.fitLine用一条线拟合。该函数可以取下列参数:
points:这是一条直线必须拟合的点集。
distType:这是M-估计所使用的距离。
param:这是数值参数(C),用于某些类型的距离。我们将
其保持为0,这样就可以选择一个最优值。
reps:这是原点到直线的距离准确率。0.01是reps的一个不错的
默认值。
aeps:这是角度的准确率。0.01是aeps的一个不错的默认值。

我们以distTypeOptions来暂存distType可以取的各种参数。

import cv2distTypeOptions = [cv2.DIST_L2,\cv2.DIST_L1,\cv2.DIST_L12,\cv2.DIST_FAIR,\cv2.DIST_WELSCH,\cv2.DIST_HUBER]

为了更加方便的观察不同参数的不同效果,我们直接设置参数后拟合并显示。distTypeLabels对应的就是不同参数的图例,用于标识使用的参数,colors则是设置显示的颜色,points是通过列表推导的方式获得数据和标签相匹配的一对对元组。

distTypeLabels = ['DIST_L2', 'DIST_L1', 'DIST_L12','DIST_FAIR', 'DIST_WELSCH','DIST_HUBER']colors = ['g', 'c', 'm', 'y', 'k', 'b']
points = np.array([(xi, yi) for xi, yi in zip(x_train, y_train)])

cv2.fitLine并没有直接用于预测的函数,返回的是[vxl, vyl, xl, yl],通过计算才可以得出预测结果。

plt.figure(figsize=(10, 6))
plt.plot(x, y_hat, linewidth=2, label='Ideal')
plt.plot(x, y, 'x', label='Data')
for i in range(len(colors)):distType = distTypeOptions[i]distTypeLabel = distTypeLabels[i]c = colors[i][vxl, vyl, xl, yl] = cv2.fitLine(np.array(points, dtype=np.int32), distType, 0, 0.01, 0.01)y_cv = [vyl[0]/vxl[0] * (xi -xl[0]) + yl[0] for xi in x]plt.plot(x, y_cv, c=c, linewidth=2, label=distTypeLabel)

随后我们也将sklearn的图像画上去,进行对比

y_sklearn = list(y_sklearn.reshape(1, -1)[0])
plt.plot(x, list(y_sklearn), c='0.5', linewidth=2, label='Scikit-Learn API')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='upper left')

在这里插入图片描述
可以看出,虽然差距不大,但sklearn的表现效果最佳。

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

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

相关文章

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书类别信息修改实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具,可以存放大量数据。为了避免数据泄露,可以使用专业的磁盘加密软件加密保护电脑磁盘。那么,磁盘加密软件哪个好呢?下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

Anaconda超详细安装教程(Windows环境下)

每个人电脑不同,特别是配置环境变量,不要直接复制粘贴。 (本人技术小白一个,如有错误,欢迎各位大神指正。) 说明:其实要是装Anaconda的话,就不用再单独装Python了。但是吧&#xf…

UsernamePasswordAutheticationFilter源码解读和实践

UsernamePasswordAuthenticationFilter的目录 一、概述(重点)二、标红小步骤解读2.1 步骤1(标红1)2.1.1 AbstractAuthenticationProcessingFilter2.1.2 UsernamePasswordAuthenticationFilter 2.3 步骤2 和 步骤3(标红…

【Linux系统 02】Shell脚本

目录 一、Shell概述 二、输入输出 三、分支控制 1. 表达式 2. if 分支 3. case 分支 四、循环控制 1. for 循环 2. while 循环 3. select 循环 五、函数 一、Shell概述 Shell是Linux系统连接用户和操作系统的外壳程序,将用户的输入和请求选择性传递给操…

13 冒泡排序和快速排序

目录 冒泡排序 1.1 基本思想 1.2 特性快速排序 2.1 基本思想  2.1.1 hoare版  2.1.2 挖坑版  2.1.3 前后下标版  2.1.4 循环 2.2 特性 2.3 优化  2.3.1 key值优化 1. 冒泡排序 1.1 基本思想 数据中相邻的两数不断比较,找出最大的数进行交换,不断…

《合成孔径雷达成像算法与实现》Figure6.9

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

不到1s生成mesh! 高效文生3D框架AToM

论文题目: AToM: Amortized Text-to-Mesh using 2D Diffusion 论文链接: https://arxiv.org/abs/2402.00867 项目主页: AToM: Amortized Text-to-Mesh using 2D Diffusion 随着AIGC的爆火,生成式人工智能在3D领域也实现了非常显著…

【多模态大模型】BLIP-2:低计算视觉-语言预训练大模型

BLIP-2 BLIP 对比 BLIP-2BLIPBLIP-2如何在视觉和语言模型之间实现有效的信息交互,同时降低预训练的计算成本?视觉语言表示学习视觉到语言的生成学习模型架构设计 总结主要问题: 如何在计算效率和资源有限的情况下,有效地结合冻结的图像编码器…

【C++】类和对象(3)

继续学习类和对象的最后一部分知识,主要有初始化列表、static成员、友元、内部类、匿名对象等。 目录 再谈构造函数 构造函数体赋值 初始化列表 explicit关键字 static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化…

Windows 10 配置 FFmpeg 使用环境

Windows 10 配置 FFmpeg 使用环境 1.下载FFmpeg 的windows办2. 配置环境变量:3.查看是否配置正确 cmd 或者 PowerShell 执行以下命令 1.下载FFmpeg 的windows办 GitHub 地址 :https://github.com/BtbN/FFmpeg-Builds/releases 解压后得到如图: 2. 配置环境变量: 复制路径:…

面试官都爱看的作品集,你做对了吗?

经常有朋友在群里问作品集的相关问题:设计师不知道从哪里开始作品集,觉得自己拿不到作品,作品集没有亮点,真的不知道怎么改进,作品集投递后没有回应,很受打击。 针对这些问题,我们将向您展示如何调整和改进…