关于机器学习的一份总结

在之前的文章中分别有详细的关于机器学习中某一学习算法的介绍,但缺少一个总体关于机器学习的总结,所以在这篇文中就是关于机器学习的一份总结。

在最近的日子中,人工智能日益火热起来,而机器学习是其中举足轻重的一部分,它在各个领域中都有广泛的应用,比如气象学中对于天气的预测、在经济学中对于未来的股票、房价等的预测、或者在生物学中对于生物种类的自动化区分等。接下来是对于机器学习的详细介绍:

一、机器学习的分类

首先来看关于机器学习的分类部分:

1.1 监督学习

关于“监督”一词是指在进行模型训练用的数据是带有标签的,而标签则是指对于每行数据专家都已经进行人工的分类,有了正确答案,就像考试中的选择题,每道选择题都有正确答案,这个答案就可以理解为标签,这样的题就可以理解为有监督的。 而监督学习有两种任务,分别是回归与分类,回归是对于连续性数据而言的,即是指对于一组连续的数据根据它以往的表现去预测未来的数值,而用作进行回归任务的模型一般有线性回归模型、岭回归模型、Lasso回归模型、回归型支持向量机与决策树。

对于前三种在此详细说明一下,首先是线性回归模型,关于它有公式如下:

y=w\cdot x+b+\epsilon

其中,w是斜率系数,y是因变量,x是自变量,b是截距,而\epsilon则是误差项。 然后对于其中的误差可以考虑加入惩罚项,也就是正则化,而对于正则化分为两种,分别是L1正则化与L2正则化,对应的就得到了Lasso回归与岭回归模型。其中关于L1正则化与L2正则化的表达式分别为:

L1:     J(\beta)_{L1} = \sum_{i=1}^{n}(y_i - X_i\beta)^2 + \lambda \sum_{j=1}^{p}|\beta_j|

L2:    J(\beta)_{L2} = \sum_{i=1}^{n}(y_i - X_i\beta)^2 + \lambda \sum_{j=1}^{p}\beta_j^2

接着,来看分类算法,常见分类算法有对数几率回归(即逻辑回归)、决策树、SVM。先来说明逻辑回归,逻辑回归就是将线性回归加以改造,将之加入一个sigmoid函数,而这个函数十分重要,因为它在神经网络中也常常作为激活函数存在。具体sigmoid函数的表达式为: 

\sigma (z)=\frac{1}{1+e^{-z} }

然后来说决策树,它具有树形结构,在它的内部节点上是分类的依据,而叶子节点则是分类的结果。其中关于分类的依据所选择的特征是依靠信息论中信息熵与信息增益来决定的,此外还可以根据基尼系数来决定,并且依据不同就得到不同的种类的决策树,如图1所示就是一棵决策树。通过图表可以知道决策树与神经网络相比,其有优秀的一点就是它具有很好的可解释性。 此外,南大教授周志华老师还对于决策树提出过深度森林的概念,这将在集成学习中详细说明。

接着来说关于支持向量机的,支持向量机可以用于分类也可以用于回归,对于总督SVM的概念为通过找到一个最优超平面来最大化不同类别之间的间隔,从而实现数据的分类。而它也还可以分为软间隔和硬间隔,所谓硬间隔 SVM 要求所有训练样本都严格满足分类条件:正类和支持向量之间的距离必须大于等于 1,负类和支持向量之间的距离也必须小于等于-1。这意味着所有的数据点都必须被正确分类,并且没有例外。而软间隔则是指允许某些样本位于间隔边界内甚至被错误分类,从而放宽了对所有数据点都必须被正确分类的要求。通过引入松弛变量 ξi 来衡量每个样本违反约束的程度,并将其加入到优化目标中以控制总误差。

在刚才说明的 SVM 中往往只能解决线性问题而对于非线性问题的解决需要用到核函数,并将朴素 SVM 构造成核 SVM(即KSVM),其中常见的核函数如下表所示:

1.2 无监督学习

无监督学习就是没有预定好的答案,就像试卷中的主观题那样,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。而具体关于无监督学习分为降维与回归,降维中通常是将多维的数据降为较少维的,比如从五维降维四维但同时要保证数据的信息不能缺失关键的。而关于降维算法通常又可以分为线性降维与非线性降维,常见的线性降维有PCA、LDA、FA、ICA。非线性降维有 KPCA、NMF、LLE、MDS 等。 然后来看聚类算法,聚类算法追求的就是类内差距最小化,类间差距最大化,而聚类后得到的叫做簇,如下图所示:

其中的红点就是质心,在计算时计算的距离就是某一点与之的距离。然后在聚类算法中最常见的是kmeans聚类,即k均值聚类算法,然后除此之外还有层次聚类、密度聚类等。其中,在参差聚类里还可以建立层次树来可视化提高对于模型的理解,层次树如下图所示:

 此外,关于聚类中距离的计算上,有这样几种距离度量方式,分别是闵可夫斯基距离、欧式距离、曼哈顿距离与切比雪夫距离,它们的不同是关于闵可夫斯基距离公式中p值的不同而不同,在此不多作解释。

1.3 半监督学习

半监督学习(Semi-Supervised Learning, SSL)作为一种机器学习范式,旨在结合少量标注数据和大量未标注数据以提高模型的性能。在许多实际应用场景中,获取高质量的标注数据既昂贵又耗时,而未标注数据则相对容易获得。因此,半监督学习提供了一种有效的方法,能够在减少对标注数据依赖的同时,充分利用丰富的未标注资源来增强模型的学习能力。通过这种方式,半监督学习不仅能够降低数据标注的成本,还能显著提升模型的泛化能力和准确性。

具体来说,半监督学习的核心思想是利用未标注数据中的潜在结构信息来指导模型的学习过程。它假设未标注数据与标注数据来自相同或相似的分布,并尝试从未标注数据中提取有助于分类或其他任务的信息。例如,在文本分类任务中,即使只有少数文档被人工标注了类别标签,大量的未标注文档仍然可以为模型提供有关词汇使用模式、主题分布等有价值的信息。这种信息对于构建更加鲁棒和精确的分类器至关重要。 半监督学习方法多种多样,主要包括自训练(Self-Training)、协同训练(Co-Training)、图基于方法(Graph-Based Methods)以及生成对抗网络(GANs)。

自训练方法首先使用标注数据训练一个初始模型,然后利用该模型对未标注数据进行预测,将置信度高的预测结果加入训练集,逐步改进模型。协同训练适用于多视图或多特征集的数据,通过两个或多个模型相互协作,共同扩展标注数据。图基于方法构建数据点之间的相似性图,根据图上的平滑假设传播标签信息。生成对抗网络则通过生成模型和判别模型的竞争机制,从未标注数据中学到更多有用的信息。

二、交叉验证

交叉验证的核心思想是将数据集划分为若干个互不重叠的子集,并轮流使用这些子集作为验证集,其余部分则用于训练模型。最常用的交叉验证方法是 K 折交叉验证(K-Fold Cross-Validation),其中数据集被随机分成 K 个大小相等的子集(称为“折”)。接下来,模型依次在 K−1 折上进行训练,在剩下的一折上进行验证,这一过程重复 K 次,每次选择不同的子集作为验证集。最终,模型的性能由 K 次验证结果的平均值来衡量。这种方法不仅充分利用了所有可用的数据,而且减少了单次分割可能带来的偶然性误差。

除了 K 折交叉验证外,还有其他变体如留一法(Leave-One-Out Cross-Validation, LOOCV)和分层 K 折交叉验证(Stratified K-Fold Cross-Validation)。留一法是一种极端情况下的交叉验证,其中每个样本轮流作为验证集,其余所有样本用于训练;这种方法适用于非常小的数据集。分层 K 折交叉验证则确保每个折叠中的类别分布与整个数据集的比例一致,特别适合于不平衡分类问题。

三、机器学习流程

3.1 数据预处理

在进行机器学习建模的刚才中,我们首先要进行数据预处理工作(假设我们已经通过一些方式得到了数据集,比如从 kaggle、Data Driver 等网站上或是手工收集等),在这个过程中,我们一般进行三个方面的工作,首先是异常值处理,通过绘图制表等方式查找出明显不同于正常数据的异常值的点,然后将之删除或是替换等。

然后是缺失值处理工作,对于数据集中的缺失值一般要进行填补或删除(即直接将缺失值所在行直接删除),在填补时一般考虑数据是否具有连续性,如果有则要考虑插值填补,即用样条插值、线性插值等方式进行填补,尤其是在时间序列数据上。而对于不具有连续性的数据集,则可以使用对应数据列中的众数、平局数进行填补,或是直接用上一行对应数值或下一行对应数值直接填补。接下来是第三个工作,就是数据集的划分,一般我们将数据集划分为两部分,分别是训练集和预测集,它们之间保持独立,并且是8:2的比例进行划分。不过在某些时候,我们还会再增加一个验证集,以更精确模型的预测能力。

3.2 模型拟合与预测

