| |
|
开发:
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 个特征来描述它: 或者我们再创建一个向量来描述它,这里用向量
z
\boldsymbol{z}
z: 这样就把二维的数降低到一维了。虽然维度降低了,但是没有损失信息。 还有从 3 维降低到 2 维的例子:
2. 可视化降维还可以用于数据可视化。 如果要将这个
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)。 下面这个图是从
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) : (2) : 计算协方差矩阵
Σ
\Sigma
Σ: 对协方差矩阵 Σ \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) : 其中 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=1∑m?∥x(i)?xapprox(i)?∥2
数据的变差为:
1
m
∑
i
=
1
m
∥
x
(
i
)
∥
2
\frac{1}{m}\sum^m_{i=1}\| \boldsymbol{x}^{(i)} \| ^2
m1?i=1∑m?∥x(i)∥2 假如我们取到一个
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) 另外, 0.05 0.05 0.05 也是经常用到的数值,也就是 5 % 5\% 5%。表示保留了 95 % 95\% 95% 的差异性。
怎样找到 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
? 还有一种做法是: 如果
∑
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) 这种计算方式简便又高效,可以代替式子(1)。 一些使用建议
?
\bullet
??通常不在训练的时候用 PCA 来解决过拟合问题。请使用正则化。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |