机器学习之线性回归算法

目录

线性回归算法

求导法推导

梯度下降法推导

线性回归实现人脸识别

导入数据

构建标签矩阵

经典线性回归求导法实现

经典线性回归梯度下降法实现

岭回归实现

套索回归实现

局部加权线性回归实现

可视化

人脸识别


线性回归算法

求导法推导

梯度下降法推导

线性回归实现人脸识别

导入数据

% pictures=dir('C:\Users\Yezi\Desktop\机器学习\AR_Gray_50by40\*.tif');
people=10;
personPictureNumber=100;
sample=[];
pictureNumber=people*personPictureNumber;
testData=[];
trainData=[];
testNumber=50;
trainNumber=personPictureNumber-testNumber;
testDataNumber=testNumber*people;
trainDataNumber=trainNumber*people;
dimension=16*16;
for i=1:pictureNumber
%     picture=imread("C:\Users\Yezi\Desktop\机器学习\AR_Gray_50by40\"+pictures(i).name);
%     picture=double(picture);
%     picture=picture(:);
    picture=usps1000(:,i);
    sample=[sample,picture];
    if mod(i,personPictureNumber)<trainNumber+1 && mod(i,personPictureNumber)~=0
        trainData=[trainData,picture];
    else
        testData=[testData,picture];
    end
end

构建标签矩阵

标签矩阵是这样一个矩阵:对应类别的位置为1,其他位置为0,例如,数字1对应0100000000,数字0对应1000000000,数字3对应0010000000。

Y=zeros(people,trainDataNumber);
for i=1:trainDataNumber
    Y(floor((i-1)/trainNumber)+1,i)=1;
end

经典线性回归求导法实现

求导法直接代入解的公式即可。

 W就是模型的参数。

W=pinv(trainData*trainData')*trainData*Y';

经典线性回归梯度下降法实现

①数据预处理:首先,通过计算训练数据每列(特征)的均值和标准差,对训练数据进行标准化处理,即将每个特征的值减去其均值,然后除以标准差。这样做是为了确保不同特征具有相似的尺度,有助于梯度下降算法的收敛。

②初始化权重参数:创建一个大小为dimension × people的全零矩阵W,用于存储线性回归模型的权重参数。

③设置学习率:将学习率a设置为一个较小的值,用于控制每次更新权重的步长。

④利用梯度下降法更新权重:通过迭代的方式,多次更新权重参数W,直到达到指定的迭代次数。在每次迭代中,根据当前的权重W、训练数据trainData和标签矩阵Y,计算出一个临时的权重参数WTemp。这里使用了线性回归的梯度下降法更新公式。具体来说,根据模型的误差(即预测值与实际值的差)和梯度信息,按照一定的步长反向调整权重的值。

⑤保存最终的权重参数:将最后一轮迭代得到的临时权重参数WTemp赋给变量W,得到最终的权重参数。

for i=1:trainDataNumber
    meanmean=mean(trainData(:,i));
    stdstd=std(trainData(:,i));
    for j=1:dimension
        trainData(j,i)=(trainData(j,i)-meanmean)/stdstd;
    end
end
for i=1:testDataNumber
    meanmean=mean(testData(:,i));
    stdstd=std(testData(:,i));
    for j=1:dimension
        testData(j,i)=(testData(j,i)-meanmean)/stdstd;
    end
end
W=zeros(dimension,people);
a=0.000001;
WTemp=W-2*a*trainData*(trainData'*W-Y');
for i=1:1000
    W=WTemp;
    WTemp=W-2*a*trainData*(trainData'*W-Y');
end
W=WTemp;

岭回归实现

岭回归(Ridge Regression)是一种用于处理线性回归问题的方法,它通过引入正则化项来改善模型的稳定性和预测能力。

在线性回归中,当存在多个特征时,可能会出现过拟合(overfitting)的问题,即模型在训练数据上表现良好,但在新样本上的泛化能力较差。过拟合通常发生在特征间存在高度相关性或特征维度较高的情况下。

岭回归通过添加一个正则化项到线性回归的损失函数中,可以有效地缓解过拟合问题。这个正则化项是模型权重平方的乘子,将其加到损失函数中,限制了权重的增长。正则化项的大小由超参数λ(lambda)控制,λ越大,则正则化影响越大。

岭回归的优点是可以减少模型对数据中噪声的敏感性,并改善预测的稳定性。通过惩罚权重的增长,岭回归可以有效地解决特征共线性(collinearity)问题,即特征之间强相关的情况。

使用岭回归的步骤包括选择合适的超参数λ,然后对模型进行训练和预测。通过调整λ的值,可以在模型的偏差(bias)和方差(variance)之间进行权衡,以获得最佳的预测性能。

W=(trainData*trainData'+eye(dimension)*4500000)^-1*trainData*Y';

套索回归实现

套索回归(Lasso Regression)是一种用于特征选择和线性回归问题的方法,它通过引入正则化项来改善模型的稳定性,并具备特征选择的能力。

与岭回归类似,套索回归也是在线性回归的基础上添加了正则化项。不同的是,套索回归使用的正则化项是模型权重的绝对值之和,而不是平方和。这使得套索回归具有一个特殊的性质,即可以将某些特征的权重压缩到零,从而实现特征选择的效果。

套索回归通过最小化损失函数和正则化项的和,来求解最佳的模型参数。其中,正则化项中的超参数α(alpha)控制着正则化的强度。较大的α值会导致更多的特征权重被压缩到零,从而进行更严格的特征选择。

套索回归的主要优点是可以产生稀疏解,即具备自动进行特征选择的能力。通过将一些特征的权重设为零,套索回归可以剔除模型中不重要或冗余的特征,提高模型的解释性和泛化能力。

使用套索回归的步骤与岭回归类似,需要选择合适的超参数α,并进行模型训练和预测。通过调整α的值,可以在模型的偏差和方差之间进行权衡,获得最佳的预测性能和特征选择结果。

for i=1:trainDataNumber
    meanmean=mean(trainData(:,i));
    stdstd=std(trainData(:,i));
    for j=1:dimension
        trainData(j,i)=(trainData(j,i)-meanmean)/stdstd;
    end
end
for i=1:testDataNumber
    meanmean=mean(testData(:,i));
    stdstd=std(testData(:,i));
    for j=1:dimension
        testData(j,i)=(testData(j,i)-meanmean)/stdstd;
    end
end
W=zeros(dimension,people);
for i=1:people
    w=lasso(trainData',Y(i,:));
    W(:,i)=sum(w,2);
end

局部加权线性回归实现

局部加权线性回归(Locally Weighted Linear Regression,LWLR)是一种非参数的回归方法,它在进行预测时使用了局部加权的策略,根据样本的相似度为每个数据点赋予不同的权重。

在传统的线性回归中,我们试图拟合一个全局性的线性模型,即假设所有数据都遵循同一个线性关系。然而,在某些情况下,数据可能呈现出明显的非线性特征或包含离群点,此时全局线性模型可能无法很好地拟合数据。

局部加权线性回归通过为每个数据点赋予一个权重,使得在预测时更加关注附近数据点的贡献。具体而言,对于待预测点,LWLR会给予距离该点较近的训练样本较高的权重,而对于距离该点较远的样本,则赋予较低的权重甚至可以忽略。这样做的目的是使预测点附近的样本对模型拟合产生更大的影响,从而实现对数据局部的拟合。

LWLR的拟合过程与传统的线性回归类似,但在计算参数时需要考虑每个数据点的权重。通常使用高斯核函数来计算权重,根据距离待预测点的远近决定权重的大小。然后,通过加权最小二乘法来拟合局部加权的线性模型。

LWLR的优点是能够更好地拟合非线性关系和处理离群点。它能够根据数据的特点自适应地调整模型,使得预测结果更加准确。但是,LWLR也存在一些缺点,比如计算量较大,对训练数据的依赖性较强,并且在高维数据上可能出现过拟合的问题。

w=zeros(trainDataNumber);
for i=1:trainDataNumber
    x=mod(i-1,trainNumber);
    w(i,i)=i/sqrt(2*pi)*exp(-x*x/2);
end
W=pinv(trainData*w*trainData')*trainData*w*Y';

可视化

visualizeDataTemp=[];
%3个人
for i=0:2
    visualizeDataTemp=[visualizeDataTemp,sample(:,i*personPictureNumber+1:i*personPictureNumber+personPictureNumber)];
end
egienvector=W(:,1:2);
visualizeData=egienvector'*visualizeDataTemp;
colors=[];
for i=1:3*personPictureNumber
    color=floor((i-1)/personPictureNumber+1)*50;
    colors=[colors,color];
end
scatter(visualizeData(1,:),visualizeData(2,:),[],colors,'filled');

人脸识别

这个人脸识别率就好算了,直接数有多少个是算对的就行。 

Predict=W'*testData;
[~,Index]=sort(Predict,'descend');
right=0;
for i=1:testDataNumber
    if Index(1,i)==floor((i-1)/testNumber)+1
        right=right+1;
    end
end
result=right/(testDataNumber);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

计算机网络——网络层

序言 计算机网络中的网络层在当今的社会起到了什么作用&#xff1f; 现在的互联网通信&#xff0c;远程办公和远程教育&#xff0c;电子商务和在线服务&#xff0c;信息共享和社交媒体&#xff0c;物联网和智能家居都是通过网络层才能使用的。它连接了人们、设备和信息&#xf…

chatgpt赋能python:Python编译成SO文件和反编译的介绍

Python编译成SO文件和反编译的介绍 什么是SO文件&#xff1f; SO文件&#xff0c;也称为共享对象文件&#xff0c;是一种二进制文件格式&#xff0c;用于在多个应用程序之间共享代码和数据。在Unix和类Unix系统中&#xff0c;它们通常是共享库文件的形式。因此&#xff0c;SO…

Vue-scoped(局部)样式

scoped(局部)样式 scoped是在脚手架有一个编写样式的小技巧 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突 1 编写案例 现在有两个组件&#xff0c;一个student,一个school&#xff0c;现在想给组件写点样式 这里只给个背景色 没问题&#xff0c;样式生效 2 样式冲…

自然语言处理从入门到应用——动态词向量预训练:ELMo词向量

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 在双向语言模型预训练完成后&#xff0c;模型的编码部分&#xff08;包括输入表示层以及多层堆叠LSTM&#xff09;便可以用来计算任意文本的动态词向量表示。最自然的做法是使用两个LSTM的最后一层隐含层输出作为词的动…

GPT学习笔记-Enterprise Knowledge Retrieval(企业知识检索)--私有知识库的集成

openai-cookbook/apps/enterprise-knowledge-retrieval at main openai/openai-cookbook GitHub 终于看到对于我解决现有问题的例子代码&#xff0c;对于企业私有知识库的集成。 我对"Retrieval"重新理解了一下&#xff0c;源自动词"retrieve"&#xf…

idea乱码的相关问题

idea控制台乱码&#xff08;即&#xff1a;tomacat等启动时的乱码&#xff09; 第一步&#xff1a; 控制台tomcat启动信息乱码解决&#xff08;红色字体&#xff09; 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

插入排序-C语言实现

&#x1f970;前言 &#x1f354;在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据&#xff0c;当然操作数据首先想到的就是数据的排序&#xff0c;排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等&#xff0c;这些就是储存数据的方…

1.1 编写一个简单的C++程序

博主介绍&#xff1a;爱打游戏的计算机专业学生 博主主页&#xff1a;夏驰和徐策 所属专栏&#xff1a;夏驰和徐策带你从零开始学C 1.1.0 这段话告诉我们什么&#xff1f; 这段话解释了一个C程序中的main函数的基本结构和功能。 它告诉我们以下几点&#xff1a; 1. C程序的…

Python爬取城市天气数据,并作数据可视化

1.爬取广惠河深2022-2024年的天气数据 import requests # 发送请求要用的模块 需要额外安装的 import parsel import csvf open(广-惠-河-深天气.csv, modea, encodingutf-8, newline) csv_writer csv.writer(f) csv_writer.writerow([日期, 最高温度, 最低温度, 天气,…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):GPT-3与Few-shot Learning

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; GPT&#xff08;Generative Pre-Trained Transformer&#xff09;&#xff1a;基础知识 GPT&#xff08;Generative Pre-Trained Transformer&#xff09;&#xff1a;在不同任务中使用GPT GPT&#x…

对英雄联盟英雄属性数据的预处理及相似度矩阵计算

目录 一、引言 二、任务1 1、填充缺失值 2、用中位数填充“生命值”属性列缺失值 3、 用均值填充“生命值”属性列缺失值 三、任务2 注&#xff1a;英雄联盟英雄属性数据资源可在博客资源中自行获取。 一、引言 英雄联盟作为一款古早的刀塔游戏&#xff0c;可谓之刀塔游…

[golang 微服务] 7. go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

一.go-micro框架 前言 上一节讲解了 GRPC微服务集群 Consul集群 grpc-consul-resolver相关的案例,知道了微服务之间通信采用的 通信协议&#xff0c;如何实现 服务的注册和发现&#xff0c;搭建 服务管理集群&#xff0c;以及服务与服务之间的 RPC通信方式,具体的内容包括: pro…

聊聊微服务到底该如何划分

背景 现在动不动就是微服务架构&#xff0c;但是微服务划分的合理与否会极大的影响开发过程中的复杂度&#xff0c;划分的重要性不言而喻&#xff0c;但是在微服务划分这条路上并没有银弹&#xff0c;有的说DDD可以解决微服务的划分问题&#xff0c;吕哥想说的是那只是理论上的…

端午作业1

只要文件存在&#xff0c;就会有唯一对应的inode号&#xff0c;且相应的会存在一个struct inode结构体。在应用层通过open&#xff08;&#xff09;打开一个设备文件&#xff0c;会对应产生一个inode号&#xff0c;通过inode号可以找到文件的inode结构体 根据inode结构体中文件…

JMU20 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV&#xff0c;内部收益率 IRR3. 单利&#xff0c;复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR&#xff0c;偿债备付率 DSC…

C语言学习(二十六)---指针练习题(二)

在上节的内容中&#xff0c;我们进一步学习了有关指针的内容&#xff0c;并做了一些关于指针的题目&#xff0c;今天我们将继续练习一些指针的题目&#xff0c;以便大家更好的理解和掌握指针的知识&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff0…

GreasyFork+Github

GreasyForkGithub 好长时间没用 GreasyFork 了&#xff0c;最近在刷 Spring Boot 的各种知识点&#xff0c;其中很大时间都在学习 baeldung.com 这个站点。不知道是因为最近刷的勤了还是怎么的&#xff0c;这个网站经常会弹出一个“让我关闭广告阻拦插件”的提示框&#xff0c…

MongoDB集群管理(三)

MongoDB集群管理 集群介绍 为什么使用集群 随着业务数据和并发量的增加&#xff0c;若只使用一台MongoDB服务器&#xff0c;存在着断电和数据风险的问题&#xff0c;故采用Mongodb复制集的方式&#xff0c;来提高项目的高可用、安全性等性能。 MongoDB复制是将数据同步到多个…

超简单 display:flex教学

display 弹性盒子解释 Flex是Flexible Box的缩写&#xff0c;意为"弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 它的作用&#xff1a; 它能够更加高效方便的控制元素的对齐、排列。 可以自动计算布局内元素的尺寸&#xff0c;无论这个元素的尺寸是固定的还是…