20. 机器学习——PCA 与 LDA

机器学习面试题汇总与解析——PCA 与 LDA

本章讲解知识点

    1. 什么是数据降维
    1. PCA


  • 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。

  • 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。

  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵

  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。

  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。


  • 关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。

  • 关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。

  • B站机器学习视频:https://space.bilibili.com/10781175/channel/detail?cid=133301



1. 什么是数据降维

数据降维是指在保持数据关键信息的前提下,减少数据的维度或特征数量的过程。在机器学习和数据分析中,数据降维是一种常用的技术,解决高维数据带来的问题。

高维数据通常具有大量的特征,这可能导致以下问题:

  • 维度灾难:随着维度的增加,数据空间的体积呈指数级增长,导致数据稀疏性增加和样本密度下降。

  • 计算复杂度增加:高维数据会增加计算的复杂度和存储需求,对于一些算法而言,处理高维数据会变得困难和耗时。

  • 数据可视化困难:在高维空间中,我们无法直观地可视化和理解数据的结构和关系。

数据降维可以通过两种方法实现:

  • 特征选择(Feature Selection):选择原始特征集中的子集作为新的特征集,从而减少特征的数量。常用的特征选择方法包括过滤式方法、包裹式方法和嵌入式方法等。

  • 特征提取(Feature Extraction):通过线性或非线性变换,将原始高维数据映射到低维空间,从而创建新的特征集。常见的特征提取方法有主成分分析(PCA)、线性判别分析(LDA)和独立成分分析(ICA)等。

PCA(Principal Component Analysis)和 LDA(Linear Discriminant Analysis)都是常用的数据降维方法,但它们的目标和应用场景略有不同。

PCA 是一种无监督学习方法,主要用于降低数据的维度并捕捉数据中的主要变化方向。它通过找到数据中方差最大的特征向量来确定新的特征空间,将原始高维数据映射到一个低维子空间。PCA 的目标是最大化数据的方差,并且特征之间是无关的。它主要用于数据探索、可视化和去除冗余特征。PCA 可以减少数据的维度,但不能保证在分类问题中获得最佳的判别能力。

LDA 是一种有监督学习方法,主要用于在降维的同时最大化类别间的差异和最小化类别内的差异,以提高分类效果。LDA 通过寻找投影轴,使得在新的低维子空间中,不同类别的样本尽可能分离,同一类别内的样本尽可能接近。LDA 的目标是最大化类别间的散布矩阵与最小化类别内的散布矩阵的比值。相比于 PCA,LDA 更适合于分类问题,并且可以提供更好的判别能力。


2. PCA

2.1 基本概念

PCA(Principal Component Analysis)是一种常用的无监督学习算法,用于数据降维和特征提取。它通过线性变换将原始高维数据映射到一个低维子空间,使得新的特征具有最大的方差。PCA 的目标是找到数据中最重要的特征,即主成分,以尽量保留原始数据中的信息

2.2 算法流程

PCA(Principal Component Analysis)算法的具体流程如下:

假设有样本: x 1 , x 2 , . . . . . . x i x_1,x_2,......x_i

1.数据预处理:对原始数据进行去均值操作。

  • 均值公式: μ = 1 N i = 1 N x i \mu = \frac{1}{N}\sum_{i=1}^{N}x_i
  • 去均值后的数据: x ˉ i = x i μ \bar{x}_i = x_i - \mu

2.计算协方差矩阵:计算去均值后的数据的协方差矩阵。

  • 协方差矩阵公式: C = 1 N i = 1 N x ˉ i x ˉ i T C = \frac{1}{N}\sum_{i=1}^{N}\bar{x}_i\bar{x}_i^T

3.特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。

  • 特征值分解公式: C = V D V T C = VDV^T D D 为特征值的对角矩阵, V V 为对应的特征向量组成的矩阵。

4.特征值排序:按照特征值的大小将特征向量进行排序,选择前 k 个最大的特征值对应的特征向量作为主成分。

  • 选择前 k 个特征值对应的特征向量: V k = [ v 1 , v 2 , . . . , v k ] V_k = [v_1, v_2, ..., v_k]

5.构建投影矩阵:将前 k 个特征向量组成的矩阵作为投影矩阵。

  • 投影矩阵: P = V k P = V_k

6.数据降维:通过将原始数据与投影矩阵相乘,将数据映射到低维空间,实现数据的降维。

  • 降维后的数据: Y = X P T Y = X \cdot P^T

以上公式中, N N 表示样本数量, x i x_i 表示原始数据的第 i i 个样本, x ˉ i \bar{x}_i 表示去均值后的第 i i 个样本, C C 表示协方差矩阵, V V 表示特征向量矩阵, D D 表示特征值的对角矩阵, V k V_k 表示选择的前 k 个特征向量构成的矩阵, P T P^T 表示投影矩阵, X X 表示原始数据矩阵, Y Y 表示降维后的数据矩阵。

PCA是比较常见的线性降维方法,通过线性投影高维数据映射到低维数据中,所期望的是在投影的维度上,新特征自身的方差尽量大,方差越大特征越有效,尽量使产生的新特征间的相关性越小。

2.3 PCA 的优缺点

优点:

  • 降低数据维度:PCA 能够将高维数据转换为低维表示,去除冗余信息,减少特征的数量,便于数据的可视化和理解。
  • 最大化数据方差:PCA 通过寻找数据中方差最大的方向进行投影,保留了数据的主要变化模式,保留了最重要的信息。
  • 去除数据间的相关性:PCA 将原始数据变换到新的特征空间中,新的特征之间具有最小的相关性,减少了多重共线性问题。
  • 减少计算复杂度:PCA 降低了数据的维度,减少了计算的复杂度和存储空间的需求。

缺点:

  • 信息损失:由于 PCA 是通过保留主要变化模式来降低数据维度,因此会引入一定的信息损失。降维后的数据无法完全还原原始数据,可能会损失一些细节和特定的变化模式。
  • 受异常值影响:PCA 对异常值敏感,异常值可能会对主成分分析的结果产生较大影响,导致降维结果不准确。
  • 假设数据线性可分:PCA 假设数据是线性可分的,对于非线性关系较强的数据,PCA 的效果可能不佳。
  • 计算复杂度:PCA 需要计算数据的协方差矩阵,对于大规模数据集,计算复杂度较高。

3. LDA

2.1 基本概念

LDA(Linear Discriminant Analysis)是一种常用的线性判别分析方法,用于降维和分类。与 PCA 不同,LDA 是一种有监督学习算法,它关注的是最大化不同类别之间的差异性,而不是最大化总体方差

LDA 的主要思想是将数据投影到低维空间,使得不同类别之间的距离最大化,同一类别内部的样本距离最小化。通过寻找最佳投影方向,LDA 能够将高维数据转换为一个更低维的子空间。

2.2 LDA 的算法流程

1.输入数据集:包含 N N 个样本,每个样本有 d d 个特征,同时每个样本有一个标签表示其所属类别。

2.计算类别均值向量:对于每个类别 c c ,计算其样本的均值向量 μ c μ_c

  • 类别 c c 的均值向量: μ c = 1 n c x i μ_c = \frac{1}{n_c} ∑x_i ,其中 x i x_i 是属于类别 c c 的第 i i 个样本, n c n_c 是类别 c c 的样本数量。

3.计算类间散度矩阵:计算类别均值向量之间的差异,并进行类间散度矩阵 S B S_B 的计算。

  • 总体均值向量: μ = 1 N μ c μ = \frac{1}{N} ∑μ_c ,其中 N N 是总样本数量, μ c μ_c 是类别 c c 的均值向量。
  • 类间散度矩阵: S B = ( n c ( μ c μ ) ( μ c μ ) T ) S_B = ∑(n_c * (μ_c - μ) * (μ_c - μ)T) ,对所有类别 c c 求和。

4.计算类内散度矩阵:计算每个类别内部样本的协方差矩阵,并进行类内散度矩阵 S W S_W 的计算。

  • 类别 c c 的协方差矩阵: S c = ( x i μ c ) ( x i μ c ) T S_c = ∑(x_i - μ_c) * (x_i - μ_c)T ,对属于类别 c c 的样本 x i x_i 求和。
  • 类内散度矩阵: S W = S c S_W = ∑S_c ,对所有类别 c c 求和。

5.求解广义特征值问题:通过求解广义特征值问题,得到投影矩阵 W W (线性判别向量),将数据投影到低维空间。

  • 广义特征值问题: S W 1 S B W = λ W S_W^{-1} S_B W = λ W ,其中 λ λ 是广义特征值, W W 是广义特征向量。

