机器学习——LR(线性回归)、LRC(线性回归分类)与人脸识别

article/2025/9/2 16:07:53

    忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks)

目录

系列文章目录

一、LR的概念、原理与LR用于简单数据的预测

1.LR简介

2.LR算法模型

3.LR用于简单数据的预测

二、LRC的简介与算法流程

1.LRC(线性回归分类)简介

2.LRC算法流程

三、LRC及其各种优化模型用于人脸识别

1. 数据导入与处理

2.人脸识别与分类

2.1.经典线性回归分类用于人脸识别

2.2.岭回归用于人脸识别

2.3.lasso回归用于人脸识别

2.4.分块LRC用于人脸识别

2.5 回归部分代码整合

3.多种回归在人脸识别的对比

4.新线性回归设计、实践、比较

5.其他

5.1 内部函数定义

5.2 数据集及资源

5.3 参考资料

总结


系列文章目录

本系列博客重点在机器学习的概念原理与代码实践,不包含繁琐的数学推导(有问题欢迎在评论区讨论指出,或直接私信联系我)。

代码可以全抄    大家搞懂原理与流程去复现才是有意义的!!!
第一章 机器学习——PCA(主成分分析)与人脸识别_@李忆如的博客-CSDN博客

第二章 机器学习——LDA (线性判别分析) 与人脸识别_@李忆如的博客-CSDN博客

第三章 LR(线性回归)、LRC(线性回归分类)与人脸识别


梗概

本篇博客主要介绍LR(线性回归)、LRC(线性回归分类)并将LR用于简单数据的预测,LRC及其各种优化模型(岭(脊)回归、lasso回归、分块LRC)用于人脸识别,且自行设计了一个全新的线性回归算法用于人脸识别并与经典LR做比较(内附数据集与matlab代码)


一、LR的概念、原理与LR用于简单数据的预测

1.LR简介

回归分析是指一种预测性的建模技术,主要是研究自变量和因变量的关系。LR(线性回归)为最基础的一种回归算法。用线(面)等模型对于现有相对线性的数据进行较小损失的拟合,并使拟合出的模型可较好预测数据。

最小二乘法推导详见:最优化方法——最小二乘法与梯度下降法_@李忆如的博客-CSDN博客

2.LR算法模型

经典的LR解决问题可划分为以下步骤

① 将数据集导入,进行变量的筛选与控制

② 对正态性分布的数据做散点图与相关分析

③ 通过最小化损失函数来确定参数,得到(拟合)回归方程(利用正规方程计算w 或最小二乘 或梯度下降)

④ 不断检验模型,优化参数,得到最优的回归方程

⑤ 使用回归方程做预测

图1 线性回归分析详细流程 

Tips:对线性回归数学原理、最小二乘法、梯度下降、正归方程的数学分析与推导感兴趣的详见:机器学习算法——线性回归(超级详细且通俗)_一只认真的菜狗的博客-CSDN博客_线性回归

3.LR用于简单数据的预测

① 问题描述:探究学生成绩与学生学习时间的关系

② 线性回归实现:将学习时间作为变量,成绩作为预测值,建立回归方程,并用最小二乘法最小化损失函数,得到回归方程并验证,验证后用其预测。

③ 核心代码如下:

x=[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80,63.80,73.40];
y=[41.4,51.8,61.70,67.90,68.70,77.50,95.90,137.40,155.0,175.0];
figure
plot(x,y,'r*') %作散点图(制定横纵坐标)
xlabel('x(学生学习时间)','fontsize',12)
ylabel('y(学生成绩)','fontsize',12)
set(gca,'linewidth',2)
%采用最小二乘拟合
Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0; %线性方程用于预测和拟合
hold on
plot(x,y1,'linewidth',2);
m2=LinearModel.fit(x,y); %函数进行线性回归

数据拟合后,回归模型绘图如下:

 图2 LR用于简单数据预测回归方程绘图

