计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第11、12章 机器学习、计算机视觉与大模型_第1页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第11、12章 机器学习、计算机视觉与大模型_第2页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第11、12章 机器学习、计算机视觉与大模型_第3页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第11、12章 机器学习、计算机视觉与大模型_第4页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第11、12章 机器学习、计算机视觉与大模型_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算与人工智能概论问题求解、科学计算与AI应用方法第11章机器学习信息科学与工程学院线性回归模型

逻辑回归模型

OpenCV的SVM模型

OpenCV的神经网络模型目录线性回归模型任务描述:用线性回归模型预测学生成绩数据文件Student_Marks.csv中包含三列数据:学生修课的门数(number_courses)、学习时间(time_study)和分数(Marks)。任务1:根据已知数据,分析分数和学习时间的关系,即建立线性回归模型。任务2:若已知学生的学习时间而成绩未知,利用建立的模型来预测(推理)其成绩。线性回归模型相关知识:什么是机器学习机器学习(MachineLearning,ML):人工智能的一个子集,它使计算机系统能够从数据中“学习”并进行自我优化,从而无需进行明确的编程指令就能完成某些任务。分为监督学习和无监督学习。机器学习主要目的:通过对大量数据的分析,挖掘出其中的潜在规律和模式,进而对未来的数据或行为进行预测或决策。机器学习主要步骤:建立一个模型->训练该模型->进行预测->评估效果->继续训练直到收敛->用训练好的模型进行预测。线性回归模型相关知识:监督学习监督学习:训练一个模型来识别输入和输出之间的关系,训练数据包括已知的输入和对应的输出结果(标签)。成绩预测问题输入数据(特征):学生学习时间标签:学生成绩预测:用“学习时间”预测其“成绩”。常见的监督学习算法线性回归、逻辑回归、支持向量机、决策树等。线性回归模型相关知识:无监督学习无监督学习:算法自己从数据中找出隐藏的模式或结构,而没有明确的标签或结果作为指导。基本思路:计算不同样本相互之间的距离;距离近的样本划分为一类。要点:事先不知道分类结果(标签)。线性回归模型相关知识:监督学习两大任务(分类与回归)回归任务:建立模型来预测一个连续的输出值,这个值通常是数量或者程度。分类任务:建立模型将输入数据划分为离散的类别。与回归不同,分类的输出是一组预定义的类别标签,而不是连续的数值。线性回归模型相关知识:线性回归模型的目标线性回归模型:最简单的一种模型,用于分析因变量(目标)和一个或多个自变量(特征)之间的线性关系。目的:线性回归试图找到一条最佳拟合直线,以描述自变量和因变量之间的关系。x:输入值(学习时间)y:标签值(已知的成绩)ŷ:预测值(预测的成绩)拟合线(回归方程):ŷ=θ0+θ1x找到最佳的回归系数θ0和θ1,能反应已知数据的规律应用:房地产领域预测房价,自变量可能包括房屋面积、房间数量、地理位置等;金融领域预测股票价格;医学研究用来探究不同治疗方法对患者康复时间的影响线性回归模型相关知识:用损失函数评价模型穷举算法找最佳参数:枚举所有可能的参数(θ0,θ1),对每一组参数进行评价,找出评价最高的参数。通常定义损失函数(LostFunction)进行评价。损失函数:估量模型的预测值ŷ与标签值(真实值)y的不一致程度。回归问题用均方误差函数做损失函数:展开后:上标i表示第i个样本数据训练模型:穷举法枚举参数,然后评价参数并选择最优参数的过程就是模型的训练过程。

穷举法效率很低!线性回归模型相关知识:用梯度下降算法提高训练效率梯度下降算法找最佳参数:计算损失函数L对参数θj的偏导数(梯度),沿着梯度下降的方向修改θj。轮次:使用所有的训练数据完成一次梯度下降算法(计算梯度、调整参数)称为一个轮次。每个轮次使得参数更接近最优。收敛:经过多个轮次的训练,损失函数值达到最小值,称为模型已经收敛,训练结束。线性回归模型相关知识:超参数参数:θ0,θ1,...参数是机器学习的目标。也是学到的知识。模型自己去调整。超参数:开始机器学习之前设置的一些超参数。需要对超参数进行优化,给模型选择一组合适的超参数,以提高学习的性能和效果。人去设置。常用超参数学习率(learningrate)α:决定了模型参数更新的步长,过大可能导致模型训练不稳定,过小则可能导致训练速度过慢。最大迭代次数(iteration):决定模型训练的最大轮数,过少的迭代可能使模型未能充分学习(即欠拟合),过多的迭代则可能导致过度学习(即过拟合)。线性回归模型相关知识:机器学习的步骤1数据预处理:处理缺失数据和异常数据、将非数值型数据转换为模型可处理的数值型数据等。2特征提取:原始数据中提炼出对模型训练有益的信息。例如,任务1中的学生学习时间即是从原始数据中提取的关键特征。3模型选择:根据问题的具体性质和数据特征,选择恰当的机器学习模型。例如线性回归模型、决策树、随机森林、支持向量机(SVM)以及神经网络等。4模型训练:用特征对选定的模型进行训练。这一过程中,通常需要定义并最小化损失函数,并通过迭代使用如梯度下降等算法来调整模型参数,直至达到收敛状态。线性回归模型相关知识:机器学习的步骤(续)5模型评估:通过一个独立的测试集(即未在训练过程中使用的数据)来评估模型的性能。这一步骤旨在检验模型在处理未知数据时的表现。6模型调优:基于模型评估的结果,对模型的超参数进行调整或尝试采用不同的模型,以提升模型的整体性能。模型调优在第3节中描述,本节未使用此步骤。7模型应用:将经过训练的模型应用于实际问题中,执行预测或分类任务。线性回归模型设计思路:CSV文件的解析CSV:Comma-SeparatedValues,逗号分隔值文件,一种常见的数据存储格式,以纯文本形式存储表格数据,每一行表示一条记录,每个字段由逗号分隔。数据文件Student_Marks.csv,格式为:number_courses,time_study,Marks3,4.508,19.2024,0.096,7.7344,3.133,13.811......解析思路:1每次读入文件的一行到字符串S中;2用strchr函数在字符串中查找逗号;3将逗号替换为字符串结束符\0;4字符串S分割为3个字符串,后2个字符串指针为逗号的位置+1;5将3个字符串转换为浮点数。线性回归模型设计思路:文本文件的读取文件的种类:文本文件、二进制文件;文本文件的内容全是字符编码;二进制文件的内容是二进制数据。辨析:word文档是文本文件还是二进制文件?

