IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 主成分分析(Principal Component Analysis,PCA) -> 正文阅读

[人工智能]主成分分析(Principal Component Analysis,PCA)

降维(Dimensionality Reduction)问题

1. 压缩数据

降维可以压缩数据,使数据占用更少的计算机内存和硬盘空间,或者是给算法提速。

举一个例子,假如你有一组数据,用 2 个特征来描述它:
在这里插入图片描述
这 2 个特征都表示长度,存在冗余,完全可以只用其中一个。而且从数据分布来看,似乎都在一条直线上。

或者我们再创建一个向量来描述它,这里用向量 z \boldsymbol{z} z
在这里插入图片描述
通过某种关系把特征 x 1 x_1 x1? 和特征 x 2 x_2 x2? 融合成一个新的特征 z z z,把 z z z 单独拿出来:


在这里插入图片描述


这样就把二维的数降低到一维了。虽然维度降低了,但是没有损失信息。


还有从 3 维降低到 2 维的例子:

在这里插入图片描述
这是一组 3 3 3 维数据,而它们刚好处于一个 2 2 2 维平面,所以可以降到 2 2 2 维。


2. 可视化

降维还可以用于数据可视化
在这里插入图片描述
假如有关于许多不同国家的数据,每一个特征向量都有 50 50 50 个特征(如GDP,人均GDP,平均寿命等)。

如果要将这个 50 50 50 维的数据可视化是不可能的。可以降到 2 2 2 维来可视化:
在这里插入图片描述
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。


主成分分析

对于降维问题来说,目前最流行最常用的算法是 主成分分析 (Principal Componet Analysis, PCA) 法。

假如有一组二维数据,我们会想办法找到一条向量,把它们投影上去:
在这里插入图片描述
注意这里是垂直于向量(那条红线)投影的;之前线性回归的均方误差是垂直于横轴的。注意区分。

我们希望所有 投射误差 加起来最小

像这种明显不太合适,投射误差太大:
在这里插入图片描述

如果我们有 n n n 维的数据,要压缩成 k k k 维,那就要找到 k k k 个向量: u ( 1 ) u^{(1)} u(1) u ( 2 ) u^{(2)} u(2) ? \cdots ? u ( k ) u^{(k)} u(k)
把数据投影到这 k k k 个向量表示的空间上,来最小化投射误差。

下面这个图是从 3 3 3 维投射到 2 2 2 维的示意图:
在这里插入图片描述


具体做法:

假设数据集里有 m m m 个数据: x ( 1 ) \boldsymbol{x}^{(1)} x(1) x ( 2 ) \boldsymbol{x}^{(2)} x(2) … \dots x ( m ) \boldsymbol{x}^{(m)} x(m)

x \boldsymbol{x} x n n n 维的: x = [ x 1 ???? x 2 ???? ? ???? x n ] T \boldsymbol{x}=\begin{bmatrix} x_1 \; \; x_2 \; \; \cdots \; \; x_n \end{bmatrix}^T x=[x1?x2??xn??]T,我们要降到 k k k 维,降维后的数据为 z \boldsymbol{z} z

(1) :
首先对数据做标准化
算出每个维度的均值 μ j \mu_j μj? 和方差 σ j 2 \sigma_j^2 σj2? j ∈ [ 1 , ? n ] j \in[1,\,n] j[1,n]
对数据集做预处理,每个维度先减均值然后除以方差。

(2) :
然后,怎样把 x \boldsymbol{x} x 投影到 k k k 维空间呢? 我们需要找到一个转换矩阵: U r e d u c e \text{U}_{reduce} Ureduce?

计算协方差矩阵 Σ \Sigma Σ
Σ = 1 m ∑ i = 1 m ( x ( i ) ) ( x ( i ) ) T \Sigma = \dfrac{1}{m} \sum^m_{i=1} (\boldsymbol{x}^{(i)}) (\boldsymbol{x}^{(i)})^T Σ=m1?i=1m?(x(i))(x(i))T

对协方差矩阵 Σ \Sigma Σ 做奇异值分解(SVD),得到 3 3 3 个矩阵 : U \text{U} U S \text{S} S V \text{V} V

其中 U \text{U} U 是一个 n × n n\times n n×n 矩阵,设它的列向量为 u 1 \boldsymbol{u}_1 u1? u 2 \boldsymbol{u}_2 u2? … \dots u n \boldsymbol{u}_n un?

我们要降到 k k k 维,则取 U \text{U} U 的前 k k k 个列向量组成新的矩阵 U r e d u c e \text{U}_{reduce} Ureduce? ,它的维度是 n × k n\times k n×k

