waterman 发表于 2025-1-21 15:00

《深度学习的数学——使用Python语言》8. 线代进阶之”主成分分析与奇异值分解“

# 主成分分析
在多变量大数据集的研究与应用中,数据采集和分析的复杂性增加,主要因为许多变量之间存在相关性。孤立地分析每个指标不仅效率低,还可能导致信息损失和错误结论。为了有效利用数据中的信息并减少分析维度,可以采用降维技术,如主成分分析(PCA)。这些方法通过合并相关变量来降低数据维度,同时尽量保留原指标的信息,确保新变量能代表原始数据中的关键信息。降维不仅可以简化模型、去除噪声和不重要的特征,还能显著提升数据处理速度,节省时间和成本。
主成分分析(PCA)是一种广泛使用的数据降维算法,其核心思想是将高维特征映射到低维空间中的新正交特征(即主成分)。PCA通过选择原始数据中方差最大的方向作为第一个坐标轴,然后在与之前坐标轴正交的平面中选择方差最大的方向作为后续坐标轴,依次类推。这样,大部分方差集中在前k个坐标轴上,而后面的坐标轴所含方差几乎为零。因此,可以忽略这些方差极小的坐标轴,仅保留包含绝大部分方差的前k个坐标轴,从而实现数据的有效降维,简化数据结构并提高计算效率。
PCA的工作流程如下:

1. 对数据去均值
2. 计算去均值后的数据的协方差矩阵
3. 计算协方差矩阵的特征值和特征向量
4. 对特征值的绝对值从大到小进行排序
5. 去掉幅度最小的几个特征值和对应的特征向量
6. 用余下的特征向量构造变换矩阵W
7. 利用变换矩阵将原始值变换为新的值,即x‘=Wx

实现代码如下:
1. 导入必要的库
```python
import numpy as np
from sklearn.datasets import load_iris
```
2. 导入iris数据集并去除均值
```
iris = load_iris().data.copy()
labels = load_iris().target.copy()
m = iris.mean(axis=0)
ir = iris - m
```
3. 计算协方差矩阵,特征值和特征向量
```
cv = np.cov(ir, rowvar=False)
val, vec = np.linalg.eig(cv)
```
4. 对特征值进行从大到小排序
```
val = np.abs(val)
idx = np.argsort(val)[::-1]
ex = val / val.sum()
print("fraction explained: ", ex)
```
5. 提取主成分并构造新的特征
```
w = np.vstack((vec[:,idx],vec[:,idx]))
d = np.zeros((ir.shape,2))
for i in range(ir.shape):
    d = np.dot(w,ir)
```
从第4步的打印结果来看,前2个主成分已经解释了数据集中接近98%的方差,故只需要保留其中的前两个主成分即可。

之后我们绘制出经过变换后的新的数据集如下:

可以看到,不同类别数据之间有较好的区分度,从而使得整个数据集变得更容易处理。
此外,再sklearn.decomposition模块中,可提供了PCA类,能够帮助我们快速实现主成分分析的计算。
```
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(ir)
dd = pca.fit_transform(ir)
```
其中首先制定了所需的成分数,之后调用fit生成了转移矩阵,之后调用fit_transform函数完成特征变换,最终的变量d就是降维后生成的新数据。
# 奇异值分解
奇异值分解(SVD)是一项非常有用的技术。利用SVD,我们可以将任意矩阵分解成为3个具有特殊性质的矩阵相乘形式。在通信中,我们能够基于SVD来设计人工噪声。通式如下:

其中SVD将m*n大小的矩阵A分解为了m*m的正交矩阵U、m*n的对角矩阵以及n*n的正交矩阵V。其中对角矩阵中的元素为奇异值,等于A的转置乘A的正特征值的平方根。
代码实现如下:
```
import numpy as np
from scipy.linalg import svd as SVD
a = np.array([,])
u,s,vt = SVD(a)
print(f"u={u}")
print(f"s={s}")
print(f"vt={vt}")
```
运行结果如下:

FreddieJohn 发表于 2025-1-21 15:37

<p>谢谢分享</p>

waterman 发表于 2025-1-21 16:38

FreddieJohn 发表于 2025-1-21 15:37
谢谢分享

<p>一起学习进步<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
页: [1]
查看完整版本: 《深度学习的数学——使用Python语言》8. 线代进阶之”主成分分析与奇异值分解“