在处理好数据后就需要选择合适的模型,根据数据集特征以及任务目标等。选定好模型后,先将训练集数据提供给模型,让模型在此基础上开始训练,然后将测试集提供给模型,通过测试集来判断模型拟合情况与泛化能力。如果对于模型表现不错,那么可以考虑用此模型进行预测。

3.3 模型评估与维护

对于模型的评估上,也就是用测试集进行评估,一般采用精度、召回率、F1分数以及MSE等指标来判断。模型与软件类似,同样需要维护,即根据数据的变化不断调整参数等,使之能根据数据的变化而变化。

四、集成学习

关于集成学习,首先需要知道其基本概念,就是将单个模型,这里称为“弱学习器”通过一定的方法将之集成、结合为一个大的模型,这个大的模型称为“强学习器”或“集成模型”,其中典型的例子就是随机森林与梯度提升机。然后是对于它的分类,它依据集成的方法最基本的有两种类型,分别是:Boosting 与 Bagging 方法。先说 Bagging 方法,Bagging 通过从原始训练集中有放回地抽取样本(即 bootstrap 抽样),创建多个子数据集,并在每个子数据集上训练一个独立的学习器。最终预测时,对于分类任务采用多数投票法,对于回归任务则取平均值。所以通过随机森林具体理解,就是有放回地选择一些数据集,彼此独立训练出 n 棵决策树来,然后对于统一数据让这些决策树进行预测,对于预测的结果通过投票等方式来选择。

然后是 Boosting 方法。Boosting 是一种迭代的方法,它逐步构建一系列学习器,每个新的学习器都试图纠正前一个学习器的错误。具体来说,它会赋予那些被先前学习器错误分类的数据更高的权重,从而让后续学习器更加关注这些“难例”。其中最典型的就是 LightGBM 模型。 然后,来简单说一下深度森林的概念,深度森林也称为 gcForest(Gradient Boosting Forest),是由周志华教授及其团队提出的一种新型集成学习方法。它结合了传统机器学习中的随机森林和梯度提升树的思想,并借鉴了深度学习的多层结构,旨在提供一种不需要显式特征工程且性能优异的模型。与传统的神经网络不同,深度森林完全基于决策树构建,避免了对大量标注数据的需求和复杂的调参过程。

在上述的集成学习中,都是同类型的进行集成,不过也可以让不同类型的学习器也进行集成,其中,同类型的学习器集成的叫同质集成,不同的叫异质集成。比如,将全是决策树的弱学习器集成为随机森林。随机森林就是同质集成,而如果将几个决策树和一个 KNN 模型集成,就是异质集成。

五、懒惰学习与渴求学习

在机器学习中我们还将根据训练阶段与预测阶段所作事情的复杂度不同来分为懒惰学习与渴求学习。 所谓懒惰学习就是指在训练时几乎不建立什么复杂模型或压根不去计算,而在预测时再进行大量计算,其中 KNN 算法就是懒惰学习中最典型的例子。它的思想是让训练集分布在一个数轴上,当新的数据点到来时,其在数轴中,在某一距离范围内 k 个相邻点中,哪个类型的数据点最多,这个新的数据点的标签就会是该类型。如下给出的代码就是 KNN 的实现代码: 

def classify0(inx, dataSet, labels, k):dataSetSize = dataSet.shape[0]diffMat = tile(inx, (dataSetSize,1)) - dataSetsqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5sortedDistIndicies = distances.argsort()classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1sortedClassCounted = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True,)return sortedClassCounted[0][0]

然后,渴求学习(即急切学习)则与懒惰学习相反它是指在构建模型时进行复杂计算,而在预测时只作极简单的工作,像决策树就是渴求学习。

六、强化学习

强化学习就是学习“做什么(即如何把当前的情境映射成动作)才能使得数值化的收益信号最大化”。学习者不会被告知应该采取什么动作,而是必须自己通过尝试去发现哪些动作会产生最丰厚的收益。在强化学习中,最重要的几个要素分别是 Agent、状态、策略、动作、环境、价值函数等。其中,Agent 是指一个能做出决策的主题,他能根据情况做出最好的决策,在某种程度上,它就像是经济学中的理性经济人。状态是指 Agent 在某个时间下的情况。动作是指根据状态而要采取的行为,比如在走格子游戏中,动作就可以是向上走或是向下走等。而策略就是采取怎样的动作。环境是指 Agent 所处在怎样的环境中。最后价值函数是指对于 Agent 做出某个动作后未来长期的一个收益。

