# PCA算法
## 1. PCA概述
PCA算法全称是 Principal Component Analysis,即主成分分析算法。它是一种维数约减(Dimensionality Reduction)算法,即把高维度数据在损失最小的情况下转换为低维度数据的算法。显然,PCA可以用来对数据进行压缩,可以在可控的失真范围内提高运算速度。。
## 2. PCA算法原理
我们先从最简单的情况谈起,假设需要把一个二维数据降维成一维数据,要怎么做呢?如下图所示。
![img](https://cdn.jsdelivr.net/gh/dongzhougu/imageuse1/17634123-805dbb25ada21691.png)
我们可以想办法找出一个向量 $u^{(1)}$ ,以便让二维数据的点(方形点)到这个向量所在的直线上的平均距离最短,即投射误差最小。
这样就可以在失真最小的情况下,把二维数据转换为向量 $u^{(1)}$ ,所在直线上的一维数据。再进一步,假设需要把三维数据降为二维数据时,我们需要找出两个向量 $u^{(1)}$ 和 $u^{(2)}$ ,以便让三维数据的点在这两个向量决定的平面上的投射误差最小。
如果从数学角度来一般地描述PCA算法就是:当需要从n维数据降为k维数据时,需要找出k个向量
$u^{(1)}$ , $u^{(2)}$ ,…… $u^{(k)}$ ,把n维的数据投射到这k个向量决定的线性空间里,最终使投射误差最小化的过程。
问题来了,**怎样找出投射误差最小的k个向量呢**?要完整的用数学公式推导这个方法,涉及较多高级线性代数的知识,这里不再详述。感兴趣的话可以参考后面扩展部分的内容。下面我们直接介绍PCA算法求解的一般步骤。
假设有一个数据集,用m x n维的矩阵A表示。矩阵中每一行表示一个样本,每一列表示一个特征,总共有m个样本,每个样本有n个特征。我们的目标是减少特征个数,保留最重要的k个特征。
### 2.1数据归一化和缩放
数据归一化和缩放是一种数学技巧,旨在提高PCA运算时的效率。数据归一化的目标是使特征的均值为0。数据归一化公式为:
$$
x_{j}^{(i)}=a_{j}^{(i)}-\mu_{j}
$$
其中,$a_{j}^{(i)}$是指第i个样本的第j个特征的值,$\mu_{j}$表示的是第j个特征的均值。当不同的特征值不在同一个数量级上的时候,还需要对数据进行缩放。数据归一化在缩放的公式为:
$$
x_{j}^{(i)}=\frac{a_{j}^{(i)}-\mu_{j}}{s_{j}}
$$
其中,$a_{j}^{(i)}$是指第i个样本的第j个特征的值,$\mu_{j}$表示的是第j个特征的均值。$s_{j}$表示第j个特征的范围,即 $s_{j} = max(a_{j}^{(i)})-min(a_{j}^{(i)})$
### 2.2 计算协方差矩阵的特征向量
针对预处理后的矩阵X,先计算其协方差矩阵(Covariance Matrix):
$$
\Sigma=\frac{1}{m} X^{T} X
$$
其中,$\Sigma $ 表示协方差矩阵,用大写的Sigma表示,是一个n * n维的矩阵。
接着通过奇异值分解来计算协方差矩阵的特征向量:
$$
[U, S, V]=s v d(\Sigma)
$$
其中,svd 是奇异值分解(Singular Value Decomposition)运算,是高级线性代数的内容。经过奇异值分解后,有3个返回值,其中矩阵U是一个n * n的矩阵,如果我们选择U的列作为向量,那么我们将得到n个列向量 $u^{(1)}$ , $u^{(2)}$ ,…… $u^{(n)}$ ,这些向量就是协方差矩阵的特征向量。它表示的物理意义是,协方差矩阵 $\Sigma $ 可以由这些特征向量进行线性组合得到。
### 2.3 数据降维和恢复
得到特征矩阵后,就可以对数据进行降维处理了。假设降维前的值是 $x^{(i)}$,降维后是$z^{(i)}$,那么
$$
z^{(i)}=U_{r e d u c e}^{T} x^{(i)}
$$
其中,$U_{r e d u c e}=[u^{(1)} ,u^{(2)},……u^{(k)}]$ ,它选取自矩阵U的前k个向量,$U_{r e d u c e}$
称为主成分特征矩阵,它是数据降维和恢复的关键中间变量。看一下数据维度,$U_{r e d u c e}$是n * k的矩阵,因此 $U_{r e d u c e}^{T}$是k * n的矩阵.
也可以用矩阵运算一次性转换多个向量,提高效率。假设X是行向量 $x^{(i)}$组成的矩阵,则
$$
Z=X U_{\text {reduce}}
$$
其中,X是m * n的矩阵,降维后的矩阵Z是一个m * k的矩阵。
数据降维后,怎么恢复呢?从前面的计算公式我们知道,降维后的数据计算公式
$ z^{(i)}=U_{r e d u c e}^{T} x^{(i)} $ 。所以如果要还原数据,可以使用下面的公式:
$$
x_{a p p r o x}^{(i)}=U_{r e d u c e} z^{(i)}
$$
其中,$U_{r e d u c e}$是n * k的矩阵,$z^{(i)}$是k维列向量。这样算出来的$x^{(i)} $就是n维列向量。
矩阵化数据恢复运算公式为:
$$
X_{approx}=Z U_{r e d u c e}^{T}
$$
其中, $X_{approx}$ 是还原回来的数据,是一个m * n的矩阵,每行表示一个训练样例。Z是一个m * k的矩阵,是降维后的数据。
## 3. PCA算法示例
假设我们的数据集总共有5个记录,每个记录有2个特征,这样构成的矩阵A为:
$$
A=\left[\begin{array}{ll}
3 & 2000 \\
2 & 3000 \\
4 & 5000 \\
5 & 8000 \\
1 & 2000
\end{array}\right]
$$
我们的目标是把二维数据降为一维数据。为了更好地理解PCA的计算过程,分别使用 Numpy和sklearn 对同一个数据进行PCA降维处理。
### 3.1 使用Numpy模拟PCA计算过程
```python
import numpy as np
A = np.array([[3,2000],
[2,3000],
[4,5000],
[5,8000],
[1,2000]],dtype='float')
# 数据归一化,axis=0表示按列归一化
mean = np.mean(A,axis=0)
norm = A - mean
# 数据缩放
score = np.max(norm,axis=0)-np.min(norm,axis=0)
norm = norm / score
print(norm)
```
由于两个特征的均值不在同一个数量级,所以对数据进行了缩放。输出如下:
```python
array([[ 0. , -0.33333333],
[-0.25 , -0.16666667],
[ 0.25 , 0.16666667],
[ 0.5 , 0.66666667],
[-0.5 , -0.33333333]])
```
接着,对协方差矩阵进行奇异值分解,求解其特征向量:
```python
U,S,V = np.linalg.svd(np.dot(norm.T,norm))
print(U)
```
输出如下:
```python
array([[-0.67710949, -0.73588229],
[-0.73588229, 0.67710949]])
```
由于需要把二维数据降为一维数据,因此只取特征矩阵的第一列(前k列)来构造主成分特征矩阵$U_{reduce}$
```python
U_reduce = U[:,0].reshape(2,1)
U_reduce
```
输出如下:
```python
array([[-0.67710949],
[-0.73588229]])
```
有了主成分特征矩阵,就可以对数据进行降维了:
```python
R = np.dot(norm,U_reduce)
print(R)
```
输出如下:
```python
array([[ 0.2452941 ],
[ 0.29192442],
[-0.29192442],
[-0.82914294],
[ 0.58384884]])
```
这样就把二维的数据降为一维的数据了。如果需要还原数据,依照PCA数据恢复的计算公式,可得:
```python
Z = np.dot(R,U_reduce.T)
print(Z)
```
输出如下:
```python
array([[-0.16609096, -0.18050758],
[-0.19766479, -0.21482201],
[ 0.19766479, 0.21482201],
[ 0.56142055, 0.6101516 ],
[-0.39532959, -0.42964402]])
```
由于我们在数据预处理阶段对数据进行了归一化,并且做了缩放处理,所以需要进一步还原才能得到原始数据,这一步是数据预处理的逆运算。
```python
A1 = np.multiply(Z,scope)+mean
print(A1)
```
其中,np.multiply是矩阵对应元素相乘,np.dot是矩阵的行乘以矩阵的列。输出如下:
```python
array([[2.33563616e+00, 2.91695452e+03],
[2.20934082e+00, 2.71106794e+03],
[3.79065918e+00, 5.28893206e+03],
[5.24568220e+00, 7.66090960e+03],
[1.41868164e+00, 1.42213588e+03]])
```
与原始矩阵A相比,恢复后的数据A1还是存在一定程度的失真,这种失真是不可避免的。
### 3.2 使用sklearn进行PCA降维运算
在 `sklearn`工具包里,类 `sklearn.decomposition.PCA` 实现了 PCA 算法,使用方便,不需
没有合适的资源?快使用搜索试试~ 我知道了~
scikit-learn 机器学习,算法实现,python.zip
共2000个文件
xml:29个
py:14个
md:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 166 浏览量
2024-05-08
10:45:18
上传
评论
收藏 7.26MB ZIP 举报
温馨提示
scikit-learn 机器学习,算法实现,python
资源推荐
资源详情
资源评论
收起资源包目录
scikit-learn 机器学习,算法实现,python.zip (2000个子文件)
10629-15886 928B
10630-15364 990B
10631-16122 1KB
10632-15558 2KB
10633-15287 3KB
10634-15975 2KB
10635-15584 3KB
10636-15643 435B
10637-15528 2KB
10638-16115 2KB
10639-15776 761B
10640-14985 904B
10641-15872 556B
10642-15237 213B
10643-15436 2KB
10644-15432 1KB
10645-16000 1KB
10646-16086 1KB
10647-15996 1KB
10648-15866 2KB
10649-15453 1KB
10650-16121 4KB
10651-15744 2KB
10652-15992 1KB
10653-15977 1KB
10654-15224 1KB
10655-15571 401B
10656-15425 726B
10657-15467 1KB
10658-15892 2KB
10659-15404 1KB
10660-15615 874B
10661-15770 858B
10662-16140 1KB
10663-15552 3KB
10664-15420 1015B
10665-15699 612B
10666-15599 1KB
10667-15631 2KB
10668-16030 2KB
10669-15182 1KB
10670-14982 530B
10671-15464 807B
10672-15497 816B
10673-15647 1KB
10674-15882 916B
10675-16035 1KB
10676-15316 1KB
10677-15988 961B
10678-16089 3KB
10679-15932 1KB
10680-15173 3KB
10681-16028 2KB
10682-15984 305B
10683-16143 582B
10684-15827 1KB
10685-15688 977B
10686-15412 474B
10687-15179 857B
10688-15339 1KB
10689-15427 3KB
10690-15926 1KB
10691-16137 2KB
10692-16009 730B
10693-16127 2KB
10694-15678 1KB
10695-15677 999B
10696-15764 1KB
10697-15218 972B
10698-15922 786B
10699-15603 4KB
10700-16036 1KB
10701-15172 2KB
10702-15781 2KB
10703-15302 739B
10704-15848 886B
10705-15000 508B
10706-15239 2KB
10707-15446 2KB
10708-15668 2KB
10709-15353 1KB
10710-15219 13KB
10711-15262 570B
10712-15981 2KB
10713-15847 536B
10714-15804 735B
10715-15530 2KB
10716-15858 956B
10717-15478 1KB
10718-15524 731B
10719-15503 3KB
10720-15803 1KB
10721-15969 1KB
10722-15912 514B
10723-15763 2KB
10724-14994 887B
10725-15881 1KB
10726-15325 718B
10727-16042 2KB
10728-15903 8KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
生瓜蛋子
- 粉丝: 3828
- 资源: 6047
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功