PCA与SVD之间的关系

PCA

在用数据对模型进行训练时,通常会遇到维度过高,也就是数据的特征太多的问题,有时特征之间还存在一定的相关性,这时如果还使用原数据训练模型,模型的精度会大大下降,因此要降低数据的维度,同时新数据的特征之间还要保持线性无关。有一种方法称为主成分分析(Principal component analysis,PCA),新数据的特征称为主成分,得到主成分的方法有两种:直接对协方差矩阵进行特征值分解和对数据矩阵进行奇异值分解(SVD)。

主成分分析

一种经典的数据降维算法,推导过程有多种形式:最近重构性、最大可区分性等。这里以最大可区分性为例。

数据集

设$X\in R^{n\times d} = {x_1, x_2,\dots, x_n}$为数据集,包含$n$个样本,每个样本有$d$维特征, 即$x_i\in R^{d}$。

降维可视化

降维的目的,是为了找到一个映射矩阵$W\in R^{k\times d}$,将原始数据都映射到d维空间中。

如图所示,以2维空间到1维空间降维为例。原数据在直线上的映射点的位置之与直线的斜率(或者说是方向向量)有关,且直线是可以平移的。因此我们假设目标直线是过原点的,即:$Wx = 0$。

W求解过程

每一个数据点$x_i$映射到直线$Wx=0$上之后,映射点为:$Wx_i$

那么数据集$X$映射后的数据为:$XW^T\in R^{n\times k}$

step1: 映射矩阵$W\in R^{k\times d}$将数据集$X$映射到$k$维空间:$XW^{T}$

step2: 映射后,数据的协方差矩阵为:$(XW^{T})^{T}(XW^{T})=WX^{T}XW^{T}$

最大可区分性,就是使得数据在各个维度上的方差最大,也就是数据最分散,越分散区分性越大。因此最大可区分性的优化目标就是,数据集在各位维度上的方差最大化。而各个维度的方差等于协方差矩阵的对角元素之和,也就是矩阵的迹。

step3: 因此优化目标:$min \text{tr}(WX^{T}XW^{T}), s.t. WW^T = I$

step4: 拉格朗日法求解,可得:$X^TXW^T = \lambda W$

$W$的解为矩阵$X^TX$的特征向量。

与SVD的关系

奇异值分解,对于矩阵X,其奇异值分解为: $X = U\Sigma V^T$

而矩阵$X^TX = (U\Sigma V)^TU\Sigma V^T = V\Sigma U^TU\Sigma V^T = V\Sigma^2 V^T$

因此矩阵$X^TX$的特征值构成的矩阵$V$即为矩阵$X$奇异值分解后的右特征矩阵。

1
2
3
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
1
2
3
iris = datasets.load_iris()
X = iris['data']
Y = iris['target']
1
2
3
4
5
'''normalization mean = 0, std = 1'''
X_normed = (X - X.mean(axis=0)) / X.std(axis=0)

'''SVD of X_normed'''
U, Sigma, VT = np.linalg.svd(X_normed)
1
2
'''take the vector from V'''
W = VT.T[:2,:]
1
2
'''conduct PCA 降维'''
X_pca = X_normed.dot(W.T)
1
2
'''visualization'''
plt.scatter(X_pca[:,0],X_pca[:,1], c=Y)
~赞~

么么哒,请我喝杯咖啡吧~

支付宝
微信