6.选择投影维度和分类:根据特征值的大小,选择合适的投影维度 k(通常是保留前 k 个最大的特征值对应的特征向量)。将数据投影到新的子空间,并使用分类算法(如最近邻算法)对数据进行分类。

LDA 算法的目标是最大化类别间的差异性(通过类间散度矩阵 S B S_B )和最小化类别内部的差异性(通过类内散度矩阵 S W S_W ),从而使得投影后的数据在不同类别之间有更好的可分性

2.3 LDA 优缺点

优点:

  • 提供了一种有效的降维方法:LDA 可以将高维数据投影到低维空间,保留了最能区分不同类别的特征,从而在降低数据维度的同时保持了较高的分类性能。
  • 考虑了类别之间的差异性:LDA 通过最大化类别间的差异性和最小化类别内部的差异性,使得投影后的数据在不同类别之间更容易区分。
  • 可以处理多分类问题:LDA 不仅适用于二分类问题,还可以扩展到多分类问题。
  • 对数据分布的假设较弱:LDA 在对数据分布做出较弱的假设情况下,仍然能够获得较好的分类效果。

缺点:

  • 对数据分布的假设要求较严:LDA 假设数据服从高斯分布,并且假设各个类别的协方差矩阵相等,这在实际应用中可能不符合数据的实际情况。
  • 对异常值和噪声敏感:由于 LDA 在计算类别均值和协方差矩阵时受到异常值和噪声的影响,可能导致投影结果的偏移或不准确。
  • 维度灾难问题:当原始数据维度很高时,LDA 可能无法充分发挥降维的作用,因为在高维空间中,类别间的差异性可能变得微弱。
  • 需要类别信息:LDA 是一种有监督学习方法,需要事先知道每个样本所属的类别信息,因此在无标签数据或无法获得类别信息的情况下无法应用。


面试题

1. PCA 介绍一下⭐⭐⭐⭐⭐

PCA(Principal Component Analysis)是一种常用的无监督学习算法,用于数据降维和特征提取。它通过线性变换将原始高维数据映射到一个低维子空间,使得新的特征具有最大的方差。PCA 的目标是找到数据中最重要的特征,即主成分,以尽量保留原始数据中的信息

可以使用两种方法进行 PCA,分别是特征分解或奇异值分解(SVD)。PCA 旨在找到数据中的主成分, 并利用这些主成分表征原始数据, 从而达到降维的目的

算法步骤

假设有 m 条 n 维数据。

  1. 将原始数据按列组成 n 行 m 列矩阵 X X

  2. X X 的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

  3. 求出协方差矩阵 C = 1 m X X T C = \frac{1}{m}XX^T

  4. 求出协方差矩阵的特征值以及对应的特征向量:特征值分解公式: C = V D V T C = VDV^T

  5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k行组成矩阵 P P

  6. Y = P T X Y=P^TX 即为降维到 k 维后的数据

2. 说说 PCA 的步骤⭐⭐⭐⭐⭐

答案同第一题

3. PCA 原理⭐⭐⭐⭐⭐

答案同第一题

4. PCA 降维之后的维度怎么确定⭐⭐⭐⭐⭐

参考回答

  1. 可以利用交叉验证,再选择一个很简单的分类器,来选择比较好的 k 的值

  2. 设定一个保留的信息量比例,例如保留90%的信息量,然后根据特征值的大小选择相应数量的特征向量,使得这些特征向量对应的特征值之和占总特征值之和的比例达到指定的比例。

5. 说说 PCA 的优缺点⭐⭐⭐⭐⭐

优点:

  • 降低数据维度:PCA 能够将高维数据转换为低维表示,去除冗余信息,减少特征的数量,便于数据的可视化和理解。
  • 最大化数据方差:PCA 通过寻找数据中方差最大的方向进行投影,保留了数据的主要变化模式,保留了最重要的信息。
  • 去除数据间的相关性:PCA 将原始数据变换到新的特征空间中,新的特征之间具有最小的相关性,减少了多重共线性问题。
  • 减少计算复杂度:PCA 降低了数据的维度,减少了计算的复杂度和存储空间的需求。