word文档包含了格式控制等信息,不全是字符编码,不是文本文件!逐行读取文本文件的算法步骤:1以只读且文本方式打开文件,获得文件指针;2循环,用文件指针读取一行数据直到失败(表示没有数据了);3关闭文件指针;FILE*file=fopen(fileName,"r");//只读方式打开文件while(fgets(line,sizeof(line),file)!=NULL){...}fclose(file);//关闭文件

"r"为"rt"的省略形式,r:read,t:text文本文件

"rb"则为只读方式打开二进制文件

fgets读取文件中的一行,若已经到了末尾,返回NULL线性回归模型设计思路:线性回归模型训练算法Input:数据集D={(x1,y1),...,(xn,yn)},其中xi是学习时间,yi是分数;学习率α;迭代次数T,精度阈值ε。Output:线性回归模型的参数θ0(截距)和θ1(斜率)。Step1.给参数θ0和θ1赋予指定的初值或随机值。Step2.对于t从1到T进行迭代,直到收敛(即参数更新的变化量小于ε):Step2.1.计算损失函数的梯度: -对于每个样本(xi,yi),计算预测值ŷi=θ0+θ1*xi。 -计算损失函数关于θ0和θ1的偏导数(梯度):

∂L/∂θ0=2*Σ(ŷi-yi)/n,∂L/∂θ1=2*Σ(xi*(ŷi-yi))/nStep2.2.更新参数:θ0=θ0-α*(∂L/∂θ0),θ1=θ1-α*(∂L/∂θ1)Step3.返回最终的参数θ0和θ1。线性回归模型代码实现:线性回归算法的C语言实现typedefstruct{doubletime_study;//学习时间doublemarks;//成绩}DataPoint;intReadCsv(constchar*fileName,DataPointdata[]){FILE*file;charline[100];//存储一行数据的数组inti=0;//数组下标file=fopen(fileName,"r");//打开文件if(file==NULL)return-1;fgets(line,sizeof(line),file);//跳过标题行

while(fgets(line,sizeof(line),file)!=NULL){//每次读取一行数据char*p1,*p2,*end;p1=strchr(line,',');//第1个逗号位置

*p1=0;p1++;//构造字符串p2=strchr(p1,',');//第2个逗号位置

*p2=0;p2++;//构造字符串data[i].time_study=strtod(p1,&end);//解析time_studydata[i].marks=strtod(p2,&end);//解析marksi++;}fclose(file);//关闭文件returni;//返回数据总数}线性回归模型代码实现:线性回归算法的C语言实现(续)doublePredict(doubletheta0,doubletheta1,doublex){//推理函数returntheta0+theta1*x;}//模型训练函数voidGradientDescent(DataPointdata[],intn,doublealpha,doubleesp,intiterations,double*theta0,double*theta1){

for(intiter=0;iter<iterations;iter++){//迭代

doublegrad0=0,grad1=0;//偏导数for(inti=0;i<n;i++){//遍历数据集doublepredicted=Predict(*theta0,*theta1,data[i].time_study);

grad0+=2*(predicted-data[i].marks);//计算偏导数grad1+=2*data[i].time_study*(predicted-data[i].marks);//计算偏导数}printf("%dtheta0:%f,theta1:%f\n",iter+1,*theta0,*theta1);

grad0/=n;grad1/=n;//计算偏导数printf("grad0:%f,grad1:%f\n",grad0,grad1);

*theta0-=alpha*grad0;//更新参数*theta1-=alpha*grad1;//更新参数if(fabs(alpha*grad0)<=esp&&fabs(alpha*grad1)<=esp){//判断是否达到精度要求printf("Convergedafter%diterations.\n",iter+1);

break;}

}if(iter>=iterations)printf("Reachedmaximumnumberofiterationswithoutconverging.\n");}线性回归模型代码实现:线性回归算法的C语言实现(续)intmain(){DataPointdata[200];intn=ReadCsv("Student_Marks.csv",data);//从文件读入数据doubletheta0=0.5,theta1=0.5;//初始参数值(参数,学习目标)doublealpha=0.001;//学习率(超参数)

doubleesp=0.00001;//精度阈值(超参数)intiterations=100000;//迭代次数(超参数)GradientDescent(data,n,alpha,esp,iterations,&theta0,&theta1);//训练模型printf("theta0:%f,theta1:%f\n",theta0,theta1);doublescore=Predict(theta0,theta1,8.2);//一位学生学习时间是8.2,用模型进行推理printf("Thepredictedscoreis%lf\n",score);return0;}线性回归模型

逻辑回归模型

OpenCV的SVM模型

OpenCV的神经网络模型目录逻辑回归模型任务描述:用逻辑回归模型预测企鹅类型数据文件penguins.csv中包含的数据:species:三个企鹅种类:阿德利(Adelie)、帽带(Chinstrap)、巴布亚(Gentoo)culmen_length_mm:鸟的嘴峰长度(毫米)culmen_depth_mm:鸟的嘴峰深度(毫米)flipper_length_mm:脚掌长度(毫米)body_mass_g:体重(克)island:岛屿的名字sex:企鹅的性别year:采集数据的年份任务1:建立嘴峰长度和嘴峰深度与企鹅类型(离散型数据)之间的关系,即建立逻辑回归模型。

(暂时忽略其他数据)任务2:若已知企鹅的嘴峰长度和嘴峰深度,利用建立的模型来预测(推理)其类型。Adelie为0、Gentoo为1,暂时忽略Chinstrap类型。逻辑回归模型相关知识:什么是逻辑回归模型逻辑回归模型:最简单的分类模型,该模型是一条分割直线,用来将平面分成两个“半平面”,使得两种类型的企鹅分别位于不同的“半平面”逻辑回归的任务:找到一组合适的参数(θ0,θ1,θ2),使得被分割后的两个“半平面”都只包含一种类型的企鹅,同时,要求任意样本离分割线的距离越远越好。逻辑回归模型相关知识:如何判断类型类型判断方法:分别将Adelie类型和Gentoo类型企鹅的嘴峰长度(x1)和嘴峰深度(x2)代入右式,使得结果z的符号相反。例如,Adelie类型的结果为负数,Gentoo类型的结果为正数。预测结果的值域为[-∞,∞]。类型与正负的对应关系可定义:右式两边同时乘以-1(相当于参数全部变成相反数),则Adelie类型的结果变为正数,Gentoo类型的结果变为负数。逻辑回归模型相关知识:值域变换函数Sigmoid标签与预测结果的值域不同:预测结果的值域为[-∞,∞]。标签的值是离散值0或1。Sigmoid函数:将预测结果从[-∞,∞]变换到[0,1],使得预测结果和标签具有可比性。预测结果:若g(z)介于0.5~1之间,预测结果为1,即类别Gentoo,若g(z)介于0~0.5之间,预测结果为0,即类别Adelie。逻辑回归模型相关知识:预测结果与概率预测结果与概率:g(z)可视为“结果为Gentoo”的概率。完整函数:将线性函数z代入g(z)。例:若g(z)的计算结果为0.74,表明结果为Gentoo的概率是0.74,为Adelie的概率是0.26,因此预测结果为Gentoo。逻辑回归模型相关知识:逻辑回归模型的损失函数损失函数的选择:评价预测结果与标签的差异。类型是离散值时,类别之间的相关性难以量化,使用均方误差可能会导致错误的指示。分类任务中的2个概率分布:真实的概率分布(即标签)和模型预测的概率分布。交叉熵误差函数的目标:评价这两个概率分布之间的差异。预测完全准确时误差为零;预测越不准确误差越大。逻辑回归模型相关知识:用梯度下降算法求最佳参数梯度下降算法找最佳参数:计算损失函数L对参数θj的偏导数(梯度),沿着梯度下降的方向修改θj。轮次:使用所有的训练数据完成一次梯度下降算法(计算梯度、调整参数)称为一个轮次。每个轮次使得参数更接近最优。收敛:经过多个轮次的训练,损失函数值达到最小值,称为模型已经收敛,训练结束。逻辑回归模型设计方案:用开源库解析CSV文件开源库RapidCsv:轻量级,速度快,只有一个头文件rapidcsv.h创建Document对象加载CSV文件中的数据:rapidcsv::Documentdoc("penguins.csv");有缺失数据时,用参数指明缺失数据NA的处理方法(转为C语言的NaN):rapidcsv::Documentdoc(fileName,rapidcsv::LabelParams(),

rapidcsv::SeparatorParams(),rapidcsv::ConverterParams(true));获取CSV文件的总行数:

doc.GetRowCount();循环处理CSV文件的每一行(给出列名、行号):

doublebill_length_mm=doc.GetCell<double>("bill_length_mm",10);剔除缺失数据:

if(!std::isnan(bill_length_mm))......//不是缺失数据才进行正常的处理线性回归模型设计思路:逻辑回归模型训练算法Input:数据集D={(x11,x21,y1),...,(x1n,x2n,yn)},其中x1i是嘴峰长度,x2i是嘴峰深度,yi是企鹅类型;学习率α;迭代次数T,精度阈值ε。Output:逻辑回归模型的参数θ0、θ1和θ2。Step1.初始化参数θ0、θ1和θ2为随机值。Step2.对于t从1到T进行迭代,直到收敛(即参数更新的变化量小于ε):Step2.1.计算损失函数的梯度:-对于每个数据样本(x1i,x2i,yi),计算预测值ŷi=1/(1+e^(θ0+θ1*x1i+θ2*x2i))。-计算损失函数关于θ0、θ1和θ2的偏导数(梯度):∂L/∂θ0=Σ(ŷi-yi)/n,∂L/∂θ1=Σx1i(ŷi-yi)/n,∂L/∂θ2=Σx2i(ŷi-yi)/nStep2.2.更新参数:θ0=θ0-α*(∂L/∂θ0),θ1=θ1-α*(∂L/∂θ1),θ2=θ2-α*(∂L/∂θ2)Step3.返回最终的参数θ0、θ1和θ2。逻辑回归模型代码实现:用开源库解析CSV文件intReadCsv(constchar*fileName,DataPointdata[]){rapidcsv::Documentdoc(fileName,rapidcsv::LabelParams(),rapidcsv::SeparatorParams(),rapidcsv::ConverterParams(true));//创建Document对象

intj=0;//样本计数for(inti=0;i<doc.GetRowCount();i++){//每次处理一行doublebill_length_mm=doc.GetCell<double>("bill_length_mm",i);//嘴峰长度doublebill_depth_mm=doc.GetCell<double>("bill_depth_mm",i);//嘴峰深度std::stringtype_name=doc.GetCell<std::string>("species",i);//种族if((type_name=="Adelie"||type_name=="Gentoo")&&!std::isnan(bill_length_mm)&&!std::isnan(bill_depth_mm)){//处理缺失值data[j].x1=bill_length_mm;data[j].x2=bill_depth_mm;data[j].label=type_name=="Adelie"?0:1;//标签j++;//剔除缺失值后的样本数目}}returnj;}逻辑回归模型代码实现:逻辑回归模型训练函数voidGradientDescent(DataPointdata[],intn,doublealpha,doubleesp,

intiterations,double*theta0,double*theta1,double*theta2){intiter;for(iter=0;iter<iterations;iter++){//迭代doublegrad0=0,grad1=0,grad2=0;//偏导数

for(inti=0;i<n;i++){//遍历数据集doublepredicted=Predict(*theta0,*theta1,*theta2,data[i].x1,data[i].x2);doublediff=predicted-data[i].label;grad0+=diff;grad1+=data[i].x1*diff;grad2+=data[i].x2*diff;//计算偏导数}printf("%dtheta0:%f,theta1:%f,theta2:%f\n",iter+1,*theta0,*theta1,*theta2);

grad0/=n;grad1/=n;grad2/=n;//计算偏导数

*theta0-=alpha*grad0;*theta1-=alpha*grad1;*theta2-=alpha*grad2;//更新参数printf("grad0:%f,grad1:%f,grad2:%f\n",grad0,grad1,grad2);

//判断是否达到精度要求

if(fabs(alpha*grad0)<=esp&&fabs(alpha*grad1)<=esp&&fabs(alpha*grad2)<=esp){

printf("Convergedafter%diterations.\n",iter+1);break;}}if(iter>=iterations)printf("Reachedmaximumnumberofiterationswithoutconverging.\n");}逻辑回归模型代码实现:推理函数与主函数doublePredict(doubletheta0,doubletheta1,doubletheta2,doublex1,doublex2){return1.0/(1.0+pow(E,-(theta0+theta1*x1+theta2*x2)));}intmain(){DataPointdata[500];intn=ReadCsv("penguins.csv",data);//从文件读入数据doubletheta0=0.5,theta1=0.5,theta2=0.5;//初始参数值doublealpha=0.001;//学习率doubleesp=0.00001;//精度阈值intiterations=100000;//迭代次数GradientDescent(data,n,alpha,esp,iterations,&theta0,&theta1,&theta2);//训练模型printf("theta0:%f,theta1:%f,theta2:%f\n",theta0,theta1,theta2);doubleoutput=Predict(theta0,theta1,theta2,46.2,13.5);//用模型进行推理printf("Theoutputis%lf\n",output);return0;}线性回归模型

逻辑回归模型

OpenCV的SVM模型

OpenCV的神经网络模型目录OpenCV的SVM模型任务描述:用SVM模型预测企鹅类型数据文件penguins.csv中包含的数据:species:三个企鹅种类:阿德利(Adelie)、帽带(Chinstrap)、巴布亚(Gentoo)culmen_length_mm:鸟的嘴峰长度(毫米)culmen_depth_mm:鸟的嘴峰深度(毫米)flipper_length_mm:脚掌长度(毫米)body_mass_g:体重(克)island:岛屿的名字sex:企鹅的性别year:采集数据的年份任务:以嘴峰长度、嘴峰深度、脚掌长度、体重、性别为输入数据,训练一个SVM模型,对企鹅进行分类。类别标签,0:Adelie,1:Gentoo,2:Chinstrap。OpenCV的SVM模型相关知识:独热编码(One-HotEncoding)独热编码:每个分类特征转换为一个二进制向量,其中只有一个元素为1,其余元素为0。目的:避免模型错误地假设分类特征之间存在数值上的大小关系。缺点:一个特征变为多个特征,导致特征空间显著增大。male:[1,0]female:[0,1]Adelie:

[1,0,0]Gentoo:

[0,1,0]Chinstrap:[0,0,1]OpenCV的SVM模型相关知识:模型的泛化能力泛化能力(GeneralizationAbility):机器学习模型对新鲜样本的适应能力。一个具有良好泛化能力的模型,不仅能够很好地拟合训练数据,更能够对未知的数据(即测试数据)进行准确的预测。逻辑回归模型泛化能力差:

虚线能将新样本正确识别为Adelie类型,而实线会将新样本错误地识别为Gentoo。

逻辑回归模型没有明确的方法在众多符合要求的分割线中找出泛化能力较高的分割线。OpenCV的SVM模型相关知识:支持向量机(SVM)原理支持向量机(SupportVectorMachine,SVM):定义在特征空间上使得分类间隔最大,从而提高模型的性能和泛化能力的线性分类器。SVM的目标:使用超平面将不同类型的样本分开,且该超平面能够尽量远离样本,这样的超平面被称为最优超平面。间隔(Margin)是最优超平面与来自每个类的最近样本之间的距离,SVM的目标是最大化这一间隔,同时尽量减少分类错误。OpenCV的SVM模型相关知识:SVM的核函数核函数:一种非线性映射算法,将低维输入空间线性不可分的样本转化为高维特征空间,使其在高维空间中变得线性可分。核函数的机制:若核函数为K(xi,xj),假设企鹅分类问题共有11个样本,每个样本2个特征(嘴峰长度和嘴峰深度),即数据集是11*2的矩阵,对每个样本xi,从11个样本中依次选择一个样本(包括xi自己)作为xj,一起送入核函数K进行计算,计算11次后得到的结果构成一个11维的特征向量,数据集变为11*11的矩阵。OpenCV的SVM模型相关知识:常见核函数线性核函数(LinearKernel):计算两个样本的点积(几何意义上的向量投影),通常用于数据集为线性可分的情形;多项式核函数(PolynomialKernel):适用于数据特征之间有一定关联或数据呈现多项式关系的情况;径向基函数核(RadialBasisFunctionKernel,简称RBF核或高斯核):最常用的核函数,它对样本之间的距离进行计算,通过高斯函数的形式将低维数据映射到高维空间,适用于处理非线性问题。Sigmoid核函数:实现类似于神经网络中多层感知器的效果。RBF核的两个重要超参数GAMMA超参数:控制核函数的宽度或扩展程度GAMMA的值越大,核函数越窄,模型对训练数据的拟合越精确,可能导致过拟合。GAMMA的值越小,泛化能力更强,可能导致欠拟合。惩罚系数C:SVM的正则化超参数,用于控制模型对错误分类的惩罚程度。C的值越大,模型对错误分类的惩罚越重,可能会导致过拟合。C的值越小,模型对错误分类的惩罚越轻,可能会导致欠拟合。OpenCV的SVM模型相关知识:模型的评估与调优模型评估的目的为了确保推理/预测的结果更加准确,在完成模型训练之后,需要对模型的训练效果进行评估。评估模型的方法将数据集划分为训练集和测试集,其中训练集用于学习,测试集用于模型评估。对分类模型进行评估的基本步骤(1)将测试集的特征向量输入训练好的模型进行预测,得到模型的分类结果;(2)将分类结果与测试集的标签数据进行比较,统计正确的比例,得到模型的预测精度。模型评估的意义模型评估结果可作为模型调优(即超参数调整)的依据,不同的超参数组合可能得到不同的评估结果,选择评估结果最佳的超参数组合可以极大地提高模型的性能。OpenCV的SVM模型相关知识:模型评估与调优算法网格搜索(GridSearch):通过系统地遍历超参数空间中的每一组预定义值,来评估每个超参数组合对模型性能的影响,从而找到最佳超参数组合。算法步骤:(1)定义超参数空间:首先,为模型的每个超参数定义一个可能的取值范围。在实践中,通常将取值范围离散化为一组有限的值,以便于计算。(2)构建超参数网格:接下来,将这些超参数的取值范围组合成一个多维的“网格”。每个网格点都代表一个特定的超参数组合。(3)模型训练和评估:对于网格中的每个超参数组合,都训练一个模型,并使用交叉验证等方法来评估其性能。(4)选择最佳超参数:最后,根据评估结果,选择性能最好的超参数组合作为模型的最终超参数。OpenCV的SVM模型相关知识:升级mingw编译器Dev-C++从2016年之后已停止更新,其内部使用的MinGW不支持较新版本的OpenCV,需要对MinGW进行升级。MinGW8.1.0的下载地址:/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z或网盘下载:/s/1x93rfSJcilIO6KRssYtwLg?pwd=m6hu文件下载并解压后,将其中的文件拷贝到Dev-C++安装目录下的MinGW64目录中,覆盖原有的文件即可。OpenCV的SVM模型相关知识:下载并安装配置OpenCVOpenCV二进制库下载地址:/s/1x93rfSJcilIO6KRssYtwLg?pwd=m6hu下载文件opencv4120.zip并解压,将opencv目录拷贝到合适的路径,然后进行配置:①配置包含文件:打开devc++编程环境,通过菜单栏的“工具->编译选项”打开编译选项窗口,点击其中的“目录”页,再点击“C++包含文件”页,在最下面的输入框中将解压的opencv的include文件夹的路径输入其中,点击下面的“添加”按钮,在“C包含文件”页进行同样的处理。OpenCV的SVM模型相关知识:下载并安装配置OpenCV②配置库文件:通过菜单栏的“工具->编译选项”打开编译选项窗口,点击其中的“目录”页,再点击“库”页。在最下面的输入框中将前面解压的opencv文件夹的路径输入其中(或通过旁边的导航按钮选择这个文件夹),点击下面的“添加”按钮,将输入的文件夹添加到上面的文件夹列表中,最后点击下面的“确定”按钮。OpenCV的SVM模型相关知识:下载并安装配置OpenCV③配置编译和链接选项:通过菜单栏的“工具->编译选项”打开编译选项窗口,点击“编译器”页面,在下方的连接器命令窗口中,输入空格,然后输入-lopencv_world454.dll。然后点击“代码生成/优化”页面,再点击“代码生成”页面,在“语言标准(-std)”栏的下拉框中选择“GNUC++11”。④拷贝动态链接库文件:使用了OpenCV库的源代码被编译后,形成的可执行文件不能独立运行,因为其依赖OpenCV的动态链接库文件libopencv_world454.dll,这个文件在OpenCV解压后的目录中,将这个文件拷贝到编译后的可执行文件处即可。OpenCV的SVM模型相关知识:OpenCV的矩阵类型MatOpenCV的矩阵cv::MatMat类是OpenCV中用于存储矩阵数据的类型,cv是OpenCV的命名空间。定义1个Mat类对象的方法:cv::Matlabels(100,2,CV_32F)。100行2列的矩阵,数据项类型是32位浮点数OpenCV的SVM模型相关知识:OpenCV机器学习步骤(a)载入训练数据到Mat对象中使用OpenCV进行机器学习时,通常需要将数据集读取到2个Mat类对象中,其中一个用来存储输入的特征数据(例如企鹅的嘴峰长度、嘴峰深度等),另一个用来存储标签数据(例如企鹅的类型)。cv::Matsamples(rows,6,CV_32F);//特征数据,rows是行数,6是列数,类型是CV_32F(浮点数)cv::Matresponses(rows,1,CV_32S);//标签数据,类型是CV_32S(整数)OpenCV的SVM模型相关知识:OpenCV机器学习步骤(b)创建并配置模型创建模型对象cv::Ptr<cv::ml::SVM>svm=cv::ml::SVM::create();cv::Ptr<cv::ml::SVM>表示变量svm的类型是一个智能指针,即能够自动释放内存的指针,<>中的内容是模版参数,代表该指针的类型是SVM。配置模型超参数,对于SVM模型,通常需要配置下列超参数:svm->setKernel(cv::ml::SVM::RBF);//设置高斯核函数svm->SetC(1000);//设置惩罚系数Csvm->SetGamma(0.001);//设置核函数的GAMMA超参数svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER,1000,0.0001));//设置终止条件setKernel函数为SVM设置核函数。setTermCriteria函数为训练过程设置中止条件,1000和0.0001分别表示迭代次数和精度阈值。OpenCV的SVM模型相关知识:OpenCV机器学习步骤(c)训练模型svm->train(samples,cv::ml::ROW_SAMPLE,labels);//训练模型samples:cv::Mat类型的输入特征向量;cv::ml::ROW_SAMPLE:指定了每一行数据为一个样本;labels:cv::Mat类型的标签数据。train函数进行训练迭代,直到收敛或达到最大迭代次数。d)用训练好的模型推理cv::Matsample(1,6,CV_32F);//一个新的输入向量floatresponse=svm->predict(sample);//进行推理sample:一个全新的、未包含在输入数据中的特征向量。可以输入多个向量,并用第2个参数接收结果:cv::Matsamples(10,6,CV_32F);//多个输入向量构成的矩阵cv::Matresponses(10,1,CV_32S);//输出结果矩阵svm->predict(samples,responses);//进行推理OpenCV的SVM模型设计思路:OpenCVSVM模型的训练算法Input:企鹅数据集,包含以下特征:嘴峰长度(culmen_length_mm)、嘴峰深度(culmen_depth_mm)、脚掌长度(flipper_length_mm)、体重(body_mass_g)、性别(sex);标签为企鹅种类(species)。Output:训练好的SVM模型,能够预测新企鹅样本的种类。Step1.数据预处理Step1.1读取数据集,将数值特征(嘴峰长度、嘴峰深度、脚掌长度、体重)转换为适合SVM处理的数值格式。Step1.2对于分类数据(性别),使用独热编码(One-HotEncoding)转换为数值格式。Step1.3分割数据集为训练集和测试集。Step2.SVM模型训练Step2.1初始化OpenCV的SVM超参数,设置SVM类型(如C_SVC)、核函数类型(如LINEAR、RBF等)以及其他相关超参数。Step2.2使用训练集的特征和标签训练SVM模型。Step3模型评估Step3.1将测试集的特征向量输入训练好的SVM模型,获得预测结果。Step3.2对预测结果和测试集的标签进行对比,计算分类准确率等指标。Step4.模型应用:Step4.1对于新的企鹅样本,按照相同的预处理步骤处理其特征。Step4.2使用训练好的SVM模型对新样本进行预测,得到其预测的企鹅种类。OpenCV的SVM模型代码实现:训练OpenCVSVM模型#include<iostream>#include"rapidcsv.h"#include<opencv2/opencv.hpp>usingnamespacestd;usingnamespacecv;usingnamespacecv::ml;typedefstruct{doublex1,x2,x3,x4;//嘴峰长度、嘴峰深度、脚掌长度、

体重intx5_0,x5_1;//是否male(1:male,0:female);是否famale(1:female,0:male)intlabel;//类别标签,0:Adelie,1:Gentoo,2:Chinstrap}DataPoint;OpenCV的SVM模型代码实现:训练OpenCVSVM模型intmain(){

DataPointdata[500];intn=ReadCsv("penguins.csv",data);//从文件读入数据//将数据拷贝到Mat矩阵中,75%训练数据,25%测试数据intn1=n*3/4,n2=n-n1;Mattrain_samples(n1,6,CV_32F);//训练数据集Mattrain_labels(n1,1,CV_32S);//训练数据的标签Mattest_samples(n2,6,CV_32F);//测试数据集Mattest_labels(n2,1,CV_32S);//测试数据的标签inti=0,j=0,k=0;for(i=0;i<n;i++){if(i%4==0){//每3个训练数据搭配1个测试数据test_samples.at<float>(j,0)=data[i].x1;test_samples.at<float>(j,1)=data[i].x2;test_samples.at<float>(j,2)=data[i].x3;test_samples.at<float>(j,3)=data[i].x4;test_samples.at<float>(j,4)=data[i].x5_0;test_samples.at<float>(j,5)=data[i].x5_1;test_labels.at<int>(j,0)=data[i].label;j++;}else{train_samples.at<float>(k,0)=data[i].x1;train_samples.at<float>(k,1)=data[i].x2;train_samples.at<float>(k,2)=data[i].x3;train_samples.at<float>(k,3)=data[i].x4;train_samples.at<float>(k,4)=data[i].x5_0;train_samples.at<float>(k,5)=data[i].x5_1;train_labels.at<int>(k,0)=data[i].label;k++;}}OpenCV的SVM模型代码实现:训练OpenCVSVM模型

Ptr<SVM>svm=SVM::create();//创建SVM模型

svm->setKernel(SVM::RBF);//设置核函数RBFsvm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER,10000,1e-5));//设置迭代次数与收敛条件

doublebest_C,best_GAMMA,best_accuracy=0;for(doubleC=1e-2;C<=1e10;C*=10){//网格搜索for(doubleGAMMA=1e-9;GAMMA<=1e3;GAMMA*=10){//网格搜索

svm->setC(C);//惩罚系数Csvm->setGamma(GAMMA);//核函数的gamma超参数svm->train(train_samples,ROW_SAMPLE,train_labels);//训练SVM模型Matpredictions;//预测结果

svm->predict(test_samples,predictions);//对测试集进行预测intcorrect=0;for(inti=0;i<predictions.rows;i++)if(predictions.at<float>(i,0)==test_labels.at<int>(i,0))correct++;//统计正确分类的次数

doubleaccuracy=(double)correct/predictions.rows;//计算准确率cout<<"C:"<<C<<",Gamma:"<<GAMMA<<",Accuracy:"<<accuracy*100<<"%"<<endl;if(accuracy>best_accuracy){//本次超参数组合优于最佳组合best_C=C;best_GAMMA=GAMMA;best_accuracy=accuracy;

svm->save("svmmod.xml");//存储模型}}}}OpenCV的SVM模型代码实现:用训练好的模型进行企鹅分类typedefstruct{doublex1,x2,x3,x4;//嘴峰长度、嘴峰深度、脚掌长度、体重intx5_0,x5_1;//是否male(1:male,0:female);是否famale(1:female,0:male)intlabel;//类别标签,0:Adelie,1:Gentoo,2:Chinstrap}DataPoint;intmain(){charmodel_file_name[]="svmmod.xml";

Ptr<SVM>svm=Algorithm::load<SVM>(model_file_name);//从文件加载训练好的SVM模型floatnew_samp_data[]={51.2,18.7,192,4250,1,0};//新的企鹅数据样本Matnew_sample(1,6,CV_32F,new_samp_data);//将新样本数据填充到Mat对象中

floatresponse=svm->predict(new_sample);//进行预测

cout<<"Predictedspecies:"<<response<<endl;//输出预测结果return0;}线性回归模型

逻辑回归模型

OpenCV的SVM模型

OpenCV的神经网络模型目录OpenCV的神经网络模型任务描述:用神经网络模型预测企鹅类型数据文件penguins.csv中包含的数据:species:三个企鹅种类:阿德利(Adelie)、帽带(Chinstrap)、巴布亚(Gentoo)culmen_length_mm:鸟的嘴峰长度(毫米)culmen_depth_mm:鸟的嘴峰深度(毫米)flipper_length_mm:脚掌长度(毫米)body_mass_g:体重(克)island:岛屿的名字sex:企鹅的性别year:采集数据的年份任务:以嘴峰长度、嘴峰深度、脚掌长度、体重、性别为输入数据,训练一个神经网络模型,对企鹅进行分类。类别标签,

0:Adelie,1:Gentoo,2:Chinstrap。OpenCV的神经网络模型相关知识:神经网络的基本结构神经网络:由节点(神经元,图中的圆圈)和连接(权重,圆圈之间的连线)组成。神经元:神经网络的基本处理单元,负责接收输入信号,并通过加权求和与激活函数的处理,产生输出信号。连接权重:表示了节点之间的关联强度,是神经网络学习的关键。神经网络的学习:即权重的调整过程,通过不断迭代优化,使得网络能够逐渐逼近目标函数,实现对数据的准确预测和分类。神经网络的层次:输入层、隐藏层和输出层。输入层负责接收外部数据,将其转换为神经网络可以处理的格式。隐藏层是神经网络的核心部分,负责数据的非线性变换和特征提取。通过多层隐藏层的堆叠,神经网络能够捕捉到数据中的复杂模式和关系,实现对数据的深层次理解。输出层根据任务的不同,给出最终结果,可能是分类标签、回归值或序列等。OpenCV的神经网络模型相关知识:神经元模型典型神经元模型:输入、权重、偏置、求和节点、激活函数和输出六个部分。x1x2x3+1∑偏置输入w1w2w3b权重/参数激活函数fy输入(Inputs)是来自其他神经元或外部数据的信号,表示为x1,x2,…,xn。权重(Weights)或参数(Parameters)是各个输入信号对神经元输出的影响程度,每个输入信号都有一个对应的权重,表示为w1,w2,…,wn。偏置(Bias)是一个额外的参数b,用于调整神经元的激活阈值。求和节点(SummationNode)对所有输入进行加权求和,并加上偏置,即计算∑i=1n(wixi+b)。激活函数(ActivationFunction)是一个非线性函数,对求和节点的结果进行转换,常见的激活函数包括sigmoid、ReLU、tanh等。输出(Outputs)是神经元的最终输出结果,也就是激活函数的输出,表示为y,神经元的输出会作为下一个神经元的输入,从而在整个神经网络中传播。OpenCV的神经网络模型相关知识:神经元工作流程x1x2x3+1∑偏置输入w1w2w3b权重/参数激活函数fy神经元接收来自其他神经元或外部数据的输入信号x1,x2,…,xn;神经元对每个输入信号进行加权求和,得到加权和z=∑i=1n(wixi+b)。神经元将加权和z输入到激活函数中,得到神经元的输出y=f(z),其中f是激活函数。OpenCV的神经网络模型相关知识:激活函数激活函数是神经网络中不可或缺的元素,它引入了非线性特性,使得神经网络能够处理复杂的非线性问题。Sigmoid函数:一种平滑的、逐渐过渡的S形函数,它将输入值映射到(0,1)区间。在输入值较大或较小时,梯度会变得很小,导致梯度消失问题,即梯度(即偏导数)趋于零或变得非常小,导致权重更新非常缓慢或几乎不更新。ReLU函数:输出值等于输入值,否则输出0。计算简单、梯度易于传播,能有效缓解梯度消失问题。在输入值为负时,输出为0,导致神经元出现“死亡”现象,即该神经元在后续的训练中不再参与计算。OpenCV的神经网络模型相关知识:神经元的训练初始化:对神经元的权重和偏置进行初始化(例如随机值);计算输出:y=f(x1w1+x2w2+x3w3+b)=f∑i=1n(xiwi+b);损失计算:使用损失函数L(w1,w2,w3,b)来量化输出y与标签值y’之间的差异,均方误差函数或交叉熵损失函数;计算偏导数:计算损失函数L对所有参数(包括权重和偏置)的偏导数(即梯度);梯度下降算法使得偏差最小调整w损失函数计算偏差标签y’x1x2x3+1∑偏置输入w1w2w3b权重/参数激活函数fyy=f(x1w1+x2w2+x3w3+b)=f∑i=1n(xiwi+b)参数更新:根据梯度信息对神经元的权重和偏置进行更新;循环迭代:上述过程反复进行多个轮次,直到达到预设的停止条件(损失收敛、达到最大迭代次数、性能不再提升等)。OpenCV的神经网络模型相关知识:用神经元构造神经网络前馈神经网络:由输入层、一层或多层隐藏层以及输出层组成,信息在网络中单向流动,即从输入层经隐藏层至输出层,不存在反向回路。每一层的神经元仅接收来自前一层神经元的输出作为输入,并通过权重和偏置进行加权求和,再经激活函数处理产生输出。输入层仅承担数据输入的角色,不参与计算,因此神经网络的层数中不包含输入层。右图为3层神经网络。OpenCV的神经网络模型相关知识:神经网络的训练前馈神经网络:由输入层、一层或多层隐藏层以及输出层组成,信息在网络中单向流动,即从输入层经隐藏层至输出层,不存在反向回路。每一层的神经元仅接收来自前一层神经元的输出作为输入,并通过权重和偏置进行加权求和,再经激活函数处理产生输出。训练步骤:全局初始化、前向传播、全局损失计算、反向传播与梯度计算、参数更新、迭代OpenCV的神经网络模型相关知识:Softmax激活函数Softmax函数:一种特别设计用于多分类问题的非线性函数。能够将输出层的原始得分转换为概率分布。Softmax函数对每个类别的得分进行指数化,然后除以所有类别得分指数化的和,从而确保所有输出值的和为1,且每个输出值都在0和1之间。Softmax函数也被称为归一化指数函数。这种转换对于解释神经网络的输出非常有用,因为它提供了一个直观的概率解释。训练步骤:全局初始化、前向传播、全局损失计算、反向传播与梯度计算、参数更新、迭代OpenCV的神经网络模型设计思路:用OpenCV训练神经网络模型的步骤(1)创建神经网络模型使用ANN_MLP::create()函数创建一个空的神经网络模型。

Ptr<ANN_MLP>nn=ANN_MLP::create();(2)设置神经网络的结构使用ANN_MLP::setLayerSizes()函数设置神经网络结构,指明网络每一层神经元的数目。

nn->setLayerSizes(vector<int>{6,10,15,4});

创建一个包含1个输入层(6个神经元)、2个隐藏层(10、15个神经元)、1个输出层(4个神经元)的3层神经网络。OpenCV的神经网络模型设计思路:用OpenCV训练神经网络模型的步骤3)设置必要的超参数激活函数、迭代次数、收敛条件、训练模式等。OpenCV支持SIGMOID_SYM、GAUSSIAN、RELU、LEAKYRELU等4种激活函数,下面使用SIGMOID_SYM,即对称Sigmoid,用于解决Sigmoid函数容易出现梯度消失的问题:nn->setActivationFunction(ANN_MLP::SIGMOID_SYM);设置迭代次数与收敛条件:nn->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER,10000,0.001));模型训练方法有BACKPROP、RPROP和ANNEAL,BACKPROP是反向传播算法,RPROP是改进的反向传播算法,解决梯度消失问题。nn->setTrainMethod(ANN_MLP::BACKPROP);(4)训练模型nn->train(trainingData,ROW_SAMPLE,trainingLabels);

