zoukankan      html  css  js  c++  java
  • [线性代数] 矩阵白化

    [线性代数] 矩阵白化

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/kuang_liu/article/details/16951461

    给一个任意矩阵 X,一般情况下它的协方差矩阵并不是对角矩阵。矩阵白化就是用一个白化矩阵 A,使 Y = A * X 的协方差矩阵转化为对角矩阵。

    这里首先指出 Y = A * X 成立的前提是 X 中的元素是按列排列的,如果 X 按行排列,Y = X * A。

    1. 数学推导

    如果数据按行排列则协方差矩阵的定义是(假设 X is already zero-mean):
    我们的目标是找到白化矩阵 A 使 cov(Y) 为对角矩阵。为了简化,下面的推导过程中省略了前面的系数 1/(m-1),U 和 D 分别是 cov(X) 的特征向量和特征值对角矩阵:
     
     
    结论就是如果数据按行排列,白化矩阵 A 为:
    Y = X * A。
    如果数据按列排列,白化矩阵 A 为:
    Y =  A * X。
     
     

    目的:白化处理是为了去除信号的相关性,设白化矩阵为V,则对中心化的数据X用V做线性变换,得到的新的信号满足不相关且为单位方差。
    V的求解过程:
    1.获得X和X转置矩阵的点积A。
    2.求解A的特征值D和特征向量E。
    3.构造对角矩阵(左上右下)D2,对角线上的元素为D的值。
    4.白化矩阵V就是矩阵D2的平方根与E的转置矩阵的点积。
    5.求得V与X的点积就为X白化处理的矩阵。
    示例:其中X为2*500的矩阵
    X_mean = X.mean(axis=-1)
    X -= X_mean[:, newaxis]
    #whiten
    A = dot(X, X.transpose())
    D , E = linalg.eig(A)
    D2 = linalg.inv(array([[D[0], 0.0], [0.0, D[1]]], float32))
    D2[0,0] = sqrt(D2[0,0]); D2[1,1] = sqrt(D2[1,1])
    V = dot(D2, E.transpose())
    return dot(V, X), V

    深度学习入门---PCA,白化 Python实现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/jiede1/article/details/77039209

    深度学习入门—PCA,白化 已经完整阐述了PCA和白化算法的原理,这篇博客更新其算法的Python实现。代码有很完整的注释。

    #implement PCA
    file=open('/notebooks/pcaData.txt','r')
    dataSet=[]
    for text in file:
        tt=text.strip().split()
        line=[]
        for t in tt:
            line.append(float(t))
        dataSet.append(line)
    dataSet=np.array(dataSet)
    dataSet.shape  #(2,45)
    
    import matplotlib.pylab as plt
    %matplotlib inline
    
    #画出原数据
    plt.figure(1)
    plt.scatter(dataSet[0,:],dataSet[1,:])
    plt.title("origin data")
    
    #计算协方差矩阵sigma,以及特征向量矩阵u
    sigma=dataSet.dot(dataSet.T)/dataSet.shape[1]
    print(sigma.shape)  #(2,2)
    [u,s,v] = np.linalg.svd(sigma)
    print(u.shape)  #(2,2)
    
    #画出两个主成分方向
    plt.figure(2)
    plt.plot([0, u[0,0]], [0, u[1,0]])   
    plt.plot([0, u[0,1]], [0, u[1,1]])
    plt.scatter(dataSet[0,:],dataSet[1,:])
    
    #PCA转换数据,不降维
    xRot=u.T.dot(dataSet)
    xRot.shape   #(2,45)
    
    #画出PCA转换后的数据
    plt.figure(3)
    plt.scatter(xRot[0,:], xRot[1,:])
    plt.title('xRot')
    
    k = 1; #降维度为1
    
    #PCA降维,xRot[0:k,:] 为降维度后的数据
    xRot[0:k,:] = u[:,0:k].T .dot(dataSet) 
    #还原数据
    xHat = u .dot(xRot)
    print(xHat.shape)
    plt.figure(4)
    plt.scatter(xHat[0,:], xHat[1, :])
    plt.title('xHat')
    
    #PCA Whitening
    # Complute xPCAWhite and plot the results.
    
    epsilon = 1e-5
    
    #这部分用到了技巧,利用s的元素运算后(防止数据不稳定或数据溢大,具体看原理),再恢复对角矩阵。具体见diag函数
    xPCAWhite = np.diag(1./np.sqrt(s + epsilon)) .dot(u.T .dot(dataSet)) 
    
    plt.figure(5)
    plt.scatter(xPCAWhite[0, :], xPCAWhite[1, :])
    plt.title('xPCAWhite')
    
    #ZCA白化
    xZCAWhite = u .dot(np.diag(1./np.sqrt(s + epsilon)))  .dot(u.T .dot(dataSet)) 
    
    
    plt.figure(6)
    plt.scatter(xZCAWhite[0, :], xZCAWhite[1, :])
    plt.title('xZCAWhite')
    plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    其中,导入的数据pcaData.txt文件数据为:

    -6.7644914e-01  -6.3089308e-01  -4.8915202e-01  -4.8005424e-01  -3.7842021e-01  -3.3788391e-01  -3.2023528e-01  -3.1108837e-01  -2.3145555e-01  -1.9623727e-01  -1.5678926e-01  -1.4900779e-01  -1.0861557e-01  -1.0506308e-01  -8.0899829e-02  -7.1157518e-02  -6.3251073e-02  -2.6007219e-02  -2.2553443e-02  -5.8489047e-03  -4.3935323e-03  -1.7309716e-03   7.8223728e-03   7.5386969e-02   8.6608396e-02   9.6406046e-02   1.0331683e-01   1.0531131e-01   1.1493296e-01   1.3052813e-01   1.6626253e-01   1.7901863e-01   1.9267343e-01   1.9414427e-01   1.9770003e-01   2.3043613e-01   3.2715844e-01   3.2737163e-01   3.2922364e-01   3.4869293e-01   3.7500704e-01   4.2830153e-01   4.5432503e-01   5.4422436e-01   6.6539963e-01
      -4.4722050e-01  -7.4778067e-01  -3.9074344e-01  -5.6036362e-01  -3.4291940e-01  -1.3832158e-01   1.2360939e-01  -3.3934986e-01  -8.2868433e-02  -2.4759514e-01  -1.0914760e-01   4.2243921e-01  -5.2329327e-02  -2.0126541e-01   1.3016657e-01   1.2293321e-01  -3.4787750e-01  -1.4584897e-01  -1.0559656e-01  -5.4200847e-02   1.6915422e-02  -1.1069762e-01   9.0859816e-02   1.5269096e-01  -9.4416463e-02   1.5116385e-01  -1.3540126e-01   2.4592698e-01   5.1087447e-02   2.4583340e-01  -5.9535372e-02   2.9704742e-01   1.0168115e-01   1.4258649e-01   1.0662592e-01   3.1698532e-01   6.1577841e-01   4.3911172e-01   2.7156501e-01   1.3572389e-01   3.1918066e-01   1.5122962e-01   3.4979047e-01   6.2316971e-01   5.2018811e-01
    • 1
    • 2
    有 0 个人打赏
  • 相关阅读:
    Spring-boot内置的程序管理监控工具-Actuator
    分表工具类(根据唯一字符串)
    ES设计及规范
    测试单元Junit一直进不去@test方法解决方案
    MAC OS怎样将普通成员升级为管理员
    elasticSearch小结
    Mysql 查询条件中字符串尾部有空格也能匹配上的问题
    gitlab进行meger代码回滚
    ES与关系型数据库的通俗比较
    kafka的生产者配置以及发送信息的三种方式
  • 原文地址:https://www.cnblogs.com/think90/p/11620225.html
Copyright © 2011-2022 走看看