分析:分析上图,可看出模型对数据拟合较好,预测相对线性。如需预测不在图中的数据,只需将对应学习时间作为x代入回归模型(方程)中即可。

二、LRC的简介与算法流程

1.LRC(线性回归分类)简介

LRC:即使用LR进行分类任务(如人脸识别,给出某人脸属于哪一类人(一个人为一类))

2.LRC算法流程

① 将数据集导入并分类

② 读取每个类数据进行线性回归,划分训练集与测试集

③ 利用正规方程计算w(或最小二乘 或梯度下降),通过最小化损失函数来确定参数,得到(拟合)回归方程

Tips:此处y为对应需要分类的单个数据

④ 利用回归方程预测数据

⑤ 计算出预测数据与真实数据的距离(损失),并将最小距离对应类别作为预测类别输出

三、LRC及其各种优化模型用于人脸识别

1. 数据导入与处理

利用imread批量导入人脸数据库,或直接load相应mat文件,并在导入时不断将人脸拉成一个个列向量组成reshaped_faces,并取出n%作为测试数据,剩下100-n%作为训练数据,重复此步骤,将导入数据抽象成框架,可以匹配不同数据集的导入(本实验框架适配ORL、AR、FERET数据集)。

Tips:代码可见笔者上一篇文章(LDA与人脸识别),基本一致。

2.人脸识别与分类

Tips:前四部分讲述LRC及其优化模型的算法流程、核心流程、分析,完整代码整合见第五部分。

2.1.经典线性回归分类用于人脸识别

算法流程:与二.2中的算法流程类似,将数据集导入并分类,读取每个类数据进行线性回归,划分训练集与测试集,利用正规方程计算w,预测数据后计算出预测数据与真实数据的距离,并将最小距离对应类别作为预测类别,并与测试集对应的标签作比较,检测(识别)分类是否正确,并得出正确率。

