主成分分析(PCA)和线性判别分析(LDA)原理简介_kuweicai的博客-程序员ITS301_lda要求变量间具有相关性

技术标签: 主成分分析  LDA  人脸识别  数字图像处理基础  原理  PCA  应用  

本文整理自下面的博客,对PCA和LDA的原理进行介绍,并对比了其不同点。

1).主成分分析(PCA)原理详解

2).线性判别分析LDA与主成分分析PCA

3). PCA(主成成分分析)和LDA(线性判别分析)详解-共性和区别

4).什么时候使用PCA和LDA?

5).PCA的数学原理

6).Dimensionality Reduction——LDA线性判别分析原理篇

7).主成分分析(PCA)原理总结

8). 奇异值分解(SVD)原理与在降维中的应用

9). PCA算法的详细数学推导
(如果想要详细了解其数学原理的推导推荐阅读7和8这两篇文章, 文章 9 特别对于 PCA 的推导过程十分清晰)

 

一、PCA简介

1. 相关背景

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律。多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上增加了数据采集的工作量,更重要的是在多数情况下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性,同时对分析带来不便。如果分别对每个指标进行分析,分析往往是孤立的,而不是综合的。盲目减少指标会损失很多信息,容易产生错误的结论。

因此需要找到一个合理的方法,在减少需要分析的指标的同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量间存在一定的相关关系,因此有可能用较少的综合指标分别综合存在于各变量中的各类信息。主成分分析与因子分析就属于这类降维的方法。

2. 问题描述

下表1是某些学生的语文、数学、物理、化学成绩统计:

       首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系。那么一眼就能看出来,数学、物理、化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数学成绩拉的最开)。为什么一眼能看出来?因为坐标轴选对了!下面再看一组学生的数学、物理、化学、语文、历史、英语成绩统计,见表2,还能不能一眼看出来:

数据太多了,以至于看起来有些凌乱!也就是说,无法直接看出这组数据的主成分,因为在坐标系下这组数据分布的很散乱。究其原因,是因为无法拨开遮住肉眼的迷雾~如果把这些数据在相应的空间中表示出来,也许你就能换一个观察角度找出主成分。如下图1所示:

      但是,对于更高维的数据,能想象其分布吗?就算能描述分布,如何精确地找到这些主成分的轴?如何衡量你提取的主成分到底占了整个数据的多少信息?所以,我们就要用到主成分分析的处理方法。

3. 数据降维

为了说明什么是数据的主成分,先从数据降维说起。数据降维是怎么回事儿?假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标系x,y,z这三个轴来表示这组数据的话,需要使用三个维度,而事实上,这些点的分布仅仅是在一个二维的平面上,那么,问题出在哪里?如果你再仔细想想,能不能把x,y,z坐标系旋转一下,使数据所在平面与x,y平面重合?这就对了!如果把旋转后的坐标系记为x’,y’,z’,那么这组数据的表示只用x’和y’两个维度表示即可!当然了,如果想恢复原来的表示方式,那就得把这两个坐标之间的变换矩阵存下来。这样就能把数据维度降下来了!但是,我们要看到这个过程的本质,如果把这些数据按行或者按列排成一个矩阵,那么这个矩阵的秩就是2!这些数据之间是有相关性的,这些数据构成的过原点的向量的最大线性无关组包含2个向量,这就是为什么一开始就假设平面过原点的原因!那么如果平面不过原点呢?这就是数据中心化的缘故!将坐标原点平移到数据中心,这样原本不相关的数据在这个新坐标系中就有相关性了!有趣的是,三点一定共面,也就是说三维空间中任意三点中心化后都是线性相关的,一般来讲n维空间中的n个点一定能在一个n-1维子空间中分析!

上一段文字中,认为把数据降维后并没有丢弃任何东西,因为这些数据在平面以外的第三个维度的分量都为0。现在,假设这些数据在z’轴有一个很小的抖动,那么我们仍然用上述的二维表示这些数据,理由是我们可以认为这两个轴的信息是数据的主成分,而这些信息对于我们的分析已经足够了,z’轴上的抖动很有可能是噪声,也就是说本来这组数据是有相关性的,噪声的引入,导致了数据不完全相关,但是,这些数据在z’轴上的分布与原点构成的夹角非常小,也就是说在z’轴上有很大的相关性,综合这些考虑,就可以认为数据在x’,y’ 轴上的投影构成了数据的主成分!

