Based on Deep Learning (2017, MIT) book.

本文基于Deep Learning (2017, MIT),推导过程补全了所涉及的知识及书中推导过程中跳跃和省略的部分。

blog

1 概述

现代数据集,如网络索引、高分辨率图像、气象学、实验测量等,通常包含高维特征,高纬度的数据可能不清晰、冗余,甚至具有误导性。数据可视化和解释变量之间的关系很困难,而使用这种高维数据训练的神经网络模型往往容易出现过拟合(维度诅咒)。

主成分分析(PCA)是一种简单而强大的无监督机器学习技术,用于数据降维。它旨在从大型变量集中提取一个较小的数据集,同时尽可能保留原始信息和特征(有损压缩)。PCA有助于识别数据集中最显著和有意义的特征,使数据易于可视化。应用场景包括:统计学、去噪和为机器学习算法预处理数据。

  • 主成分是什么?

    主成分是构建为原始变量的线性组合的新变量。这些新变量是不相关的,并且包含原始数据中大部分的信息。

2 背景数学知识

这些知识对下一节的推导很重要。

  • 正交向量和矩阵:

    • 如果两个向量垂直,则它们是正交的。即两个向量的点积为零。
    • 正交矩阵是一个方阵,其行和列是相互正交的单位向量;每两行和两列的点积为零,每一行和每一列的大小为1。
    • 如果\(A^T=A^{-1}\)或\(AA^T=A^TA=I\),则\(A\)是正交矩阵。
    • 在机器人学中,旋转矩阵通常是一个\(3\times3\)的正交矩阵,在空间变换中它会旋转向量的方向但保持原始向量的大小。
  • 矩阵、向量乘法规则:
    • \((AB)^T=B^TA^T\),两个矩阵的乘积的转置。
    • \(\vec{a}^T\vec{b}=\vec{b}^T\vec{a}\),两个结果都是标量,标量的转置是相同的。
    • \((A + B)C = AC + BC\),乘法是可分配的。
    • \(AB \neq{} BA\),乘法一般不满足交换律。
    • \(A(BC)=(AB)C\),乘法满足结合律。
  • 对称矩阵:
    • \(A=A^T\),\(A\)是对称矩阵。
    • \(X^TX\)是对称矩阵,因为\((X^TX)^T=X^TX\)。
  • 向量导数规则(\(B\)是常量矩阵):
    • \(d(x^TB)/dx=B\)
    • \(d(x^Tx)/dx=2x\)
    • \(d(x^TBx)/dx=2Bx\)
  • 矩阵迹规则:
    • \(Tr(A)=Tr(A^T)\)
    • \(Tr(AB)=Tr(BA)\)
    • \(Tr(A)=\sum_i{\lambda_i}\),其中\(\lambda\)是\(A\)的特征值。
    • 迹在循环移位下不变:\(Tr(ABCD)=Tr(BCDA)=Tr(CDAB)=Tr(DABC)\)
  • 向量和矩阵范数:
    • 向量的\(L^2\)范数,也称为欧几里得范数:\(||x||_2=\sqrt{\sum_i|x_i|^2}\)。
    • 通常使用平方的\(L^2\)范数来衡量向量的大小,可以计算为\(x^Tx\)。
    • Frobenius范数用于衡量矩阵的大小:\(||A||_F=\sqrt{\sum_{i,j}A^2_{i,j}}\)
    • Frobenius范数是所有矩阵元素的绝对平方和的平方根。
    • Frobenius范数是矩阵版本的欧几里得范数。
  • 特征值分解和特征值:
    • 方阵\(A\)的特征向量是一个非零向量\(v\),使得\(A\)的乘法仅改变\(v\)的比例:\(Av=\lambda v\)。\(\lambda\)是特征值,\(v\)是特征向量。
    • 假设矩阵\(A\)有\(n\)个线性无关的特征向量\(v^{(i)}\),我们可以将所有特征向量连接起来形成一个矩阵\(V=[v^{(1)},\ldots,v^{(n)}]\),并通过连接所有特征值\(\lambda=[\lambda_1,\ldots,\lambda_n]^T\)形成一个向量,那么\(A\)的特征分解是\(A=Vdiag(\lambda)V^{-1}\)
    • 每个实对称矩阵都可以分解为\(A=Q\Lambda Q^T\),其中\(Q\)是由\(A\)的特征向量组成的正交矩阵,\(\Lambda\)(读作'lambda')是一个对角矩阵。
  • 拉格朗日乘数法:
    • 拉格朗日乘数法是一种在方程约束下寻找函数局部最大值和最小值的策略。
    • 一般形式:\(\mathcal{L}(x,\lambda)=f(x)+\lambda\cdot g(x)\),\(\lambda\)称为拉格朗日乘子。

3 详细PCA推导

需求描述

我们有\(m\)个点的输入数据,表示为\({x^{(1)},...,x^{(m)}}\)在\(\mathbb{R}^{n}\)的实数集中。因此,每个点\(x^{(i)}\)是一个列向量,具有\(n\)维特征。

需要对输入数据进行有损压缩,将这些点编码以表示它们的较低维度版本。换句话说,我们想要找到编码向量\(c^{(i)}\in \mathbb{R}^{l}\),\((l<n)\)来表示每个输入点\(x^{(i)}\)。我们的目标是找到产生输入的编码向量的编码函数\(f(x)=c\),以及相应的重构(解码)函数\(x\approx g(f(x))\),根据编码向量\(c\)计算原始输入。

解码的\(g(f(x))\)是一组新的点(变量),因此它与原始\(x\)是近似的。存储\(c^{(i)}\)和解码函数比存储\(x^{(i)}\)更节省空间,因为\(c^{(i)}\)的维度较低。

解码矩阵

我们选择使用矩阵\(D\)作为解码矩阵,将编码向量\(c^{(i)}\)映射回\(\mathbb{R}^{n}\),因此\(g(c)=Dc\),其中\(D\in \mathbb{R}^{n\times l}\)。为了简化编码问题,PCA将\(D\)的列约束为彼此正交。

衡量重构的表现

在继续之前,我们需要弄清楚如何生成最优的编码点\(c^{*}\),我们可以测量输入点\(x\)与其重构\(g(c^*)\)之间的距离,使用\(L^2\)范数(或欧几里得范数):\(c^{*}=\arg\min_c||x-g(c)||_2\)。由于\(L^2\)范数是非负的,并且平方操作是单调递增的,所以我们可以转而使用平方的\(L^2\)范数:

\[c^{*}={\arg\min}_c||x-g(c)||_2^2
\]

向量的\(L^2\)范数是其分量的平方和,它等于向量与自身的点积,例如\(||x||_2=\sqrt{\sum|x_i|^2}=\sqrt{x^Tx}\),因此平方的\(L^2\)范数可以写成以下形式:

\[||x-g(c)||_2^2 = (x-g(c))^T(x-g(c))
\]

由分配率:

\[=(x^T-g(c)^T)(x-g(c))=x^Tx-x^Tg(c)-g(c)^Tx+g(c)^Tg(c)
\]

由于\(x^Tg(c)\)和\(g(c)^Tx\)是标量,标量等于其转置,\((g(c)^Tx)^T=x^Tg(c)\),所以:

\[=x^Tx-2x^Tg(c)+g(c)^Tg(c)
\]

为了找到使上述函数最小化的\(c\),第一项可以省略,因为它不依赖于\(c\),所以:

\[c^*={\arg\min}_c-2x^Tg(c)+g(c)^Tg(c)
\]

然后用\(g(c)\)的定义\(Dc\)进行替换:

\[={\arg\min}_c-2x^TDc+c^TD^TDc
\]

由于\(D\)的正交性和单位范数约束:

\[c^*={\arg\min}_c-2x^TDc+c^TI_lc
\]
\[= {\arg\min}_c-2x^TDc+c^Tc
\]

目标函数

现在目标函数是\(-2x^TDc+c^Tc\),我们需要找到\(c^*\)来最小化目标函数。使用向量微积分,并令其导数等于0:

\[\nabla_c(-2x^TDc+c^Tc)=0
\]

根据向量导数规则:

\[-2D^Tx+2c=0 \Rightarrow c=D^Tx
\]

找到编码矩阵 \(D\)

所以编码器函数是 \(f(x)=D^Tx\)。因此我们可以定义 PCA 重构操作为 \(r(x)=g(f(x))=D(D^Tx)=DD^Tx\)。

因此编码矩阵 \(D\) 也被重构过程使用。我们需要找到最优的 \(D\) 来最小化重构误差,即输入和重构之间所有维度特征的距离。这里使用 Frobenius 范数(矩阵范数)定义目标函数:

\[D^*={\arg\min}_D\sqrt{\sum_{i,j}(x_j^{(i)}-r(x^{i})_j)^2},\quad D^TD=I_l
\]

从考虑 \(l=1\) 的情况开始(这也是第一个主成分),\(D\) 是一个单一向量 \(d\),并使用平方 \(L^2\) 范数形式:

\[d^*={\arg\min}_d{\sum_{i}||(x^{(i)}-r(x^{i}))}||_2^2, ||d||_2=1
\]
\[= {\arg\min}_d{\sum_{i}||(x^{(i)}-dd^Tx^{(i)})||_2^2}, ||d||_2=1
\]

\(d^Tx^{(i)}\) 是一个标量:

\[= {\arg\min}_d{\sum_{i}||(x^{(i)}-d^Tx^{(i)}d)}||_2^2, ||d||_2=1
\]

标量等于其自身的转置:

\[d^*= {\arg\min}_d{\sum_{i}||(x^{(i)}-x^{(i)T}dd)}||_2^2, ||d||_2=1
\]

使用矩阵形式表示

令 \(X\in \mathbb{R}^{m\times n}\) 表示所有描述点的向量堆叠,即 \(\{x^{(1)^T}, x^{(2)^T}, \ldots, x^{(i)^T}, \ldots, x^{(m)^T}\}\),使得 \(X_{i,:}=x^{(i)^T}\)。

\[X = \begin{bmatrix} x^{(1)^T}\\ x^{(2)^T}\\ \ldots\\ x^{(m)^T} \end{bmatrix} \Rightarrow
Xd = \begin{bmatrix} x^{(1)^T}d\\ x^{(2)^T}d\\ \ldots\\ x^{(m)^T}d \end{bmatrix} \]
\[\Rightarrow Xdd^T =
\begin{bmatrix}
x^{(1)^T}dd^T\\
x^{(2)^T}dd^T\\
\ldots\\
x^{(m)^T}dd^T\\
\end{bmatrix}
\]
\[\Rightarrow X-Xdd^T =
\begin{bmatrix}
x^{(1)^T}-x^{(1)^T}dd^T\\
x^{(2)^T}-x^{(2)^T}dd^T\\
\ldots\\
x^{(m)^T}-x^{(m)^T}dd^T\\
\end{bmatrix}
\]

矩阵中的一行的转置:

\[(x^{(i)^T}-x^{(i)^T}dd^T)^T=x^{(i)}-dd^Tx^{(i)}
\]

由于 \(d^Tx^{(i)}\) 是标量:

\[=x^{(i)}-d^Tx^{(i)}d=x^{(i)}-x^{(i)^T}dd
\]

所以我们知道 \(X\) 的第 \(i\) 行的 \(L^2\) 范数与原始形式相同,因此我们可以使用矩阵重写问题,并省略求和符号:

\[d^*={\arg\min}_{d}||X-Xdd^T||_F^2, \quad d^Td=1
\]

利用矩阵迹规则简化 Frobenius 范数部分如下:

\[{\arg\min}_{d}||X-Xdd^T||_F^2
\]
\[={\arg\min}_{d}Tr((X-Xdd^T)^T(X-Xdd^T))
\]
\[={\arg\min}_{d}-Tr(X^TXdd^T)-Tr(dd^TX^TX)+Tr(dd^TX^TXdd^T)
\]
\[={\arg\min}_{d}-2Tr(X^TXdd^T)+Tr(X^TXdd^Tdd^T)
\]

由于 \(d^Td=1\):

\[={\arg\min}_{d}-2Tr(X^TXdd^T)+Tr(X^TXdd^T)
\]
\[={\arg\min}_{d}-Tr(X^TXdd^T)
\]
\[={\arg\max}_{d}Tr(X^TXdd^T)
\]

由于迹是循环置换不变的,将方程重写为:

\[d^*={\arg\max}_{d}Tr(d^TX^TXd), \quad d^Td=1
\]

由于 \(d^TX^TXd\) 是实数,因此迹符号可以省略:

\[d^*={\arg\max}_{d}d^TX^TXd,\quad d^Td=1
\]

寻找最优的 \(d\)

现在的问题是找到最优的 \(d\) 来最大化 \(d^TX^TXd\),并且有约束条件 \(d^Td=1\)。

使用拉格朗日乘子法来将问题描述为关于 \(d\) 的形式:

\[\mathcal{L}(d,\lambda)=d^TX^TXd+\lambda(d^Td-1)
\]

对 \(d\) 求导数(向量导数规则):

\[\nabla_d\mathcal{L}(d,\lambda)=2X^TXd+2\lambda d
\]

令导数等于0,\(d\) 将是最优的:

\[2X^TXd+2\lambda d=0
\]
\[X^TXd=-\lambda d
\]
\[X^TXd=\lambda' d,\quad(\lambda'=-\lambda)
\]

这个方程是典型的矩阵特征值分解形式,\(d\) 是矩阵 \(X^TX\) 的特征向量,\(\lambda'\) 是对应的特征值。

利用上述结果,让我们重新审视原方程:

\[d^*={\arg\max}_{d}d^TX^TXd, \quad d^Td=1
\]
\[={\arg\max}_{d}d^T\lambda' d
\]
\[={\arg\max}_{d}\lambda'd^T d
\]
\[={\arg\max}_{d}\lambda'
\]

现在问题已经变的非常清楚了,\(X^TX\) 的最大特征值会最大化原方程的结果,因此最优的 \(d\) 是矩阵 \(X^TX\) 对应最大特征值的特征向量。

这个推导是针对 \(l=1\) 的情况,只包含第一个主成分。当 \(l>1\) 时,\(D=[d_1, d_2, \ldots]\),第一个主成分 \(d_1\) 是矩阵 \(X^TX\) 对应最大特征值的特征向量,第二个主成分 \(d_2\) 是对应第二大特征值的特征向量,以此类推。


4 总结

我们有一个数据集,包含 \(m\) 个点,记为 \({x^{(1)},...,x^{(m)}}\)。

令 \(X\in \mathbb{R}^{m\times n}\) 为将所有这些点堆叠而成的矩阵:\([x^{(1)^T}, x^{(2)^T}, \ldots, x^{(i)^T}, \ldots, x^{(m)^T}]\)。

主成分分析(PCA)编码函数表示为 \(f(x)=D^Tx\),重构函数表示为 \(x\approx g(c)=Dc\),其中 \(D=[d_1, d_2, \ldots]\) 的列是 \(X^TX\) 的特征向量,特征向量对应的特征值大小为降序排列。\(D^Tx\)即是降维度之后的数据。

【数学】主成分分析(PCA)的详细深度推导过程的更多相关文章

  1. 吴恩达深度学习第1课第4周-任意层人工神经网络(Artificial Neural Network,即ANN)(向量化)手写推导过程(我觉得已经很详细了)

    学习了吴恩达老师深度学习工程师第一门课,受益匪浅,尤其是吴老师所用的符号系统,准确且易区分. 遵循吴老师的符号系统,我对任意层神经网络模型进行了详细的推导,形成笔记. 有人说推导任意层MLP很容易,我 ...

  2. 主成分分析(PCA)原理及推导

    原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...

  3. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  4. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  5. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

    主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同 ...

  6. 降维(一)----说说主成分分析(PCA)的源头

    降维(一)----说说主成分分析(PCA)的源头 降维系列: 降维(一)----说说主成分分析(PCA)的源头 降维(二)----Laplacian Eigenmaps --------------- ...

  7. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  8. 05-03 主成分分析(PCA)

    目录 主成分分析(PCA) 一.维数灾难和降维 二.主成分分析学习目标 三.主成分分析详解 3.1 主成分分析两个条件 3.2 基于最近重构性推导PCA 3.2.1 主成分分析目标函数 3.2.2 主 ...

  9. 机器学习--主成分分析(PCA)算法的原理及优缺点

    一.PCA算法的原理 PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,是一种用于探索高维数据结构的技术,主要用于对数据的降维,通过降维可 ...

  10. 主成分分析(PCA)原理与实现

    主成分分析原理与实现   主成分分析是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 \(n×m\)的矩阵转换成\(n×k\)的矩阵,仅保留矩阵中所存在的主要特性,从 ...

随机推荐

  1. 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件

    摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...

  2. Unity3D 横板跳跃游戏半成品demo源代码

    项目介绍: 基于B站的 Unity3D新手教程进行学习制作,但视频中的做法有很多BUG,此demo是经过优化,几乎修复了教程里带的所有bug. 实现了基本的功能比如:怪物ai,开始菜单,设置菜单,地图 ...

  3. Ubuntu adb 报错:no permissions (missing udev rules? user is in the plugdev group);问题的解决办法

    问题重现: 确认: Android设备已连接PC Android设备已打开USB调试 zuo@zuo-ubuntu:/etc/udev/rules.d$ adb devices List of dev ...

  4. 三维模型3DTile格式轻量化的跨平台兼容性问题分析

    三维模型3DTile格式轻量化的跨平台兼容性问题分析 三维模型3DTile格式是一种开放的.高效的和互操作的空间信息数据格式.然而,它作为一种新兴的技术,其在轻量化与跨平台兼容性方面存在着一些问题. ...

  5. MongoDB4.0.11服务没有响应控制功能解决办法

    如图 MongDB安装好后启动服务失败 解决办法 进入到你的MongDB bin目录下执行 mongod.exe --remove --serviceName "MongoDB" ...

  6. C# WinForm 获取执行路径的几种常见方法

    //1.获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; Co ...

  7. java反序列化-CC1

    CC1 目录 CC1 1.Transformer接口 2.Transformer的实现类 ConstantTransformer ChainedTransformer InvokerTransform ...

  8. Python爬虫爬取全球疫情数据并存储到mysql数据库

    思路:使用Python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个    字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把    数据存储到mysql数据库 ...

  9. mybatis学习笔记(可复用的相关配置信息)

    结果集映射: resultMap解决数据库字段名和属性名不一致的问题 id name pwd id name password column 是数据库的字段名 property 是实体类的属性名 &l ...

  10. LeetCode 416. 分割等和子集(bitset优化)

    LeetCode 416. 分割等和子集 1 题目描述 给你一个只包含正整数的非空数组nums.请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 1.1 输入测试 示例 1: 输入 ...