② 核心代码:

 % 1.线性回归w = inv(train_data' * train_data) * train_data' * totest;img_predict = train_data * w; % 计算预测图片% 分类、预测过程(各种分类都类似)   % show_face(img_predict,row,column); %预测人脸展示dis = img_predict - totest; % 计算误差distest = [distest,norm(dis)]; % 计算欧氏距离% 取出误差最小的预测图片 并找到他对应的标签 作为预测结果输出end[min_dis,label_index] = min(distest); % 找到最小欧氏距离下标(预测类)if label_index == totest_indexcount_right = count_right + 1;else  fprintf("预测错误:%d\n" ,(i + 1) * (k - train_num_each));endend

③ 分析:w的计算(最小化损失函数得最优参数)、计算预测图片的方法差异造就了不同方法。其中,对于数据的过拟合、关键矩阵不可逆现象,引入岭回归与lasso回归;对于数据遮挡问题,引入分块LRC。

2.2.岭回归用于人脸识别

① 算法核心:对经典线性回归加入L2正则化(得到稠密解)

② 核心代码:

  % 2.岭回归rr_data = (train_data' * train_data) + eye(train_num_each)*10^-6;w = inv(rr_data) * train_data' * totest;img_predict = train_data * w; % 计算预测图片

分析:通过正则化扰动,有效地避免了过拟合严重或各变量之间存在多重共线性的问题。

2.3.lasso回归用于人脸识别

① 算法核心:对经典线性回归加入L1正则化(得到稀疏解)

② 核心代码:

         % 3.lasso回归[B,FitInfo] = lasso(train_data , totest);img_predict = train_data * B + FitInfo.Intercept;

Tips:此处使用matlab库中的lasso回归,更详细自定义lasso回归实现与分析见:建模算法系列十九:lasso回归推导附MATLAB源码 - 知乎 (zhihu.com)

分析:一般来说,对于高维的特征数据,尤其线性关系是稀疏的,我们会采用Lasso回归。或者要在一堆特征里面找出主要的特征,那Lasso回归更是首选。

2.4.分块LRC用于人脸识别

① 算法核心:把数据库中每个数据分成M块(本实验将人脸均分四块),对数据中的每块进行LRC,在同一数据的M块min_dis中选出最小值,其对应的块作为分类依据,给出预测分类结果(或使用投票法选出同一数据M块中出现最多的预测分类结果)。

② 核心代码:

%%数据导入部分进行分块(不同分块规则大大影响实验效果,此处以均分四块为例)  
for i=1:40    for j=1:10       if(i<10)a=imread(strcat('C:\Users\hp\Desktop\face\ORL56_46\orl',num2str(i),'_',num2str(j),'.bmp'));     elsea=imread(strcat('C:\Users\hp\Desktop\face\ORL56_46\orl',num2str(i),'_',num2str(j),'.bmp'));  enda = double(a);a = mat2cell(a,[row/2,row/2],[column/2,column/2]);a1 = a{1};a2 = a{2};a3 = a{3};a4 = a{4};b1 = reshape(a1,row * column / 4,1);b1=double(b1);b2 = reshape(a2,row * column / 4,1);b2=double(b2);b3 = reshape(a3,row * column / 4,1);b3=double(b3);b4 = reshape(a4,row * column / 4,1);b4=double(b4);reshaped_faces=[reshaped_faces, b1,b2,b3,b4]; endend

③ 分析:分块线性回归是处理遮挡图像识别的一个有效方法。

2.5 回归部分代码整合

% 回归过程
dimension = row * column;
count_right = 0;for i = 0:1:people_num - 1totest_index = i + 1; %取出图片对应标签%对每一类进行一次线性回归for k = train_num_each + 1:1:pic_num_of_eachtotest = reshaped_faces(:,i*pic_num_of_each + k); %取出每一待识别(分类)人脸distest = []; %记录距离for j = 0:1:people_num - 1batch_faces = reshaped_faces(:,j * pic_num_of_each + 1 :j * pic_num_of_each + pic_num_of_each); %取出每一类图片% 划分训练集与测试集%第一次  batch中的前train_num_each个数据作为训练集 后面数据作为测试集合train_data = batch_faces(:,1:train_num_each);test_data = batch_faces(:,train_num_each + 1:pic_num_of_each);% 1.线性回归w = inv(train_data' * train_data) * train_data' * totest;img_predict = train_data * w; % 计算预测图片           % 2.岭回归
%        rr_data = (train_data' * train_data) + eye(train_num_each)*10^-6;
%        w = inv(rr_data) * train_data' * totest;
%        img_predict = train_data * w; % 计算预测图片% 3.lasso回归
%        [B,FitInfo] = lasso(train_data , totest);
%        img_predict = train_data * B + FitInfo.Intercept;% 4.权重线性回归(代码有误)
%        W = eye(dimension);
%        kk = 10^-1;
%            for jj = 1:1:dimension
%               diff_data = reshaped_faces(j+1,:) - reshaped_faces(jj,:);
%               W(jj,jj) = exp((diff_data * diff_data')/(-2.0 * kk^2));
%            end
%            w = inv(train_data' * W * train_data) * train_data' * W * totest;% 5.新线性回归(已提前PCA降维)
%           rr_data = (train_data' * train_data) +
%           eye(train_num_each)*10^-6; 
%           w = inv(rr_data) * train_data' * test_data; % 改良w
%           img_predict = train_data * w; % 计算预测图片% show_face(img_predict,row,column); %预测人脸展示dis = img_predict - totest; % 计算误差distest = [distest,norm(dis)]; % 计算欧氏距离% 取出误差最小的预测图片 并找到他对应的标签 作为预测结果输出end[min_dis,label_index] = min(distest); % 找到最小欧氏距离下标(预测类)if label_index == totest_indexcount_right = count_right + 1;else  fprintf("预测错误:%d\n" ,(i + 1) * (k - train_num_each));endendend
recognition_rate = count_right / test_sum; 

3.多种回归在人脸识别的对比

所用数据集:ORL5646、AR5040、FERET_80

分别在不同数据集中使用经典线性回归、岭回归、lasso回归、分块线性回归进行人脸识别分类,人脸识别率对比如下:

表1 不同回归在不同数据集下的人脸识别率

Tips:表中括号内数字为一类人脸训练,测试数量

 图3 不同回归在不同数据集下的人脸识别率

分析:对上图及上表进行分析,可以得到以下几个结论

a.上述三个数据集中,经典线性回归人脸识别率与岭回归相同。这是由于将一个个人脸拉成列向量,train’ * train的维度较小,矩阵运算不存在奇异值,逆矩阵可逆。

b.上述三个数据集中,lasso回归人脸识别率高于经典线性回归。

c.上述三个数据集中,简单线性回归均优于分块线性回归。这是由于分块逻辑导致的(本实验将人脸均分四块),且使用数据集基本无遮挡,分块线性回归优势不能体现。

4.新线性回归设计、实践、比较

① 经典线性回归缺点:数据规模过大、过拟合严重、各变量之间存在多重共线性、正规方程计算对类内局部结构考虑不够

② 新线性回归设计:在数据预处理时使用PCA降维,对数据压缩。在最小化损失函数的过程中加入L2正则化(岭回归思想),避免过拟合严重、各变量之间存在多重共线性问题,并在正规方程的w运算时使用整个类的测试集而非单一图片,保留一定类内结构。

③ 新线性回归正规方程及核心代码

如②设计,正规方程则变为以下形式:

核心代码如下:

Tips:PCA降维详见完整代码,或参考笔者第一篇文章(PCA与人脸识别)。

         % 5.新线性回归(已提前PCA降维)rr_data = (train_data' * train_data) +eye(train_num_each)*10^-6; w = inv(rr_data) * train_data' * test_data; % 改良wimg_predict = train_data * w; % 计算预测图片

 表2 新老线性回归在不同数据集下的人脸识别率

 Tips:表中括号内数字为一类人脸训练,测试数量

  图4 新老线性回归在不同数据集下的人脸识别率

分析:对上图及上表进行分析,在ORL与FERET中,新线性回归的人脸识别率高于经典线性回归,在AR中相差无几。由此验证了新线性回归的可行性与正确性,且验证了新线性回归相对线性回归的优越性。

5.其他

5.1 内部函数定义

本实验中将人脸图像展示抽象为函数,函数定义如下:

% 输入向量,显示脸
function fig = show_face(vector, row, column)fig = imshow(mat2gray(reshape(vector, [row, column])));
end

5.2 数据集及资源

本实验所用数据集:ORL5646、AR5040、FERET_80,代码框架可适用多个数据集。

常用人脸数据集如下(不要白嫖哈哈哈)

链接:https://pan.baidu.com/s/12Le0mKEquGMgh5fhNagZGw 
提取码:yrnb

LR、LRC完整代码:李忆如/忆如的机器学习 - Gitee.com

5.3 参考资料

1.赖志辉的课

2.线性回归分析思路总结!简单易懂又全面! - 知乎 (zhihu.com)

3.线性回归实现人脸识别——ORL数据集_HeiGe__的博客-CSDN博客_orl人脸数据集

4.周志华《机器学习》


总结

LR作为经典且最基础的回归分析方法,对于线性数据的拟合与预测过程简单,效果优秀,LRC及其多种优化模型在数据分类的任务中也表现优异。且作为一种有监督学习方法(利用了数据的原有信息),LR能得到较好的保留数据信息用于分类。但LR仍存在对异常值很敏感、容易造就过拟合模型、不好刻画非线性问题等等,从而影响实验结果,LR的一些优化模型解决了部分不足,后续博客会分析其他算法优化或解决其他问题。


http://chatgpt.dhexx.cn/article/tKUecbMC.shtml

相关文章

Toad:基于 Python 的标准化评分卡模型

大家好&#xff0c;我是东哥。 在信贷的风控模型中最常用、最经典的可能要属评分卡了&#xff0c;所谓评分卡就是给信贷客户进行打分&#xff0c;按照不同业务场景可为贷前、贷中、贷后和反欺诈&#xff0c;一般叫做ABCF卡。模型得到分数&#xff0c;通过设置cutoff阈值给出评…

LGB+LR的实践

文章目录 1 背景2 原理3 数据的准备3.1 读入数据3.2 切分训练集测试集 4 LR5 LGB6 LGBLR6.1 LGB实现6.2 LGB的vector导出来&#xff01;6.2.1 训练集6.2.2 测试集 6.3 LRLGB 7 结果对比 1 背景 相信大名鼎鼎的GBDTLR组合很多小伙伴都听过&#xff0c;这种组合模型的预测效果要…

[机器学习] LR与SVM的异同

1 为什么将LR和SVM放在一起来进行比较&#xff1f; 回答这个问题其实就是回答LR和SVM有什么相同点。 第一&#xff0c;LR和SVM都是分类算法。 看到这里很多人就不会认同了&#xff0c;因为在很大一部分人眼里&#xff0c;LR是回归算法。我是非常不赞同这一点的&#xff0c;因…

pytorch:多标签分类的损失函数和准确率计算

1 损失函数 我们先用sklearn生成一个多标签分类数据集。 from sklearn.datasets import make_multilabel_classificationX, y make_multilabel_classification(n_samples1000,n_features10,n_classes3,n_labels2,random_state1) print(X.shape, y.shape)看一下标签长啥样。 …

caffe训练分类模型教程

caffe训练分类模型教程 1.已有图像存放在train和val下&#xff0c;book和not-book&#xff08;两类&#xff09;的图片数量相同 在caffe/data下新建一個myself文件夾&#xff0c;并新建两个文件夹分别命名为train和val 批量重命名图片 # -*- coding:utf8 -*- import os class …

金融风控实战——模型融合

过采样方法使用条件 &#xff08;1&#xff09;负样本可以代表样本空间 &#xff08;2&#xff09;数据是足够干净的&#xff08;样本、特征没有噪声&#xff09; 过拟合 &#xff08;1&#xff09;增多数据 &#xff08;2&#xff09;特征筛选 &#xff08;3&#xff09;调参…

【推荐算法】ctr预估模型总结(LR、FM、FFM、NFM、AFM、WDL、DCN、DeepFM、FwFM、FLEN)

文章目录 前言LRPOLY2FM&#xff08;Factorization Machine&#xff09;FFM&#xff08;Field-aware Factorization Machine&#xff09;AFM&#xff08;Attention Factorization Machine&#xff09;NFM&#xff08;Neural Factorization Machine&#xff09;WDL&#xff08;w…

概率图模型 —— 串连 NB、LR、MEM、HMM、CRF

概率图模型&#xff08;PGM&#xff09;&#xff0c;作为机器学习的重要分支&#xff0c;能串连起很多传统模型&#xff0c;比如 NB、LR、MEM、HMM、CRF、DBN 等。本篇文章&#xff0c;从串连多个模型的角度&#xff0c;来谈谈 PGM&#xff0c;顺便把这些模型回顾下。 1 Why PG…

基于GBDT+LR模型的深度学习推荐算法

GBDTLR算法最早是由Facebook在2014年提出的一个推荐算法&#xff0c;该算法分两部分构成&#xff0c;第一部分是GBDT&#xff0c;另一部分是LR.下面先介绍GBDT算法&#xff0c;然后介绍如何将GBDT和LR算法融合 1.1 GBDT算法 GBDT的全称是 Gradient Boosting Decision Tree&am…

Logistic逻辑回归模型(LR)基础

逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上&#xff0c;套用了一个逻辑函数&#xff0c;但也就由于这个逻辑函数&#xff0c;使得逻辑回归模型成为了机器学习领域一颗耀眼的明星&#xff0c;更是计算广告学的核心。本文主要详述逻辑回归模型的基础&#x…

模型压缩一-知识蒸馏

一、知识蒸馏简介 知识蒸馏是模型压缩方法中的一个大类&#xff0c;是一种基于“教师-学生网络&#xff08;teacher-student-network&#xff09;思想”的训练方法&#xff0c; 其主要思想是拟合教师模型&#xff08;teacher-model&#xff09;的泛化性等&#xff08;如输出概率…

推荐系统之GBDT+LR

前言 前面讲过的FM与FFM模型虽然增强了模型的交叉能力&#xff0c;但是不管怎样都只能做二阶的交叉&#xff0c;如果想要继续加大特征交叉的维度&#xff0c;那就会出大计算爆炸的情况。所以Facebook提出了梯度提升树&#xff08;GBDT&#xff09;逻辑回归&#xff08;LR&…

使用Keras进行单模型多标签分类

原文&#xff1a;https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/ 作者&#xff1a;Adrian Rosebrock 时间&#xff1a;2018年5月7日 源码&#xff1a;https://pan.baidu.com/s/1x7waggprAHQDjalkA-ctvg &#xff08;wa61&#xff09; 译者&…

LR模型常见问题小议

&#xfeff;&#xfeff; LR模型常见问题小议 标签&#xff1a; LR机器学习 2016-01-10 23:33 671人阅读 评论(0) 收藏 举报 本文章已收录于&#xff1a; 分类&#xff1a; 机器学习&#xff08;10&#xff09; 作者同类文章 X 版权声明&#xff1a;本文为博主原创文章&…

信用评分卡(A卡) 基于LR模型的数据处理及建模过程

数据来自&#xff1a;魔镜杯风控算法大赛&#xff08;拍拍贷&#xff09;。有关数据的具体描述可以看比赛页面。 0. 数据集的关键字段及描述&#xff1a; Master&#xff1a;每一行代表一个样本&#xff08;一笔成功成交借款&#xff09;&#xff0c;每个样本包含200多个各类…

机器分类---LR分类+模型评估

文章目录 数据集ROC曲线与AUC理论知识曲线理解实例计算 代码 更详细的数据集介绍&#xff08;有图形分析&#xff0c;应该比较好理解&#xff09; https://blog.csdn.net/weixin_42567027/article/details/107416002 数据集 数据集有三个类别&#xff0c;每个类别有50个样本。…

python机器学习算法(赵志勇)学习笔记( Logistic Regression,LR模型)

Logistic Regression(逻辑回归) 分类算法是典型的监督学习,分类算法通过对训练样本的学习,得到从样本特征到样本的标签之间的映射关系,也被称为假设函数,之后可利用该假设函数对新数据进行分类。 通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数,Log…

推荐系统实战中LR模型训练(二)

背景&#xff1a; 上一篇推荐系统实战中LR模型训练&#xff08;一&#xff09; 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分&#xff0c;即将文本数据数值化为稀疏矩阵的形式。 文本数据&#xff1a; 稀疏矩阵&#xff1a; 实现过程&#xff1a; 文本数据格…

机器学习 | LR逻辑回归模型

逻辑回归(Logistic Regression,简称LR)名为“回归”却是用来分类工作、在线性数据上表现优异的分类器。 视频教程:第07讲:逻辑回归是线性分类器的佼佼者 LR是数据挖掘领域常用的一种分类模型,常用于解决二分类问题,例如垃圾邮件判定、经济预测、疾病诊断(通过年龄、性…

推荐系统实战中LR模型训练(一)

背景&#xff1a; 在“批量导入数据到Redis” 中已经介绍了将得到的itema item1:score1,item2:score2…批量导入到Redis数据库中。本文的工作是运用机器学习LR技术&#xff0c;抽取相应的特征&#xff0c;进行点击率的估计。 点击率&#xff08;Click-Through-Rate, CTR&#…