课堂上老师谈到的特征选择的问题,其实就是要剔除的特征主要是和类标签无关的特征。而这里的特征很多是和类标签有关的,但里面存在噪声或者冗余。在这种情况下,需要一种特征降维的方法来减少特征数,减少噪音和冗余,减少过度拟合的可能性。

PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

二、PCA实例

现在假设有一组数据如下:

      行代表了样例,列代表特征,这里有10个样例,每个样例两个特征。可以这样认为,有10篇文档,x是10篇文档中“learn”出现的TF-IDF,y是10篇文档中“study”出现的TF-IDF。

第一步,分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么第一个样例减去均值后即为(0.69,0.49),得到

     第二步,求特征协方差矩阵,如果数据是3维,那么协方差矩阵是

     这里只有x和y,求解得

对角线上分别是x和y的方差,非对角线上是协方差。协方差是衡量两个变量同时变化的变化程度。协方差大于0表示x和y若一个增,另一个也增;小于0表示一个增,一个减。如果x和y是统计独立的,那么二者之间的协方差就是0;但是协方差是0,并不能说明x和y是独立的。协方差绝对值越大,两者对彼此的影响越大,反之越小。协方差是没有单位的量,因此,如果同样的两个变量所采用的量纲发生变化,它们的协方差也会产生数值上的变化。

第三步,求协方差的特征值和特征向量,得到

      上面是两个特征值,下面是对应的特征向量,特征值0.0490833989对应特征向量为(-0.735178656, 0.677873399),这里的特征向量都归一化为单位向量。

第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。

第五步,将样本点投影到选取的特征向量上。假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

FinalData(10*1) = DataAdjust(10*2矩阵) x 特征向量(-0.677873399, -0.735178656)T

得到的结果是

      这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。

上面的数据可以认为是learn和study特征融合为一个新的特征叫做LS特征,该特征基本上代表了这两个特征。上述过程如下图2描述:

正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),最后一步的矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影。

 

2.LDA

LDA(这里指的是fisher’s linear discriminant)把线性分类看成是数据降维的一种应用。考虑一个二分类问题,假设输入D维向量x,我们通过线性变换将它投影到一维空间上: 

y=wTx


如果我们对y设定一个阈值,令 y⩾−w0 的时候,判定为class1,否则判定为class2.那么这其实就是标准的线性分类器。为了能让我们的判定尽可能准确,我们需要让投影之间的两个类之间的差距尽可能大。现在仍旧考虑二分类问题,假设有N1C1类别的点,有N2C2类别的点,则两个类别的数据的均值分别为 

 


最简单的分类方法,就是让投影之后的两个类别的均值相差越大越好。也就是说,我们需要选择一个投影方向(单位投影矢量w),使得下式最大 

 

m2^−m1^=wT(m2−m1)


其中 

 

mk^=wTmk


同时满足 

 

wTw=1


这么一个约束优化问题和上面的PCA类似,解得结果可以得到 

 

w∝(m2−m1)


也就是说,w是和两类数据中心点构成的矢量平行。如下面左图所示:

 

 

红色和蓝色分别表示两类数据,可以看到,尽管在投影方向w上,两类数据确实有分开,但是还存在很大程度上的交叠。Fisher提出的观点就是在让投影之后的数据尽量分开的同时,也要让两个数据的方差最小,最后变成右图所示的结果。

投影之后数据的类内方差表达式为 

s2k=∑nCk(ynmk^)2


其中yn表示xn投影之后的值。我们可以定义总体的类内方差为 s1+s2。Fisher判别准则定义为类间方差和类内方差的比值,也就是 

 

w的表达式代入得到 

 

其中SB表示类间协方差矩阵,Sw表示类内协方差矩阵,也就是 

 

SB=(m2−m1)(m2−m1)T   −−−(2)

 

Sw=∑nC1(xnm1)(xnm1)T+∑nC2(xnm2)(xnm2)T


对(1)式求导,令导数等于0(为了方便,可以对(1)式两边先取对数,然后求导),可以得到 

 

(wTSBw)Sww=(wTSww)SBw   −−−(3)


从(2)式我们可以看到 SBw是始终和 m2−m1平行的,同时我们并不在意 w的大小,只在意它的方向,因此,我们可以把 wTSBw和 wTSww 直接去掉,然后再在(3)式两边同时乘上 S−1w,就可以得到 

 

wS−1w(m2−m1)   −−−(4)


(4)式表示的就是Fisher线性判别器。找到和合理的投影方向之后,我们可以通过极大似然的方法来估计最优的分类阈值。

 


所以PCA和LDA虽然都用到数据降维的思想,但是监督方式不一样,目的也不一样。PCA是为了去除原始数据集中冗余的维度,让投影子空间的各个维度的方差尽可能大,也就是熵尽可能大。LDA是通过数据降维找到那些具有discriminative的维度,使得原始数据在这些维度上的投影,不同类别尽可能区分开来。下面这张图一定程度上表示了PCA和LDA之间投影选择的差别。

 

3. PCA和LDA的应用场合

两者都是为了在对原始数据降维之后进行分类。PCA是无监督的方式,它没有分类标签,降维之后需要采用K-Means或自组织映射网络等无监督的算法进行分类。LDA是有监督的方式,它先对训练数据进行降维,然后找出一个线性判别函数。

 

如果不降维,将导致 数据分布在一个极小的区域内。也叫维度灾难。

比如说,球的体积是 v 正比于 R^3。在R/2的同心球,体积正比于(R/2)^3。同心小球是全球的体积八分之一。

如果是多维球,球的大部分体积 分布在球表面内侧的“很薄”的一层,比如千/万维的话....

所以要降维。不降维,高维特征没啥用,比如人脸识别....

PCA是无类别信息,不知道样本属于哪个类,用PCA,通常对全体数据操作。

LDA有类别信息,投影到类内间距最小and类间间距最大...

也有一些算法,先用PCA搞一遍,再用LDA搞一遍,也有相反。反正有论文是这么搞的,至于是不是普适,要看具体问题。

具体问题具体分析,这是最重要的...

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kuweicai/article/details/79255270

智能推荐

宇视NVR录像机密码忘记找回方式.pdf_宇视科技400服务的博客-程序员ITS301

设备默认用户名是admin密码是123456或admin,也可尝试不输入密码登录。若登录失败,请您将设备连接显示器,按照界面提示信息选择对应操作方法(非ISC、ECR款录像机)。界面一宇视云网站自助找回需要确保手机客户端添加该设备且“在线”ezcloud.uniview.com登录云端账号密码,点击“钥匙”图标验证码将发送到注册云端的手机号,输入验证码点击【生成密码】若设备未注册到云端或设备宇视云离线,则根据设备所在地选择对应维修站点,需拆卸所有可插拔存储介质.

静态路由的配置,实现全网可达_aweike的博客-程序员ITS301_如何添加静态路由使各网络之间能够互联

静态路由的配置(1)配置静态路由常用命令配置路由接口IP与掩码:ip address IP地址 子网掩码如:ip address 192.168.1.1 255.255.255.0配置静态路由:ip route 目标网络 目标网络子网掩码 下一路由器接口ip地址/送出口(注:此处的目标网络是指一个地址段,不是一个IP地址)如:ip route 192.168.2.0 255.255.255.0 192.168.3.1(g0/0/0)查看路由表:display ip routing-table(2)静态路由配_1671465600

项目_前后端分离认证解决方案_JWT认证_窝在角落里学习的博客-程序员ITS301

文章目录前后端分离认证解决方案——JWT认证0、前言1、何为 JWT2、JWT 能做什么?3、JWT 认证3.1、基于传统的 Session 认证3.1.1、认证方式3.1.2、认证流程3.1.3、存在的问题3.2、基于 JWT 认证3.2.1、认证流程3.2.2、JWT 优势4、JWT 的结构4.1、Header4.2、Payload4.3、Signature5、JWT 的使用5.1、引入依赖5.2、生成Token5.3、解析数据5.4、常见的异常信息6、封装工具类7、Spring Boot整合 JWT7

_XOPEN_SOURCE_bytxl的博客-程序员ITS301__xopen_source