在强化学习中,摇臂机问题是一个经典的问题,它是指在累积奖励中,通过摇臂(即不同策略与动作)去实现收益最大化。而在这个基础上,我们可以将之延申,变为有k个摇臂,即k-摇臂赌博机。那么此时就变成了面对k个不同奖励与收益,如何通过一个合适的策略实现收益最大化。 此外,还有三个最火热的话题在强化学习中,分别是动态规划(DP)、时序差分学习(TD)和蒙特卡罗方法(MC)。

在说明这三者之前,先来说明另外两个东西,即贝尔曼方程与自举。贝尔曼方程是描述在一个决策过程中,当前状态的价值可以通过立即获得的奖励和下一状态的预期价值来递归计算的一种数学方程。换言之,就是它(贝尔曼方程)提供了一种方式来将未来的奖励折现在现在,并且通过这种递归关系来评估不同状态或动作的好坏。其表达式如下: 

V\left(s\right)=E\left[R_{t+1}+\gamma\ V\left(S_{t+1}\right)\middle|\ S_t=s\right] ​​​​​

其中V(s)是状态s的价值,E表示期望,大写 R 下标 停顿 t 加 1 结束 下标在t+1时刻得到的奖励,γ是一个折扣因子,用以表示未来奖励的重要性。 然后是自举,所谓自举就是指使用当前估计值来评估其他估计值的方法。如果采用了自举的方法,那么就意味着我们不再需要遍历整个环境模型,而可以在随机地更新了一部分之后就依靠这些部分值取获得最后预估价值。

在动态规划中,是将整个大的环境模型分割成许多个小的取评估,但如果环境模型过大,则计算复杂度将十分吓人,所以可以采用异步的方式,即不遍历整个环境模型,而只经行其中一部分,并且依据其中的这一部分依旧能得到好多结果。 同样采取了自举思想的还有时序差分学习,即TD方法。TD 方法的核心思想是通过估计状态价值或状态-动作价值与实际观察到的奖励之间的差异(称为 TD 误差)来更新价值函数。其中最典型的几个算法分别是 TD(0)、Sarsa 算法和 Q-learning 算法。其中 TD(0)属于单步自举方法,可以理解为多自举方法中的一个特例,而所谓多部自举方法就是考虑多个时间步骤来更新价值函数的方法。TD 方法可以说是结合了 DP 与 MC 方法中的有点。

至于 MC 方法可以理解为:MC 方法是一种仅基于完整序列的经验回报来评估和更新状态或动作价值的方法,即等到一次尝试(从开始到结束)完成后,根据实际获得的总奖励来调整估计值。 在这里,就可以分为在线学习和离线学习这两种学习方式,所谓在线学习就是指模型在接收到数据后立即进行更新。而离线学习则是指模型基于预先收集的批量数据进行训练与更新。

七、深度学习

一类被称为神经网络的算法最近以“深度学习”的名字再度流行。虽然深度学习在许多机器学习应用中都有巨大的潜力,但深度学习算法往往经过精度调整,只适用于特定的使用场景。首先,我们要先知道神经网络的概念,所谓神经网络就是指参考人脑神经连接的方式构建许多的神经元然后以一定层数与权重连接。所以,在最简单的神经网络中,只有两层,即输入层和输出层,这称之为感知机如下图所示:

而之后则可以往这二者之间添加隐藏层,隐藏层的层数说明了神经网络的复杂度,同时含有多层的隐藏层的神经网络被称为多层感知机(MLP)。感知机 在经典的神经网络中,一般只有前项的神经元连接后一项的,同一层之间不会连接,并后项的神经元也不会向前项的神经元进行反馈,而如果建立这种反馈就诞生了循环神经网络(RNN)。此外,常见的神经网络还有GAN模型,卷积神经网络(CNN),竞争神经网络等,在此不多做解释。 

八、总结

在当今科技飞速发展的时代,人工智能(AI)已经成为推动社会进步和产业升级的重要力量。作为人工智能的核心技术之一,机器学习(Machine Learning, ML)扮演着不可或缺的角色。它不仅极大地提高了处理复杂问题的能力,还为各行各业带来了前所未有的创新机遇。 本总结涵盖了机器学习的基本概念、分类方法以及具体的实现流程,并详细探讨了监督学习、无监督学习、半监督学习、强化学习及深度学习等不同类型的机器学习范式。对于每个类型的学习方法,我们讨论了其适用场景、常用算法及其特点,包括但不限于回归与分类任务中的线性回归、决策树和支持向量机;降维与聚类分析中的PCA、K-means等;以及强化学习中的贝尔曼方程、TD学习、蒙特卡罗方法等。

