SVD奇异值分解与PCA

2022-11-14 21:01:29 SVD 编辑:黎为乐

1、特征值和特征向量

Ax=λx

A为n*n的方阵,x是一维向量,x是矩阵A的特征值λ所对应的特征值向量

2、特征值分解(方阵)

矩阵A的n个特征值λ1<=λ2<=...<=λn,以及这n个特征值对应的特征向量{w1,w2,...,wn}

矩阵A的特征值分解:A=WΣW⁻¹

通常的我们会将这n个W特征向量标准化,即||Wi||²=1,或者WiTWi=1,此时W的n个特征向量为标准正交基,满足WiTWi = 1,即W.T = w-1,也就是说W为酉矩阵

3、SVD(矩阵)


定义:A=UΣVT(A为m*n的矩阵,U为m*m的方阵,V为n*n的方阵,U和V都是酉矩阵)

求解:

如果我们将A的转置和A做矩阵乘法,那么会得到n*n的一个方阵ATA。既然ATA是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

(ATA)vi=λivi

这样我们就可以得到矩阵ATA的n个特征值和对应的n个特征向量v了。将AT A的所有特征向量张成一个n*n的矩阵V ,就是我们SVD公式里面的V矩阵了。一般我们将V中的每 个特征向量叫做A的右奇异向量。

如果我们将A和A的转置做矩阵乘法,那么会得到m*m的一一个方阵AAT。 既然AAT是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

(AAT)ui=λiui

这样我们就可以得到矩阵AAT的m个特征值和对应的m个特征向量u了。将AAT的所有特征向量张成一个m x m的矩阵U ,就是我们SVD公式里面的U矩阵了。-般我们将U中的每个特征向量叫做A的左奇异向量。


U和V我们都求出来了, 现在就剩下奇异值矩阵习没有求出了。由于乙除了对角线上是奇异值其他位置都是0 ,那我们只需要求出每个奇异值σ就可以了。

A=UΣVT=>AV=UΣVTV=>AV=UΣ=>Avi=σiui=>σi=Avi/ui


4、SVD性质

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1 %的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。


5、求解



看看数学解释吧。


下面给出PCA降维的代码:

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

# 载入样本
iris = load_iris()
X, y = iris.data, iris.target


# 降维、设置参数
pca3 = PCA(n_components=3)  # 降到3d
X3 = pca3.fit_transform(X)
print(pca3.explained_variance_ratio_)


pca2 = PCA(n_components=2)  # 降到2d
X2 = pca2.fit_transform(X)
print(pca2.explained_variance_ratio_)

# 绘图
ax = mplot3d.Axes3D(plt.figure(figsize=(4, 3)))
ax.scatter(X3[:, 0], X3[:, 1], X3[:, 2], s=88, c=y, alpha=0.5)
plt.show()

plt.scatter(X2[:, 0], X2[:, 1], s=88, c=y, alpha=0.5)
plt.show()


©AHIEC人工智能工作室 2021

地址:安徽省合肥市包河区梁园路安徽工业经济职业技术学院现代科教中心101室

创作者信息:

皖ICP备20011723号-2