机器学习之线性回归算法

news2024/11/24 19:42:54

目录

线性回归算法

求导法推导

梯度下降法推导

线性回归实现人脸识别

导入数据

构建标签矩阵

经典线性回归求导法实现

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

岭回归实现

套索回归实现

局部加权线性回归实现

可视化

人脸识别


线性回归算法

求导法推导

梯度下降法推导

线性回归实现人脸识别

导入数据

% 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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Title:Python编程中的空格怎么用?详细教程!

Title: Python编程中的空格怎么用&#xff1f;详细教程&#xff01; Introduction: Python编程的空格使用一直是令人困惑的话题之一&#xff0c;但它却是Python语言中非常重要的一部分。空格在Python程序中用来表示代码块的开始和结束&#xff0c;因此不同的空格使用方式可能…

【夜深人静学数据结构与算法 | 第十篇】动态规划

目录 前言&#xff1a; 动态规划&#xff1a; 常见应用&#xff1a; 解题步骤&#xff1a; 动态规划的简化步骤&#xff1a; 案例&#xff1a; 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 62. 不同路…

【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

涉及知识点 分类的IP地址&#xff0c;子网划分&#xff0c;CIDR和路由汇聚&#xff0c;IPV4数据报格式&#xff0c;IPV6协议&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学…

Java的理论知识部分

文章目录 前言 一、Java的发展 1.1、Java的出现 1.2、Java官方网址 1.3、Java的平台 1.4、Java各版本新加的内容 1.5、java特点 1.6、Java的三种运行机制 1.7、Java的编译与运行 1.8、补充内容——华为鲲鹏jdk以及鲲鹏计算 二、面向对象程序编程 2.1、对象与类 2.2、Ja…

第一次安装cocoapods经历

先是执行&#xff1a;sudo gem install cocoapods 报错&#xff1a; ERROR: Error installing cocoapods: The last version of activesupport (> 5.0, < 8) to support your Ruby & RubyGems was 6.1.7.3. Try installing it with gem install activesupport -v…

无需麻烦,快速下载MySQL JDBC驱动程序!

如何提升你的MySQL数据库操作速度呢&#xff1f; 不必再费时寻找&#xff0c;我讲为你带来最简便、快速的MySQL JDBC驱动程序下载方法&#xff01; 无需繁琐步骤&#xff0c;轻松获取所需&#xff0c;让你的数据库操作更加流畅&#xff0c;事半功倍&#xff01;立即点击下载即…

高速数据采集专家--青翼8通道125MSPS 16位AD采集FMC子卡

青翼自研FMC129是一款8通道125MHz采样率16位AD采集FMC子卡&#xff0c;符合VITA57.1规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;8通道AD通过高带宽的FMC连接器&#xff08;HPC&#xff09;连接至FPGA从而大大降低了系统信号延迟。 该板卡支持板上可编…

【资料分享】Xilinx Zynq-7010/7020工业评估板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)

1 评估板简介 创龙科技TLZ7x-EasyEVM是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC评估板&#xff0c;处理器集成PS端双核ARM Cortex-A9 PL端Artix-7架构28nm可编程逻辑资源&#xff0c;评估板由核心板和评估底板组成。核心板经过专业的…

常见排序及其改进方案

常见排序及其改进方案 快速排序 思想&#xff1a; 找到一个基准&#xff0c;通常来说选取左边第一个元素 定义中间变量temp接收基准值 两个哨兵i,j分别从数组左端、右端进行扫描 (a)先从右端开始扫描&#xff1a;哨兵j先从右端开始扫描&#xff0c;确保右端元素>基准值…

Collapse折叠面板(antd-design组件库)展示所有配置选项和onChange的作用

1.Collapse折叠面板 可以折叠/展开的内容区域。 2.何时使用 对复杂区域进行分组和隐藏&#xff0c;保持页面的整洁。 手风琴 是一种特殊的折叠面板&#xff0c;只允许单个内容区域展开。 组件代码来自&#xff1a; 分页 Pagination - Ant Design 3.本地验证前的准备 参考文章【…

Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

1.简介 上一篇文章已经教你把JMeter的测试环境搭建起来了&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;一睹其芳容&#xff0c;首先我给大家介绍一下如何来创建一个测试计划&#xff08;Test Plan&#xff09;。 2.创建一个测试计划&#xff08;Test Plan&#x…

前端实现pdf,图片,word文件预览

前端实现文件预览功能 需求&#xff1a;实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能&#xff0c;建议以下的预览文件标签可以在外层包裹一层弹窗。 图片预览 iframe标签能够将…

Learning to cluster in order to transfer across domains and tasks (ICLR 2018)

Learning to cluster in order to transfer across domains and tasks (ICLR 2018) 摘要 这篇论文提出一个进行跨域/任务的迁移学除了习任务&#xff0c;并将其作为一个学习聚类的问题。除了特征&#xff0c;我们还可以迁移相似度信息&#xff0c;并且这是足以学习一个相似度…

Git的常用命令,及还原文件的指定版本,及分支管理

一.git 常用命令 1.创建一个空的Git仓库或重新初始化一个现有仓库 git init 2.执行 clone 命令默认会拉取远程仓库的所有内容 git clone 3.显示版本库和暂存区的状态 git status 4.将该文件添加到暂存区 git add . 5.将git add 之后文件在暂存区之后的提交 git commit -m 提…

【Java高级语法】(十七)Stream流式编程:释放流式编程的效率与优雅,狂肝万字只为全面讲透Stream流!~

Java高级语法详解之Stream流 1️⃣ 概念及特征2️⃣ 优势和缺点3️⃣ 使用3.1 语法3.2 常用API详解3.3 案例 4️⃣ 应用场景5️⃣ 使用技巧6️⃣ 并行流 ParallelStream&#x1f33e; 总结 1️⃣ 概念及特征 Java的Stream流是在Java 8中引入的一种用于处理集合数据的功能强大且…

chatgpt赋能python:PythonGUI编程简介

Python GUI编程简介 Python是一款功能强大的开源编程语言&#xff0c;在很多领域都有广泛的应用。与其他编程语言相比&#xff0c;Python具有易于学习、易于阅读和易于维护等优点&#xff0c;因此成为许多程序员选择的首选语言之一。Python还提供了许多各种类型的GUI库&#x…

HHU云计算期末复习(上)Google、Amazon AWS、Azure

文章目录 第一章 概论第二章 Google 云计算2.1 Google文件系统&#xff08;GFS&#xff09;2.2 MapReduce和Hadoop2.3 分布式锁服务Chubby2.4 分布式结构化数据表Bigtable存储形式主服务器子表Bigtable 相关优化技术 2.5 分布式存储系统MegastoreMegastoreACID语义基本架构核心…

圆和矩形是否有重叠

&#x1f388; 算法并不一定都是很难的题目&#xff0c;也有很多只是一些代码技巧&#xff0c;多进行一些算法题目的练习&#xff0c;可以帮助我们开阔解题思路&#xff0c;提升我们的逻辑思维能力&#xff0c;也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

Android设计模式—桥接模式

1.桥接模式 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离来解耦。它使用接口作为桥梁&#xff0c;将一个抽象类与其实现类的代码独立开来&#xff0c;从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”。 简单来讲&#xff0…

RecyclerView性能优化之异步预加载

RecyclerView性能优化之异步预加载 前言 首先需要强调的是&#xff0c;这篇文章是对我之前写的《浅谈RecyclerView的性能优化》文章的补充&#xff0c;建议大家先读完这篇文章后再来看这篇文章&#xff0c;味道更佳。 当时由于篇幅的原因&#xff0c;并没有深入展开讲解&…