【ML实验7】人脸识别综合项目(PCA、多分类SVM)

news2024/11/20 8:44:40

实验代码获取 github repo
山东大学机器学习课程资源索引


实验目的在这里插入图片描述

实验环境

在这里插入图片描述

实验内容

在这里插入图片描述
在这里插入图片描述

PCA

两种方法EVD-PCA和SVD-PCA的实现、效率对比见我之前的博客一个PCA加速技巧,这里补充SVD方法的数学推导

首先,设方阵 A A A的特征值分解为 A = U Σ U T A=U\Sigma U^T A=UΣUT
对于矩阵 A A A尝试构建一种分解
A = U Σ V T A=U\Sigma V^T A=UΣVT
其中 U T U = I , V T V = I U^TU=I,V^TV=I UTU=I,VTV=I
效仿特征值分解,构造方阵 A T A A^TA ATA A A T AA^T AAT
A T A = ( U Σ V T ) T U Σ V T = V Σ U T U Σ V T = V Σ 1 2 V T A^TA=(U\Sigma V^T)^TU\Sigma V^T=V\Sigma U^TU\Sigma V^T=V\Sigma_1^2V^T ATA=(UΣVT)TUΣVT=VΣUTUΣVT=VΣ12VT
这里我们得到了方阵 A T A A^TA ATA的特征值分解!因此,对 A T A A^TA ATA进行特征值分解就可以得到 V V V.
同理, A A T = U Σ 2 2 U T AA^T=U\Sigma_2^2U^T AAT=UΣ22UT,对 A A T AA^T AAT进行特征值分解就可以得到 U U U.

下面证明对角矩阵 Σ 1 \Sigma_1 Σ1 Σ 2 \Sigma_2 Σ2中的非零值相等。
设线性方程组 A x = 0 Ax=0 Ax=0,左乘 A T A^T AT A T A x = 0 A^TAx=0 ATAx=0,因此 A x = 0 Ax=0 Ax=0的解也是 A T A x = 0 A^TAx=0 ATAx=0的解。
对于 A T A x = 0 A^TAx=0 ATAx=0,左乘 x T x^T xT x T A T A x = 0 ⟹ ( A x ) T ( A x ) = 0 ⟹ A x = 0 x^TA^TAx=0\Longrightarrow(Ax)^T(Ax)=0\Longrightarrow Ax=0 xTATAx=0(Ax)T(Ax)=0Ax=0,即反过来 A T A x = 0 A^TAx=0 ATAx=0的解也是 A x = 0 Ax=0 Ax=0的解。
综上, A x = 0 Ax=0 Ax=0 A T A x = 0 A^TAx=0 ATAx=0有相同的解空间,可得 r ( A ) = r ( A T A ) r(A)=r(A^TA) r(A)=r(ATA),又有 r ( A ) = r ( A T ) r(A)=r(A^T) r(A)=r(AT),因此
r ( A A T ) = r ( A T ) = r ( A ) = r ( A T A ) r(AA^T)=r(A^T)=r(A)=r(A^TA) r(AAT)=r(AT)=r(A)=r(ATA)
即矩阵 A T A A^TA ATA A A T AA^T AAT同秩。
x x x A T A A^TA ATA对应特征值 λ \lambda λ的特征向量,所以有 A T A x = λ x A^TAx=\lambda x ATAx=λx,两边同乘 A A A,得 A A T A x = λ A x AA^TAx=\lambda Ax AATAx=λAx A A T ( A x ) = λ ( A x ) AA^T(Ax)=\lambda (Ax) AAT(Ax)=λ(Ax),因此矩阵 A T A A^TA ATA A A T AA^T AAT的非零特征值相等。

而且可以得到特征值为奇异值的平方, λ i = σ i 2 \lambda_i=\sigma_i^2 λi=σi2.

在这里插入图片描述
利用 A A T AA^T AAT的分解构建对 A T A A^TA ATA的分解
矩阵 A A A的奇异值分解为 A = U Σ V T A=U\Sigma V^T A=UΣVT,两边乘 V V V,得到 A V = U Σ AV=U\Sigma AV=UΣ,每一列有 A v i = σ i u i Av_i=\sigma_iu_i Avi=σiui,即
u i = A v i λ i u_i=\frac{Av_i}{\sqrt{\lambda_i}} ui=λi Avi
其中, v i v_i vi λ i \lambda_i λi可由对 A T A A^TA ATA的分解得到。
反之同样可行。

多分类模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
code