http://blog.chinaunix.net/uid-23204078-id-2525171.html[误解]#define _XOPEN_SOURCE决不是简单的宏定义它是使程序符合系统环境的不可缺少的部分[概念]Glibc 所实现全部或部分规范下的功能有:1.ISO C: C语言国际标准. 2.POSIX: 操作系统的 ISO/IEC 9945 (

使用junit测试方法抛出期望异常_Happy coder的博客-程序员ITS301

1. 实例代码package com.ruoyi.common.utils;import org.junit.Rule;import org.junit.jupiter.api.Test;import org.junit.rules.ExpectedException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import static org.juni

fir.im Weekly - 关于 iOS10 适配、开发、推送的一切_Angela㐅cc的博客-程序员ITS301

“小程序”来了,微信变成名副其实的 Web OS,新一轮的Web App 与Native App争论四起。程序员对新技术永远保持灵敏的嗅觉和旺盛的好奇心,@李锦发整理了微信小程序资源汇总,涵括微信 Web 开发者工具,WeApp 教程,站点收集和代码实例,持续更新,GitHub 地址:awesome-wechat-weapp .除了“小程序”的大热点之外,本期 fir.imWeekly 重点整...

随便推点

Linux显示行号设置_IT-cute的博客-程序员ITS301_linux设置行号

Linux显示行号设置第一步,打开vimvi ~/.vimrc第二步,在该文件中加入一行,命令如下:set nu # 显示行号set nonu # 不显示行号 微信公众号:喵哥解说公众号介绍:主要研究机器学习、计算机视觉、深度学习、ROS等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!同时还有1200G的Python视频和书籍资料等你领取!!!...

React更新指令_GGG_Yu的博客-程序员ITS301

1. 查看自己的React版本自己的React版本可以在项目的package.json文件中看到,搜索“react”,即可看到版本号:2. 更新到最新版本React输入命令 npm info react 查看最新的react版本:可以看到当前最新版本是17.0.2,执行下列指令安装:npm install [email protected] [email protected]如果安装失败,可以使用cnpm安装:cnpm install [email protected] [email protected]

程序猿的新博客开通啦!_光仔December的博客-程序员ITS301

以前在新浪博客发表代码,由于新浪博客对代码的发表不太支持,所以现在搬家到CSDN,感觉这才是为程序猿专门设计的博客,很喜欢这里的代码发表格式!赞一个! 原博客地址是: http://blog.sina.com.cn/iecoder

【网络】TCP三次握手连接和四次挥手断开_bandaoyu的博客-程序员ITS301_(1)请说明tcp协议三次握手连接与四次挥手断开的过程;(3分) (2)请用抓包软件获取上

TCP连接为什么是三次握手?断开为什么是四次挥手?1.三次握手TCP连接换成四次握手行不行?为什么?换成两次握手行不行?为什么? 这是我面试时遇到的原题 首先来说一下三次握手,为什么需要三次握手呢?因为TCP提供的是可靠传输服务,因此它在传输之前必须要进行传输的可靠性测试和一些信息的同步,反观UDP就不用这些握手操作。三次握手正好使双方都能测试传输的可靠性,同时也能进行信息同步,三...

Android开发笔记——快速入门(壹)[系统架构和Android Studio安装]_android kernel和studio_据说这是zzy的博客-程序员ITS301

Android开发笔记——快速入门(壹)[系统架构和Android Studio安装]文章目录Android开发笔记——快速入门(壹)[系统架构和Android Studio安装]@[TOC](文章目录)软件环境:Android的系统架构Linux 内核硬件抽象层 (HAL)Android Runtime原生 C/C++ 库Java API 框架系统应用Android的四大组件和SQLite数据库四大组件SQLite数据库Android Studio开发环境的搭建:总结软件环境:Jetbrains

如何解决RuntimeError: CUDA error: out of memory?_Jack_0601的博客-程序员ITS301_runtimeerror: cuda error: out of memory

当我们在使用GPU进行训练和推断时,经常会发现爆显存的问题。一开始的时候相信很多人跟我一样有个疑问,就是明明显存没占用,可是还是会爆?这里以8张卡为例,假设前面4张卡被人占用之后,还有后面4张卡是空的,如果这时候我们只是单纯的指定CUDA:0这样,那么必然会报下面这个错:RuntimeError: cuda runtime error (2) : out of memory at mmdet...

推荐文章

热门文章

相关标签