此外,本文也解析了从数据收集到模型评估的完整机器学习项目流程,强调了数据预处理的重要性,如异常值和缺失值的处理,以及数据集的合理划分。模型选择方面,介绍了集成学习的概念,通过组合多个弱学习器形成强学习器来提高预测能力,同时提及了交叉验证和网格搜索等优化参数的方法。 特别地,文章提到了周志华教授提出的深度森林(gcForest),这是一种基于决策树构建的新型集成学习方法,旨在提供一种无需显式特征工程且性能优异的模型,适用于标注数据有限的情况。

综上所述,本总结全面回顾了机器学习领域的关键知识点和技术细节,为读者提供了理解这一领域所需的基础知识框架。随着研究的不断深入和技术的发展,机器学习将继续扩展其应用边界,解决更加复杂的问题,成为连接理论与实践的重要桥梁。

此上

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

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

相关文章

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

数据结构漫游记:队列的动态模拟实现(C语言)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息,确立服务版本:https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本: 通过…

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年,也是记录在CSDN平台上的第五年。这五年来,我始终坚持记录成长的点滴,将个人事业与博客创作紧密相连。一路走来&#xff0…

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…

无人机高速无刷动力电机核心设计技术

一、技术概述 无刷电机优势: 高效率:无刷电机由于去除了电刷和换向器,减少了能量损失,因此具有更高的效率。 长寿命:电刷和换向器的磨损是导致传统有刷电机寿命较短的主要原因,而无刷电机则避免了这一问…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Lin…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

QT开发-T113 Linux 主板QC配置套件

此篇文章用于记录在Linux主板上使用QT开发项目的套件配置步骤 进入QC软件,点击 Manage Kits… 选择项目对应的QT Version : 一般有一个项目对应的qmake 文件,选择导入即可 如果首次导入提示 qmake could not be added 需要先对项目进行命令行编译(具体命…

【云岚到家】-day03-门户缓存实现实战

【云岚到家】-day03-门户缓存实现实战 1.定时任务更新缓存 1.1 搭建XXL-JOB环境 1.1.1 分布式调度平台XXL-JOB介绍 对于开通区域列表的缓存数据需要由定时任务每天凌晨更新缓存,如何实现定时任务呢? 1.使用jdk提供的Timer定时器 示例代码如下&#xf…

SuperdEye:一款基于纯Go实现的间接系统调用执行工具

关于SuperdEye SuperdEye是一款基于纯Go实现的间接系统调用执行工具,该工具是TartarusGate 的修订版,可以利用Go来实现TartarusGate 方法进行间接系统调用。 该工具的目标是为了扫描挂钩的NTDLL并检索Syscall编号,然后使用它来执行间接系统调…

Python+ tkinter实现小学整数乘法和除法竖式演算式

Python tkinter实现小学整数乘法和除法竖式演算式 整数的乘法与除法是小学数学中的重要内容,它们是数学运算中的基础部分。 本文将使用python 和Python 的标准 GUI(图形用户界面)包tkinter,实现整数乘法与除法的竖式演示。供有兴趣…

线程池遇到未处理的异常会崩溃吗?

线程池中的 execute 和 submit 方法详解 目录 引言execute 方法 使用示例代码 submit 方法 2.1 提交 Callable 任务2.2 提交 Runnable 任务 遇到未处理异常 3.1 execute 方法遇到未处理异常3.2 submit 方法遇到未处理异常 小结 引言 在多线程编程中,线程池是提高性…

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作,包括CRUD(增加、读取、更新、删除)。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心:document.kylinos.cn 交流论坛:forum.kylinos.cn 服务器环境以及配置 【内核版本…

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。 变换方…

【LeetCode100】--- 寻找重复数

题目传送门 方法一:暴力解法(超时) 算法原理 双重循环,每次固定一个数,再遍历别的数。比较这两个数是否相等, 若相等则返回这个数。就是重复数。 复杂度分析 时间复杂度:O(N方&…

RabbitMQ---TTL与死信

(一)TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL,当消息到达过期时间还没有被消费时就会自动删除 注:这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身,不是说队列过期时间…

mysql查看binlog日志

mysql 配置、查看binlog日志: 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启,修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin(开启日志并指定日志前缀&#xff…

【QT】 控件 -- 按钮类(Button)

🔥 目录 1. 前言 2. Push Button 按钮 1、带有图标的按钮 -- 纯代码实现2、带有快捷键的按钮 -- 图形化&代码实现 3、按钮的重复触发 3. Radio Button 按钮 **1. click、press、release、toggled 的区别** **2. 单选框分组** 4. Check Box 复选 5. Tool Butto…