(3) :
通过下面计算得到降维后的 z z z z = U r e d u c e T ? x \boldsymbol{z} = \text{U}_{reduce}^T * \boldsymbol{x} z=UreduceT??x

其中 x \boldsymbol{x} x n × 1 n \times 1 n×1 维的, z \boldsymbol{z} z k × 1 k \times 1 k×1 维的。



主成分数量( k k k)的选择

假设原始数据为 x \boldsymbol{x} x,投射后为 x a p p r o x \boldsymbol{x}_{approx} xapprox?,我们的均方误差为: 1 m ∑ i = 1 m ∥ x ( i ) ? x a p p r o x ( i ) ∥ 2 \frac{1}{m}\sum^m_{i=1}\| \boldsymbol{x}^{(i)} - \boldsymbol{x}_{approx}^{(i)}\| ^2 m1?i=1m?x(i)?xapprox(i)?2

前面讲了降维后的数据为 z = U r e d u c e T ? x \boldsymbol{z} = \text{U}_{reduce}^T * \boldsymbol{x} z=UreduceT??x
反过来就是 z \boldsymbol{z} z 在原始空间的值: x a p p r o x = U r e d u c e ? z \boldsymbol{x}_{approx} = \text{U}_{reduce} * \boldsymbol{z} xapprox?=Ureduce??z。这里 x a p p r o x ≈ x \boldsymbol{x}_{approx} \approx \boldsymbol{x} xapprox?x,与原始空间维度一致。

数据的变差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \frac{1}{m}\sum^m_{i=1}\| \boldsymbol{x}^{(i)} \| ^2 m1?i=1m?x(i)2
意思是,平均来说我们的数据距离 0 0 0 有多远。(数据已经经过标准化了,所以平均值为 0 0 0

假如我们取到一个 k k k 值,投射后能够满足下面的比例: 1 m ∑ i = 1 m ∥ x ( i ) ? x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 ≤ 0.01 ( 1 % ) (1) \dfrac{\frac{1}{m}\sum^m_{i=1}\| \boldsymbol{x}^{(i)} - \boldsymbol{x}_{approx}^{(i)}\| ^2} {\frac{1}{m}\sum^m_{i=1}\| \boldsymbol{x}^{(i)} \| ^2} \leq 0.01 \qquad (1\%) \tag{1} m1?i=1m?x(i)2m1?i=1m?x(i)?xapprox(i)?2?0.01(1%)(1)
则表示我们降维后保留了 99 % 99\% 99% 的差异性。

另外, 0.05 0.05 0.05 也是经常用到的数值,也就是 5 % 5\% 5%。表示保留了 95 % 95\% 95% 的差异性。

在实践中,你经常会发现进行了大幅降维后,仍然能保持 99 % 99\% 99% 的差异性。因为大部分现实中的数据,许多特征变量之间都是高度相关的。

怎样找到 k k k 值呢?

? \bullet ? 通常会从 k = 1 k=1 k=1 开始,用 SVD 计算变换矩阵 U r e d u c e \text{U}_{reduce} Ureduce?,对数据降维后,计算上面式子(1)得到比值。如果不满足预定的比值(例如 0.01 0.01 0.01),则继续增大 k k k,直到刚好满足为止。

? \bullet ? 还有一种做法是:
当你用 SVD 的时候得到 3 3 3 个矩阵 : U \text{U} U S \text{S} S V \text{V} V
其中 S \text{S} S 是一个 n × n n \times n n×n 的对角矩阵,对角元素为 s 1 s_1 s1? s 2 s_2 s2? … \dots s n s_n sn?。其余元素都是 0 0 0
对角项之和为 ∑ i = 1 n s i \sum^n_{i=1} s_i i=1n?si?,对角项的前 k k k 项之和为 ∑ i = 1 k s i \sum^k_{i=1} s_i i=1k?si?

如果 ∑ i = 1 k s i ∑ i = 1 n s i ≥ 0.99 ( 99 % ) (2) \dfrac{\sum^k_{i=1} s_i}{\sum^n_{i=1} s_i} \geq 0.99 \qquad (99\%)\tag{2} i=1n?si?i=1k?si??0.99(99%)(2)
则表示保留了 99 % 99\% 99% 的差异性。

这种计算方式简便又高效,可以代替式子(1)。
只需要计算一次 SVD,然后逐渐增大 k k k 值校验是否满足式子(2)即可。



一些使用建议

? \bullet ??通常不在训练的时候用 PCA 来解决过拟合问题。请使用正则化。
? \bullet ??开始的时候不要用 PCA,先用上所有的特征来学习。只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用 PCA。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:44:45  更:2021-08-16 11:44:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:03:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码