训练数据的标签需采用独热编码,且数据类型必须为CV_32F(32位浮点型)OpenCV的SVM模型代码实现:训练OpenCV神经网络模型intmain(){DataPointdata[500];intn=ReadCsv("penguins.csv",data);//从文件读入数据//将数据拷贝到Mat矩阵中,75%训练数据,25%测试数据intn1=n*3/4,n2=n-n1;Mattrain_samples(n1,6,CV_32F);//训练数据集

Mattrain_labels(n1,3,CV_32F);//训练数据的标签(独热编码)

Mattest_samples(n2,6,CV_32F);//测试数据集Mattest_labels(n2,1,CV_32S);//测试数据的标签OpenCV的SVM模型代码实现:训练OpenCV神经网络模型

inti=0,j=0,k=0;

for(i=0;i<n;i++){if(i%4==0){//每3个训练数据搭配1个测试数据test_samples.at<float>(j,0)=data[i].x1;test_samples.at<float>(j,1)=data[i].x2;test_samples.at<float>(j,2)=data[i].x3;test_samples.at<float>(j,3)=data[i].x4;test_samples.at<float>(j,4)=data[i].x5_0;test_samples.at<float>(j,5)=data[i].x5_1;test_labels.at<int>(j,0)=data[i].label;j++;}else{train_samples.at<float>(k,0)=data[i].x1;train_samples.at<float>(k,1)=data[i].x2;train_samples.at<float>(k,2)=data[i].x3;train_samples.at<float>(k,3)=data[i].x4;train_samples.at<float>(k,4)=data[i].x5_0;train_samples.at<float>(k,5)=data[i].x5_1;

if(data[i].label==0){//标签转换为独热编码train_labels.at<float>(k,0)=1;train_labels.at<float>(k,1)=0;train_labels.at<float>(k,2)=0;}elseif(data[i].label==1){train_labels.at<float>(k,0)=0;train_labels.at<float>(k,1)=1;train_labels.at<float>(k,2)=0;}else{train_labels.at<float>(k,0)=0;train_labels.at<float>(k,1)=0;train_labels.at<float>(k,2)=1;}k++;}}OpenCV的SVM模型代码实现:训练OpenCV神经网络模型cout<<"n="<<n<<",n1="<<n1<<",n2="<<n2<<endl;

Ptr<ANN_MLP>nn=ANN_MLP::create();//创建神经网络模型nn->setLayerSizes(vector<int>{6,10,3});//输入层6个节点,隐藏层10个节点,输出层3个节点(假设3类企鹅)

nn->setActivationFunction(ANN_MLP::SIGMOID_SYM);//激活函数nn->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER,10000,1e-5));//设置迭代次数与收敛条件nn->setTrainMethod(ANN_MLP::RPROP);//弹性反向传播算法nn->train(train_samples,ROW_SAMPLE,train_labels);//训练模型Matpredictions;//预测结果

nn->predict(tes

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论