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

前言

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

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

线性回归

生成数据

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

import numpy as np

x = 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 plt

plt.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_split

x_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_model

linreg = 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 cv2

distTypeOptions = [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的表现效果最佳。

AutoCAD作为工程制图设计行业广泛采用的计算机辅助设计平台,其核心价值在于支持用户构建、修改及展示二维三维设计模型。本文介绍的开发资源“AutoCAD代码集成库”专为C#编程人员设计,旨在通过封装化的类方法显著降低基于AutoCAD .NET接口的插件开发难度。AutoCAD .NET应用程序接口由Autodesk官方提供,支持开发者通过C#等.NET兼容语言实现AutoCAD系统的深度交互。该接口开放了对图形数据库、图层体系、几何实体及数据管理对象的全面控制能力,使开发人员能够编写程序实现设计模型的生成、编辑、解析维护任务。该代码集成库的核心优势在于其高度模块化的架构。库内预置的类方法覆盖了常见开发场景,包括几何元素生成、图层控制、DWG文件操作等功能模块。解压后的资源包中通常包含以下结构化内容:- 经过优化的C#类库源码,对原生API操作进行了逻辑封装性能提升- 功能演示案例,展示如何将库中模块应用于实际业务场景- 技术文档体系,详细说明各组件接口规范使用约束条件- 质量验证套件,通过系统测试确保代码执行的准确性鲁棒性借助该工具包,开发者可实现多种功能扩展:建立参数化绘图系统,根据输入条件自动生成复杂几何结构;构建数据交换通道,实现CAD系统外部数据源的双向传输;开发图形分析工具,自动计算模型的几何属性空间关系;定制交互界面,创建专业化工具栏指令集以优化工作流程;实施批量图层管控,实现多图层状态的协同管理属性配置。该代码库本质上是一套经过工程验证的AutoCAD .NET开发辅助框架,其模块化设计能有效提升代码复用率,降低技术门槛,使开发团队能够将主要精力集中于业务逻辑实现技术创新环节。对于从事AutoCAD二次开发的C#工程师而言,这一资源具有重要的实践参考价值技术支撑作用。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值