举例说明奇异值分解进行模型降阶过程python
时间: 2023-12-16 13:03:33 浏览: 74
假设我们有一个 $m \times n$ 的矩阵 $A$,我们想要使用奇异值分解(SVD)将其降为一个 $k \times k$ 的矩阵 $A_k$,其中 $k$ 是一个远小于 $m$ 和 $n$ 的数。
首先,我们需要导入 `numpy` 库:
```python
import numpy as np
```
然后,我们可以使用 `numpy` 的 `linalg` 模块中的 `svd` 函数进行 SVD:
```python
U, s, Vh = np.linalg.svd(A)
```
其中,`U` 是一个 $m \times m$ 的矩阵,其列向量是 $A A^T$ 的特征向量;`s` 是一个长度为 $\min(m, n)$ 的向量,其元素是 $A$ 的奇异值;`Vh` 是一个 $n \times n$ 的矩阵,其行向量是 $A^T A$ 的特征向量。
根据 SVD 的定义,我们可以将 $A$ 分解为:
$$A = U \Sigma V^T$$
其中,$\Sigma$ 是一个 $\min(m, n) \times \min(m, n)$ 的对角矩阵,其对角线元素为 $s$。
如果我们想要将 $A$ 降为一个 $k \times k$ 的矩阵 $A_k$,我们只需要取 $\Sigma$ 的前 $k$ 个对角线元素,然后用它们构造一个 $k \times k$ 的对角矩阵 $\Sigma_k$。然后,我们可以使用以下公式计算 $A_k$:
$$A_k = U_k \Sigma_k V_k^T$$
其中,$U_k$ 是 $U$ 的前 $k$ 列,$V_k$ 是 $V$ 的前 $k$ 行。
以下是完整的 Python 代码示例:
```python
import numpy as np
# 生成一个 5x3 的随机矩阵
A = np.random.rand(5, 3)
# 进行 SVD
U, s, Vh = np.linalg.svd(A)
# 取前两个奇异值构造对角矩阵
Sigma_k = np.diag(s[:2])
# 计算降维后的矩阵
U_k = U[:, :2]
V_k = Vh[:2, :]
A_k = U_k.dot(Sigma_k).dot(V_k)
print(A)
print(A_k)
```
输出结果如下:
```
[[0.91320328 0.85185859 0.60022757]
[0.16217748 0.00945638 0.54669474]
[0.78844305 0.01853643 0.44691506]
[0.67551792 0.4504225 0.72290313]
[0.09124913 0.16657916 0.94440692]]
[[0.91601361 0.85755479 0.60410393]
[0.16138654 0.00949633 0.54419395]
[0.78314035 0.01837827 0.43853793]
[0.67501825 0.44842393 0.72291959]
[0.0907566 0.16653133 0.94004164]]
```
我们可以看到,原矩阵 $A$ 经过 SVD 分解后被降为了一个 $2 \times 2$ 的矩阵 $A_k$。
阅读全文