缺点:

  • 信息损失:由于 PCA 是通过保留主要变化模式来降低数据维度,因此会引入一定的信息损失。降维后的数据无法完全还原原始数据,可能会损失一些细节和特定的变化模式。
  • 受异常值影响:PCA 对异常值敏感,异常值可能会对主成分分析的结果产生较大影响,导致降维结果不准确。
  • 假设数据线性可分:PCA 假设数据是线性可分的,对于非线性关系较强的数据,PCA 的效果可能不佳。
  • 计算复杂度:PCA 需要计算数据的协方差矩阵,对于大规模数据集,计算复杂度较高。

6. 推导一下 PCA⭐⭐⭐⭐⭐

参考回答

1.定义初始变量

假设有样本:

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

- 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 - 本专栏适合于算法、机器学习求职的学生或人士。 - 本专栏特点: - 本专栏囊括了深度学习、机器学习、NLP、特征工程等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共301道,知识点讲解全面,事半功倍,为大家春秋招助力。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。

全部评论

相关推荐

求求给个offer我...:有这60不如v我50
点赞 评论 收藏
分享
emmm别问我为啥上一条帖子隔了两个月我才开始投简历和拿offer,因为我懒😰简单流程如下:周一凌晨改好的简历,然后到处乱投简历;周二接到了三维家的一面通知,临时抱佛脚的背了一些八股;周三上午一面下午通知第二天hr面;周四上午hr面下午拿offer,遂收手支线:在BOSS上顺手投了几个大厂,投字节的时候不小心投城客户端了,结果过了一天HR突然把我简历要走了,还问我能不能整客户端,我直接一口答应(脏面评警告😢)结果在周三下午的时候给我打电话,说前端有空缺实习岗,问我有没有兴趣,然后就跟我约了周四下午一面😰我都没咋准备啊,咩都不会啊😭结果周四下午面完,晚上打电话通知过一面了,赶紧把二面约在下周一下午,留点缓冲时间。逆大天了,我一半的问题都不会,他居然给我过了?运气未免有点好了😥现在正在恶补计网、网安、性能优化的东西(这三大板块我是几乎一点不会,一面几乎一点答不出来,加上我又没怎么背八股,这块被干烂了😵)心得体会与经验:1. 我giao怎么这么快就结束了,我还以为要找好久😨2. 大厂的面试问题真的和中厂小厂很大不同,比如在三维家我能自己吹水到vue的数据劫持、Proxy代理响应式之类的他们就觉得很不错了,但是在字节你但凡敢提到一下就会追问你细节了,一追问马脚就全漏出来了3. 有信心真的很重要,我感觉我能拿中厂offer最重要的就是吹水吹出自信来了,以至于三维家面试反问面试官有哪里还需要改进的时候,他就说很不错了解的很多😦4. 理解很重要,我从头到尾真没背过很多八股,不过有一些知识确实是敲过代码验证过,所以面试的时候能吹水吹得出来😇想了解面经啥的可以直接评论区问我,但我可能也说不全,因为我没有记录,而且今天摆了一天感觉记忆快清空了😵下面是故事时间:我暑假刚开始的时候才开始准备八股,印象很深那个时候连什么原型、事件循环、闭包这些名词都没听过,资料也不知道怎么找,就一直零零散散的准备,感觉也只有js稍微背了一下八股,其他很多时候都是靠完全理解和手写熟悉一些机制的,但这样做效率很低,反正准备了一个多星期半个月就开摆了😭结果一摆就摆到了开学,笔记是乱七八糟的,八股是忘光光的,简历是一直没改的,实习也是一直没投过的。直到上周日晚上偶然和师兄聊天,他突然问我“你怎么还不找实习”,那天晚上才幡然醒悟,是时候做点事情了😡然后就按照上面描述的来走了。其实我感觉我从头到尾都没背特别多八股,也没怎么找刷题资料啥的,早期就是翻尚硅谷或者黑马的入门视频从头学起,中期用面试鸭看了一点点题,主要是在学js机制和敲js代码,后期才发现了w3c的面经网站,然后在那里看着学(那个时候已经懒得敲了,因为有些问题与代码感觉不像是给找实习的看的,忒细了点😂)接下来继续准备字节二面吧,虽然几乎没啥可能可以通过,但是万一有奇迹呢?😍😍😍也祝大家能够早日拿到心仪的offer
我的offer呢😡:我已经预见10天后你会发,节孝子启动了
投递三维家等公司10个岗位
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务