PCA 学习自 A tutorial on Principal Components Analysis(Lindsay. Smith-2002)
去相关和白化 学习自 Topic: Decorrelating and then Whitening data (Rosalind W. Picard)
文中提到的前置知识:样本均值,样本方差,协方差,协方差矩阵,特征值,特征向量。
问题:样本的很多特征是冗余的,如何选择出合适的特征?
目标:
{ x 1 , x 2 , . . . , x m } − − > { y 1 , y 2 , . . . , y m } \{x_1, x_2, ..., x_m\} --> \{y_1, y_2, ..., y_m\} {x1,x2,...,xm}−−>{y1,y2,...,ym}
样本数量: m − − > m m-->m m−−>m
样本维度: n − − > k , n > k n-->k,n>k n−−>k,n>k
实现降维。
特征选择:特征为n维的数据中选择出k维
特征提取:特征为n维的数据进行变换f(·),得到特征为k维的数据。
PCA是特征提取的一种方法。
定义: 流程: ①Zero-mean data: 问题:在不改变特征维度的情况下,如何让数据各个维度有区分度? 已知: 去相关: 定义: Σ x = E ( x x T ) \Sigma_{x}=E(\bold{xx^T}) Σx=E(xxT) 流程: ①求解 Σ x \Sigma_x Σx的 Φ \Phi Φ和 Λ \Lambda Λ。 在去相关的基础上, 白化:令对角阵 Λ \Lambda Λ的每个元素相等,使得 Σ y \Sigma_y Σy变换为对角阵 Σ w h i t e \Sigma_{white} Σwhite。 I I I : 单位矩阵 Λ − 1 2 Λ Λ − 1 2 = I \Lambda^{-\frac{1}{2}}\Lambda \Lambda^{-\frac{1}{2}}=I Λ−21ΛΛ−21=I 令 w = Λ − 1 2 y = Λ − 1 2 Φ T x \bold{w} = \Lambda^{-\frac{1}{2}}\bold{y}= \Lambda^{-\frac{1}{2}} \Phi^{T}\bold{x} w=Λ−21y=Λ−21ΦTx 则有: 对角化和白化都是矩阵通过线性变化得到。
样本数 = m
特征维度 = n
降低的维度 = k, k
M i n p u t ( m , n ) − − > M m e a n ( m , n ) − − > M c o v ( n , n ) − − > M s e l e c t ( n , k ) − − > M r e d u c e ( m , k ) M_{input} (m, n) -->M_{mean} (m, n)--> M_{cov} (n, n) --> M_{select} (n,k) --> M_{reduce} (m,k) Minput(m,n)−−>Mmean(m,n)−−>Mcov(n,n)−−>Mselect(n,k)−−>Mreduce(m,k)
M i n p u t ( m , n ) M_{input} (m, n) Minput(m,n)各维度的数据减去各维度均值, 记矩阵为 M m e a n ( m , n ) M_{mean} (m, n) Mmean(m,n)
②计算协方差矩阵 M c o v ( n , n ) M_{cov} (n, n) Mcov(n,n),及其特征值和特征向量。此时的特征向量的单位向量。
③特征值降序排列,选择前k个特征值对应的特征向量组成矩阵 M s e l e c t ( n , k ) M_{select} (n,k) Mselect(n,k)
④计算降维矩阵 M r e d u c e ( m , k ) = M m e a n M s e l e c t M_{reduce} (m,k) = M_{mean}M_{select} Mreduce(m,k)=MmeanMselect
Python代码
def my_pca(input,reduce_dim):
'''
input: 输入特征 (样本数,特征维度)
reduce_dim: 想要降低的维度 int
output.T: 降维后的特征 (样本数,reduce_dim)
demo
a = [[0,1],[2,1],[3,2],[3,0]]
b = my_pca(a,1)
print(b)
'''
assert len(input[1])>reduce_dim # 降低的维度应该比原本维度小
mean_input = input - np.mean(input, axis=0) # 对每个维度求均值,实现input的0均值化
new_input = np.array(mean_input).T #(特征维度,样本数),转换输入格式
covMat = np.cov(new_input) # 求出mean_input的协方差矩阵,(特征维度,特征维度)
eig_vals, eig_vects = np.linalg.eig(covMat) # 求特征值和特征向量
new_vals_id = np.argsort(-eig_vals)[:reduce_dim] # 特征值由大到小排序,选取前reduce_dim个特征值new_vals的下标
new_vects = eig_vects[:, new_vals_id] # 找new_vals对应的特征向量
output = new_vects.T.dot(new_input) # 得到降维后的矩阵
return output.T
去相关
前提
①协方差矩阵 Σ \Sigma Σ表示了变量之间的相关性。
②若协方差矩阵 Σ \Sigma Σ是一个对角阵 Λ \Lambda Λ,每个维度自身与其他维度相关性为0,则数据的各个维度有区分度。
③协方差矩阵 Σ \Sigma Σ是一种实对称矩阵,而实对称矩阵可以对角化。
将协方差矩阵 Σ \Sigma Σ变成对角阵 Λ \Lambda Λ。
实现
Σ x \Sigma_x Σx: 原数据的协方差矩阵
Φ \Phi Φ: Σ x \Sigma_x Σx的特征向量组成的矩阵
Λ \Lambda Λ: Σ x \Sigma_x Σx的特征值组成的对角阵
Σ y \Sigma_y Σy: 去相关后的协方差矩阵
Φ T = Φ − 1 \Phi^{T} = \Phi^{-1} ΦT=Φ−1
Σ x Φ = Φ Λ \Sigma_{x}\Phi = \Phi\Lambda ΣxΦ=ΦΛ
Λ = Φ − 1 Σ x Φ = Φ T Σ x Φ = Φ T E ( x x T ) Φ = E ( Φ T x x T Φ ) \Lambda =\Phi^{-1}\Sigma_{x}\Phi =\Phi^{T}\Sigma_{x}\Phi =\Phi^{T}E(\bold{x}\bold{x}^T)\Phi = E(\Phi^{T}\bold{x}\bold{x}^T\Phi) Λ=Φ−1ΣxΦ=ΦTΣxΦ=ΦTE(xxT)Φ=E(ΦTxxTΦ)
M i n p u t ( m , n ) − − > M m e a n ( m , n ) − − > Σ x ( n , n ) − − > Σ y ( n , n ) M_{input} (m, n) -->M_{mean} (m, n)--> \Sigma_{x} (n, n) --> \Sigma_{y}(n, n) Minput(m,n)−−>Mmean(m,n)−−>Σx(n,n)−−>Σy(n,n)
②令 y = Φ T x \bold{y} = \Phi^{T}\bold{x} y=ΦTx, 可得:
Σ y = E ( y y T ) = E ( Φ T x ( Φ T x ) T ) = Λ \begin {aligned} \Sigma_y &= E(\bold{y}\bold{y}^{T})\\ &= E(\Phi^{T}\bold{x}(\Phi^{T}\bold{x})^{T})\\ &= \Lambda \end {aligned} Σy=E(yyT)=E(ΦTx(ΦTx)T)=Λ
白化
前提
对角化后得协方差矩阵 Σ y \Sigma_y Σy,其主对角线上得所有元素并不相同。
注:大多数情况下白化是有效的,但对于高斯分布的数据效果不好。
实现
Λ − 1 2 Φ T Σ x Φ Λ − 1 2 = I \Lambda^{-\frac{1}{2}}\Phi^{T}\Sigma_{x}\Phi \Lambda^{-\frac{1}{2}}=I Λ−21ΦTΣxΦΛ−21=I
Σ w h i t e = E ( w w T ) = E ( Λ − 1 2 Φ T Σ x Φ Λ − 1 2 ) = I \Sigma_{white} = E(\bold{w}\bold{w}^{T})=E(\Lambda^{-\frac{1}{2}}\Phi^{T}\Sigma_{x}\Phi\Lambda^{-\frac{1}{2}}) = I Σwhite=E(wwT)=E(Λ−21ΦTΣxΦΛ−21)=I
y = A T x , A = Φ y = A^{T} x, A = \Phi y=ATx,A=Φ
w = A w T x , A w = Φ Λ − 1 2 w = A_w^T x , A_w = \Phi\Lambda^{-\frac{1}{2}} w=AwTx,Aw=ΦΛ−21