PCA_去相关_白化

文章目录

  • PCA(主成分分析)
    • 前提
    • PCA算法
    • Python代码
  • 去相关
    • 前提
    • 实现
  • 白化
    • 前提
    • 实现


PCA 学习自 A tutorial on Principal Components Analysis(Lindsay. Smith-2002)

去相关和白化 学习自 Topic: Decorrelating and then Whitening data (Rosalind W. Picard)

文中提到的前置知识:样本均值,样本方差,协方差,协方差矩阵,特征值,特征向量。


PCA(主成分分析)

前提

问题:样本的很多特征是冗余的,如何选择出合适的特征?

目标:
{ 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是特征提取的一种方法。


PCA算法

定义:
样本数 = 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)

①Zero-mean data:
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: 去相关后的协方差矩阵

Σ x = E ( x x T ) \Sigma_{x}=E(\bold{xx^T}) Σx=E(xxT)
Φ 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)

①求解 Σ x \Sigma_x Σx Φ \Phi Φ Λ \Lambda Λ
②令 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,其主对角线上得所有元素并不相同。

白化:令对角阵 Λ \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
Λ − 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 = Λ − 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

则有:
Σ 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

你可能感兴趣的:(模式识别,python,机器学习)