function [corrRate, misclass] = ovoMultiClassModel(trainData, testData, classNum, K, trainNum)
    fprintf('Running one vs one multiclass model...\n');
    %% Step 1: Assign label
    testNum = 10 - trainNum;
    N = classNum * (classNum - 1) / 2;
    trainPart = cell(N, 1); 
%     testPart = cell(N, 1);
    cnt = 1;
    map = zeros(N, 2);  % 第cnt个二分类器的对抗分类类别i,j
    
    for i = 1 : (classNum - 1)
        for j = (i + 1) : classNum
            trainPart{cnt, 1} = [[trainData((i - 1) * trainNum + 1 : i * trainNum, :), ones(trainNum, 1)]; ...
                [trainData((j - 1) * trainNum + 1 : j * trainNum, :), -ones(trainNum, 1)]];
%             testPart{cnt, 1} = [[testData((i - 1) * testNum + 1 : i * testNum, :), ones(testNum, 1)]; ...
%                 [testData((j - 1) * testNum + 1 : j * testNum, :), -ones(testNum, 1)]];
            map(cnt, 1) = i; map(cnt, 2) = j;
            cnt = cnt + 1;
        end
    end
%     save('trainPart.mat', 'trainPart');
    
    %% Step 2: Train SVM
    A = zeros(N, 2 * trainNum); % ? num(alpha)=2*trainNum
    W = zeros(N, size(trainData, 2));   % N×K
    B = zeros(N, 1);
    for i = 1 : N
        SVMObj = mySVM(trainPart{i, 1}(:, (1 : K)), trainPart{i, 1}(:, K + 1), 1);
        A(i, :) = SVMObj.alpha';
        W(i, :) = SVMObj.w';
        B(i) = SVMObj.b;
    end
    
    %% Step 3: Test classifying
    % SVM函数输出值
    totalTest = size(testData, 1);
    val = zeros(totalTest, N);
    for i = 1 : N
        val(:, i) = (testData * W(i, :)')' + B(i);
        % (?×1)=((?×K)*(1×K)')'+(?×1),其中?为测试数据个数(totalTest)
    end
    % 第i类别参与(40×39/2)个二分类SVM中的39个
    part = zeros(classNum, classNum - 1);
    for i = 1 : classNum
        part(i, :) = find(map(:, 1) == i | map(:, 2) == i);
    end
    % f(x)=arg max_{s}∑_{t}f_{s,t}(x)
    %% A. 一对一SVM分类器结果
    res = zeros(totalTest, 1);
    for i = 1 : totalTest    % 对所有测试数据
        voteCnt = zeros(classNum, 1);
        for j = 1 : classNum    % 对所有可能分类
            for k = 1 : classNum - 1
                if val(i, part(j, k)) > 0 && map(part(j, k), 1) == j
                    voteCnt(j) = voteCnt(j) + 1;
                elseif val(i, part(j, k)) < 0 && map(part(j, k), 2) == j
                    voteCnt(j) = voteCnt(j) + 1;
                end
            end
        end
        [~, maxOne] = max(voteCnt);
        res(i) = maxOne;
    end
    %% B. 标准结果
    std = zeros(totalTest, 1);
    for i = 1 : classNum
        std((i - 1) * testNum + 1 : i * testNum) = i;
    end
    %% C. 对比统计
    corrSet = find(res == std);
    corrRate = length(corrSet) / totalTest;
    misclass = cell(1, 1);
    misclass{1} = [std, res];
    fprintf('one vs one multiclass done\n');
end

SVM训练器

在这里插入图片描述
code

function SVMObj = mySVM(x, y, C)
    m = size(x, 1);
    % !err:length=max(size(X)),返回数组最大维度长度
    
    options = optimset;
    options.largeScale = 'off';
    options.Display = 'off';
    
    %% A. 构建目标函数
    H = zeros(m);
    for i = 1 : m
        for j = 1 : m
            H(i, j) = y(i) * y (j) * x(i, :) * x(j, :)';
        end
    end
    f = (-1) * ones(m, 1);
    
    %% B. 构建约束
    Aeq = y';
    beq = 0;
    lb = zeros(m, 1);
    ub = zeros(m, 1);
    ub(:) = C;
    a0 = zeros(m, 1);   % 迭代初始值
    
    %% C. 利用quadprog求解器求解对偶问题
    % quadprog(H,f,A,b,Aeq,beq,lb,ub)
    [alpha, fval] = quadprog(H, f, [], [], Aeq, beq, lb, ub, a0, options);
    
    %% D. 求support vector
    alpha(find(alpha < 1e-8)) = 0;
    sv = find(alpha > 0 & alpha < C);
    w = 0;  % omega
    for i = 1 : length(sv)
        w = w + alpha(sv(i)) * y(sv(i)) * x (sv(i), :)';
    end
    num = y - x * w;
    b = sum(num(sv)) / length(sv);
    
    %% 构建返回对象SVMObj
    SVMObj.alpha = alpha;   % alpha(sv)
    SVMObj.w = w;
    SVMObj.b = b;
end

实验结果

在这里插入图片描述
在这里插入图片描述

conclusion

在这里插入图片描述

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

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

相关文章

ZKP应用:石头剪刀布游戏

1. 引言 开源代码见&#xff1a; https://github.com/spalladino/zkp-tests 对比了分别使用&#xff1a; Iden3团队的circom语言&#xff08;易于学习ZKP&#xff09;ZCash团队的Halo2框架Aztec团队的Noir语言&#xff08;最友好&#xff09; 编写石头剪刀布游戏的ZKP证明…

IPv6(计算机网络-网络层)

目录 IPv6 的特点 IPv6 数据报的格式 IPv6 分组的格式 IPv6 的扩展首部 从计算机本身发展以及从互联网规模和网络传输速率来看&#xff0c;现在 IPv4已很不适用。 要解决 IP 地址耗尽的问题的措施&#xff1a; 采用无类别编址 CIDR&#xff0c;使 IP 地址的分配更加合理…

MySQL 锁机制

文章目录MySQL 锁机制表锁读锁场景一场景二场景三总结写锁场景一场景二场景三总结行锁场景一场景二总结间隙锁缺点如何锁定一行MySQL 锁机制 表锁 读锁 查看哪些表被加锁了 语法&#xff1a;show open tables 添加读锁 read 读锁关键字 | write 写锁关键字 语法&#xff1a;l…

qt下采用libcurl实现ftp与tftp功能,提供源代码程序

一、FTP简介 FTP&#xff08;文件传输协议&#xff09;&#xff0c;工作在应用层&#xff0c;是用于在网络上进行文件传输的一套标准协议。它使用 TCP 传输&#xff0c;客户在和服务器建立连接前要经过一个“三次握手”的过程&#xff0c; 保证客户与服务器之间的连接是可靠的&…

基于xml的自动装配之byName

基于xml的自动装配之byName 自动装配方式&#xff1a;byName byName&#xff1a;将自动装配的属性的属性名&#xff0c;作为bean的id在IOC容器中匹配相对应的bean进行赋值总结&#xff1a;当类型匹配的 bean 有多个时&#xff0c;此时可以使用 byName 实现自动装配 配置bean &…

02:损失函数总结

目录 nn.L1Loss: nn.NLLLoss: nn.MSELoss: nn.CrossEntropyLoss: 损失函数是用来估量模型的预测值与真实值的不一致程度&#xff0c;它是一个非负实值函数。我们训练模型的过程&#xff0c;就是通过不断的迭代计算&#xff0c;使用梯度下降的优化算法&#xff0c;使得损失函…

多叉树 [数据结构与算法][Java]

多叉树 在二叉树中每个结点只能有一个数据项, 并且最多有两个子节点, 如果允许每个结点可以有更多的数据项和更多的子节点, 那么就是多叉树 多叉树: multiway tree 那么我们为什么要提出多叉树? 因为二叉树有一定的问题: 即使二叉树的操作效率高, 但是也存在问题: 二叉树需…

django之前后端不分离的操作(增删改查)

背景&#xff1a; demo采用的是前后端不分离的操作&#xff0c;用Bootstrap作为前段页面框架使用 1.先说模板之间的继承&#xff08;针对HTML来讲&#xff09; 父模板中编写好公共代码块&#xff0c;例如一个网站的导航和footer部分 在内容部分注明 {%block content%} {%e…

53 记一次自定义 classloader 导致的 metadataspace OOM

前言 这是最近 flink 集群上面暴露出现的一个问题 具体的细节原因 就是 flink 上面提交任务的时候, 自定义的 classloader 加载 driver.jar 然后导致 metaspace OOM 由于这边的 TaskManager metadataspace 配置相对较小(MaxMetaspaceSize配置为96M), 然后导致 出现了 metada…

BUUCTF Misc [SUCTF2018]single dog 我吃三明治 sqltest [SWPU2019]你有没有好好看网课?

[SUCTF2018]single dog 下载文件 使用kali的binwalk工具分析 进行文件分离 解压其中的压缩包&#xff0c;得到1.txt 看内容应该是js加密后的结果&#xff0c;复制到AAEncode在线解密网站 得到flag flag{happy double eleven} 我吃三明治 下载文件 使用010 eito…

AICodeHelper - AI编程助手

AICodeHelper是一款AI编程助手&#xff0c;旨在帮助程序员提高他们的编码技能。 简单的像尝试的代码直接问就行&#xff0c;但是一些复杂的&#xff0c;就得需要写技巧&#xff1b; 下面是几个使用的小技巧&#xff1a;链接是&#xff1a;AICodeHelper 1.可以使用中文提问&a…

深度学习Faster-RCNN网络

目录1 网络工作流程1.1 数据加载1.2 模型加载1.3 模型预测过程1.3.1 RPN获取候选区域1.3.2 FastRCNN进行目标检测2 模型结构详解2.1 backbone2.2 RPN网络2.2.1 anchors2.2.2 RPN分类2.2.3 RPN回归2.2.4 Proposal层2.4 ROIPooling2.5 目标分类与回归3 FasterRCNN的训练3.1 RPN网…

Yolov5移植树莓派实现目标检测

Hallo&#xff0c;大家好啊&#xff01;之前写了几篇Yolov5相关项目的博客&#xff0c;然后学习了树莓派之后&#xff0c;更新了几篇树莓派的博客&#xff0c;我的最终目的是将Yolov5移植到树莓派&#xff0c;通过树莓派上面的摄像头实现目标检测。你想啊&#xff0c;在工厂里面…

【word文档使用方法记录】论文格式修改

word文档使用方法记录**去掉文档都以也封面的页眉&#xff1a;****WPS公式居中&#xff0c;公式号右对齐**为论文每个章节设置不同的页眉去掉文档都以也封面的页眉&#xff1a; 将光标定位在第一页页尾&#xff0c;进入“页面布局”选项卡&#xff0c;点击“分隔符”&#xff…

【MySQL数据库入门】:数据库基础和基本操作

文章目录1. 数据库基础1.1 什么是数据库1.2 主流数据库1.3 如何配置环境1.4 链接数据库1.5服务器&#xff0c;数据库&#xff0c;表关系2.基本的数据库操作3.MySQL架构4.SQL分类5.存储引擎5.1查看存储引擎5.2 存储引擎对比6.总结1. 数据库基础 1.1 什么是数据库 存储数据用文…

安装包UI美化之路-在线安装包

在一些安装场景中&#xff0c;由于完整的安装包很大&#xff0c;下载时间长&#xff0c;且下载后需要人工干预来进行安装&#xff0c;这样会一定程度的降低用户使用体验&#xff1b;nsNiuniuSkin安装包制作解决方案提供了一种在线版本的安装包&#xff0c;支持将实际要安装的内…

C++中delete 和 delete []的真正区别

1.我们通常从教科书上看到这样的说明&#xff1a; delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么&#xff0c;按照教科书的理解&#xff0c;我们看下下面的代码&#xff1a; int *a new int[10]; delete a; //方…

Java | 详解 Java连接MySQL、编写JdbcUtils工具类、使用数据库连接池、使用JavaTemplate

一、连接mysql数据库 步骤&#xff1a; 1、启动 MySQL &#xff1a;以管理员身份打开 cmd 命令行&#xff0c;输入 net start mysql 2、在 MySQL 创建一张表&#xff0c;用于后面的操作。我这里创建了一张 user 表&#xff0c;有id、name、password三个字段。 3、导入jar包 (1)…

【总结】最系统化的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年12月)...

欢迎大家关注有三AI的计算机视觉课程系列&#xff0c;我们的课程系列共分为5层境界&#xff0c;内容和学习路线图如下&#xff1a;第1层&#xff1a;掌握学习算法必要的预备知识&#xff0c;包括Python编程&#xff0c;深度学习基础&#xff0c;数据使用&#xff0c;框架使用等…

基于xml的自动装配之byType

基于xml的自动装配之byType 使用bean标签的autowire属性设置自动装配效果 自动装配方式&#xff1a;byType byType&#xff1a;根据要赋值的属性的类型&#xff0c;在IOC容器中匹配某个兼容类型的bean&#xff0c;为属性自动赋值 若在IOC中&#xff0c;没有任何一个兼容类型的b…