主成分分析pca和白化
2014-08-10 16:49
190 查看
最近在学习dnn,autoEncoding有点问题,先把pca做了,这个不太难
作业见http://deeplearning.stanford.edu/wiki/index.php/Exercise:PCA_in_2D
原始数据集
第一步:获取数据
![](http://img.blog.csdn.net/20140810171008557?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHlsb3Bob25lMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
第二步:平移使数据的均值为0
第三步:计算协方差矩阵
这里需要注意,cov函数需要传递参数bias=1,n个数据的协方差需要除以n,若不传递bias=1,将除以(n-1)否则
第四步:计算特征值特征向量
因为协方差矩阵是对称矩阵,因此它的特征值等于奇异值,故采用奇异值分解(svd)来计算
第五步:旋转数据
U是特征向量构成的正交矩阵,用u左乘原始数据矩阵相当于求原始数据在以u的列向量为标准正交基下的坐标
因这里是2维数据,直接将其压缩为1维
![](http://img.blog.csdn.net/20140810170932953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHlsb3Bob25lMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
关于pca的压缩就到这里。
下面是pca白化
白化的目标,特征之间相关性最低,所有特征有相同的方差。通常使协方差矩阵为单位矩阵
svd中分解出来的sigma为对角矩阵,这里sigma=array([ 0.16071768, 0.01528232])
为了使每个输入特征具有单位方差,我们可以直接使用
![](http://deeplearning.stanford.edu/wiki/images/math/7/a/d/7ad8b4911f758fec9b3c6d0b4b61a82c.png)
作为缩放因子来缩放每个特征
![](http://deeplearning.stanford.edu/wiki/images/math/d/1/5/d1527b3272bc5c1fe3fc308c7a21e689.png)
。具体地,我们定义白化后的数据
![](http://deeplearning.stanford.edu/wiki/images/math/9/6/9/9693d90272b2475c8369fa23df7267ed.png)
如下:
![](http://deeplearning.stanford.edu/wiki/images/math/e/2/9/e296118ba2bdf453dbe38426359f2230.png)
实践中需要实现PCA白化或ZCA白化时,有时一些特征值
![](http://deeplearning.stanford.edu/wiki/images/math/2/3/5/23536ce45f0ee57fffa389163f8437bd.png)
在数值上接近于0,这样在缩放步骤时我们除以
![](http://deeplearning.stanford.edu/wiki/images/math/3/e/8/3e85dc0c50d11861f9d02bb43ab2d989.png)
将导致除以一个接近0的值;这可能使数据上溢
(赋为大数值)或造成数值不稳定。因而在实践中,我们使用少量的正则化实现这个缩放过程,即在取平方根和倒数之前给特征值加上一个很小的常数
![](http://deeplearning.stanford.edu/wiki/images/math/a/8/e/a8eae7b5e90c024c40de690158e0e6b1.png)
:
![](http://deeplearning.stanford.edu/wiki/images/math/6/7/b/67be9aaa628b437297c08a916d0d5307.png)
当
![](http://deeplearning.stanford.edu/wiki/images/math/f/6/c/f6c0f8758a1eb9c99c0bbe309ff2c5a5.png)
在区间
![](http://deeplearning.stanford.edu/wiki/images/math/8/5/a/85a1c5a07f21a9eebbfb1dca380f8d38.png)
上时,
一般取值为
![](http://deeplearning.stanford.edu/wiki/images/math/c/d/d/cdd6f0cc52395a161edf391fad0ef2ef.png)
。
绘制出
![](http://deeplearning.stanford.edu/wiki/images/math/a/3/1/a3135c6f5975d0a74cd2d9082be9638a.png)
,我们得到:
![](http://img.blog.csdn.net/20140810180236034?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHlsb3Bob25lMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注意pca白化会缩放特征范围
zca白化
用任意正交矩阵左乘pca白化后的数据,得到的任然是单位协方差矩阵数据,这就是zca白化
作业见http://deeplearning.stanford.edu/wiki/index.php/Exercise:PCA_in_2D
原始数据集
-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
第一步:获取数据
# -*- coding: utf-8 -* import numpy as np import matplotlib import matplotlib.pyplot as plt import math # %%================================================================ # %% Step 0: Load data # % We have provided the code to load data from pcaData.txt into x. # % x is a 2 * 45 matrix, where the kth column x(:,k) corresponds to # % the kth data point.Here we provide the code to load natural image data into x. def normal(x): return 1.0/math.sqrt(x) normal_ufunc = np.vectorize(normal,otypes=[np.float]) x = np.loadtxt('pcaData.txt') fig = plt.figure() ax = fig.add_subplot(111) ax.scatter (x[0,:] ,x[1,:]) plt.show()
第二步:平移使数据的均值为0
# make mean to zero xmean = np.mean(x,axis=1).reshape((-1,1)) y = x -xmean
第三步:计算协方差矩阵
这里需要注意,cov函数需要传递参数bias=1,n个数据的协方差需要除以n,若不传递bias=1,将除以(n-1)否则
# 协方差矩阵 xx = np.cov(y,bias=1) print (u'原始协方差矩阵',xx)
第四步:计算特征值特征向量
因为协方差矩阵是对称矩阵,因此它的特征值等于奇异值,故采用奇异值分解(svd)来计算
# 特征值或奇异值分解 u,sigma,v = np.linalg.svd(xx) print ('u sigma v=',u,sigma,v)
第五步:旋转数据
U是特征向量构成的正交矩阵,用u左乘原始数据矩阵相当于求原始数据在以u的列向量为标准正交基下的坐标
因这里是2维数据,直接将其压缩为1维
# 旋转 xrot = np.dot(np.transpose (u),y) xrotcov = np.cov(xrot,bias=1) print ('xrot=',xrot) print (u'旋转后协方差矩阵',xrotcov) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xrot[0,:],xrot[1,:]-xrot[1,:]) plt.show()
关于pca的压缩就到这里。
下面是pca白化
白化的目标,特征之间相关性最低,所有特征有相同的方差。通常使协方差矩阵为单位矩阵
svd中分解出来的sigma为对角矩阵,这里sigma=array([ 0.16071768, 0.01528232])
为了使每个输入特征具有单位方差,我们可以直接使用
![](http://deeplearning.stanford.edu/wiki/images/math/7/a/d/7ad8b4911f758fec9b3c6d0b4b61a82c.png)
作为缩放因子来缩放每个特征
![](http://deeplearning.stanford.edu/wiki/images/math/d/1/5/d1527b3272bc5c1fe3fc308c7a21e689.png)
。具体地,我们定义白化后的数据
![](http://deeplearning.stanford.edu/wiki/images/math/9/6/9/9693d90272b2475c8369fa23df7267ed.png)
如下:
![](http://deeplearning.stanford.edu/wiki/images/math/e/2/9/e296118ba2bdf453dbe38426359f2230.png)
实践中需要实现PCA白化或ZCA白化时,有时一些特征值
![](http://deeplearning.stanford.edu/wiki/images/math/2/3/5/23536ce45f0ee57fffa389163f8437bd.png)
在数值上接近于0,这样在缩放步骤时我们除以
![](http://deeplearning.stanford.edu/wiki/images/math/3/e/8/3e85dc0c50d11861f9d02bb43ab2d989.png)
将导致除以一个接近0的值;这可能使数据上溢
(赋为大数值)或造成数值不稳定。因而在实践中,我们使用少量的正则化实现这个缩放过程,即在取平方根和倒数之前给特征值加上一个很小的常数
![](http://deeplearning.stanford.edu/wiki/images/math/a/8/e/a8eae7b5e90c024c40de690158e0e6b1.png)
:
![](http://deeplearning.stanford.edu/wiki/images/math/6/7/b/67be9aaa628b437297c08a916d0d5307.png)
当
![](http://deeplearning.stanford.edu/wiki/images/math/f/6/c/f6c0f8758a1eb9c99c0bbe309ff2c5a5.png)
在区间
![](http://deeplearning.stanford.edu/wiki/images/math/8/5/a/85a1c5a07f21a9eebbfb1dca380f8d38.png)
上时,
一般取值为
![](http://deeplearning.stanford.edu/wiki/images/math/c/d/d/cdd6f0cc52395a161edf391fad0ef2ef.png)
。
# pca白化 epsilon = 1e-5 scal = np.diag (normal_ufunc(sigma+epsilon)) xpcawhite = np.dot(scal,xrot) xpcawhitecov = np.cov(xpcawhite,bias=1) print ('xpcawhite',xpcawhite) print('xpcawhitecov',xpcawhitecov) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xpcawhite[0,:],xpcawhite[1,:]) plt.show()
绘制出
![](http://deeplearning.stanford.edu/wiki/images/math/a/3/1/a3135c6f5975d0a74cd2d9082be9638a.png)
,我们得到:
注意pca白化会缩放特征范围
zca白化
用任意正交矩阵左乘pca白化后的数据,得到的任然是单位协方差矩阵数据,这就是zca白化
# zcawhite xzcawhite = np.dot(u,xpcawhite) xzcawhitecov = np.cov(xzcawhite,bias=1) print('xzcawhite',xzcawhite) print ('xzcawhitecov',xzcawhitecov) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xzcawhite[0,:],xzcawhite[1,:]) plt.show()
相关文章推荐
- Deep Learning 学习笔记(9):主成分分析( PCA )与 白化( whitening )
- 机器学习系列(8):主成分分析(PCA)及白化(ZCA)
- 初识PCA-主成分分析
- 机器学习降维算法一:PCA(主成分分析算法)
- 主成分分析PCA(Principal Component Analysis)介绍
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
- 线性判别分析(LDA), 主成分分析(PCA)
- 主成分分析 PCA
- 主成分分析PCA
- 三维模型的主成分分析(3D Model PCA, CPCA, NPCA)
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
- 主成分分析PCA--计算过程
- 主成分分析 PCA
- 主成分分析 PCA算法
- [zz]主成分分析 PCA算法
- PCA--主成分分析
- 机器学习降维算法一:PCA(主成分分析算法)
- 【R/Matlab】PCA(主成分分析)
- 主成分分析(principal components analysis, PCA)
- 线性判别分析(LDA), 主成分分析(PCA)