PCA/ZCA白化

 

                                       PCA/ZCA白化

转载注明出处:https://blog.csdn.net/ouyangfushu/article/details/84797210

作者:SyGoing

QQ:  244679942

1、PCA白化(PCA Whitening)

         通过之前的学习可知PCA实现了对数据特征的降维,把样本的n维特征降维为k维(0<k<n),降维后各维特征不相关。PCA白化的实现与PCA类似,在求得协方差的特征值与特征向量以后,用特征向量矩阵的转置左乘原始数据矩阵以实现对数据的旋转变换,再对变换后数据矩阵每一维除以对应方差(即特征值)。

         白化的目的是(1)去除数据各维度的相关性,(2)并使得数据在每一维具有同样的方差。

         算法的流程:

         假设样本集中,有m个样本,每个样本特征维数为n。

        1)将所有样本的特征列向量组合起来构成一个n行m列的样本集特征矩阵X。

        2)将X的每一行进行零均值化,即减去这一行的均值,具体地为求所有样本在这一维的特征的平均值,然后这一行所有值减去该均值。

        3)求X的协方差矩阵

                   

        4)求出协方差矩阵的特征值及对应的特征向量,即对协方差矩阵进行特征分解

                   

        5)对数据进行旋转

                  

         6)除方差(特征值)

                  

 

2、 ZCA白化(ZCA Whitening)

          ZCA白化则是在PCA白化基础上,将PCA白化后的数据旋转回到原来的特征空间,这样可以使得变换后的数据更加接近原始输入数据。 ZCA白化的计算公式:

                  

 

3、PCA与ZCA区别

       PCA白化ZCA白化都降低了特征之间相关性较低,同时使得所有特征具有相同的方差。

        1) PCA白化需要保证数据各维度的方差为1,ZCA白化只需保证方差相等。

        2) PCA白化可进行降维也可以去相关性,而ZCA白化主要用于去相关性另外。

        3) ZCA白化相比于PCA白化使得处理后的数据更加的接近原始数据。

4、python实现

     1)PCA白化

#-*- coding:utf-8-*-
from numpy import *
import numpy as np
import cv2
import matplotlib.pyplot as plt
#机器学习实战
def loadDataSet(filename,delim = "\t"):
    fr = open(filename)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float, line) for line in stringArr]
    return np.mat(datArr)
def PCA_whitening(dataMat):
    newData, meanVals = zeroMean(dataMat)
    covMat = np.cov(newData, rowvar=0)
    U, S, V = np.linalg.svd(covMat)  
# U 是 covMat 的特征向量矩阵,S 是其特征值矩阵;因为 covMat 是对称方#  阵,所以 V=U',covMat=USV
    rotateMat=newData*U
    rotateMat/=sqrt(S+1e-5)
    return rotateMat

data=loadDataSet("F:/DEEP LEARNING PAPERS/machinelearninginaction/Ch13/testSet.txt")
	lowdataMat=PCA_whitening(data)
fig1 = plt.figure()
fig2=plt.figure()
ax = fig1.add_subplot(111)
ay=fig2.add_subplot(111)
ax.scatter(data[:,0].flatten().A[0], data[:,1].flatten().A[0], marker='^',  s = 10 )
ay.scatter(lowdataMat[:,0].flatten().A[0], lowdataMat[:,1].flatten().A[0],marker='o', s = 20 , c ='red' )

       2)ZCA白化

def ZCA_whitening(data):
    newData, meanVals = zeroMean(data)
    covMat = np.cov(newData, rowvar=0)
    U, S, V = np.linalg.svd(covMat)  # U 是 covMat 的特征向量矩阵,S 是其特征值矩阵;因为 covMat 是对称方阵,所以 V=U',covMat=USV
    rotateMat = newData * U
    rotateMat /= sqrt(S + 1e-5)

    return (U*rotateMat.T).T
       
data=loadDataSet("F:/DEEP LEARNING PAPERS/machinelearninginaction/Ch13/testSet.txt")
lowdataMat=ZCA_whitening(data)
fig1 = plt.figure()
fig2=plt.figure()
ax = fig1.add_subplot(111)
ay=fig2.add_subplot(111)
ax.scatter(data[:,0].flatten().A[0], data[:,1].flatten().A[0], marker='^',  s = 10 )
ay.scatter(lowdataMat[:,0].flatten().A[0], lowdataMat[:,1].flatten().A[0],marker='o', s = 20 , c ='red' )
plt.show()

猜你喜欢

转载自blog.csdn.net/ouyangfushu/article/details/84797210
PCA
今日推荐