即墨公司做网站,浪尖工业设计公司官网,电子商务网站建设的答案,手机图片编辑器简介
在UFLDL中介绍了主成分分析这一块的知识#xff0c;而且当时学机器学习的时候#xff0c;老师是将PCA和SVD联系起来将的#xff0c;同时UFLDL也讲到了使用PCA做数据白化whitening处理#xff0c;这个词经常在论文里面看到。
国际惯例#xff0c;参考博客#xff1…简介
在UFLDL中介绍了主成分分析这一块的知识而且当时学机器学习的时候老师是将PCA和SVD联系起来将的同时UFLDL也讲到了使用PCA做数据白化whitening处理这个词经常在论文里面看到。
国际惯例参考博客
UFLDL的PCA章节
PRML的第12.1 PCA章节
知乎深入理解PCA与SVD的关系
PCA and SVD explained with numpy
Relationship between SVD and PCA. How to use SVD to perform PCA?
百度百科正交投影
知乎正交投影
SVD奇异值分解小结
特征分解
协方差矩阵一定是满秩的吗
PCA、ZCA白化
PCA理论
在PRML中给出了PCA的两种定义
数据在低维线性空间上的正交投影这个线性空间被称为主子空间使得投影数据的方差被最大化平均投影代价最小的线性投影。其中平均投影代价是数据点与投影点之间的平均平方距离。
如下图就是将二维数据投影一维空间u1u_1u1中 上图中红色的二维数据点被正交投影到主子空间(紫色的线)PCA的目的就是想让投影后的数据(绿色点)具有最大的方差。 其中正交投影被神乎其神的说了一大堆理论其实就是投影线垂直于投影面。
通常情况下我们都是用第一个定义去理解PCA的设每个样本都有D个属性即D维向量总共有N个样本。
第一步将数据投影到D维向量u1u_1u1上一般来说我们设这个u1u_1u1是D维空间中的方向向量 x^u1Tx\hat{x}u_1^Tx x^u1Tx 第二步求投影方差 1N{u1Txn−u1Txˉ}2u1TSu1\frac{1}{N}\{u_1^Tx_n-u_1^T\bar{x}\}^2u_1^TSu_1 N1{u1Txn−u1Txˉ}2u1TSu1 其中xˉ\bar{x}xˉ所有样本均值xˉ1N∑n1Nxn\bar{x}\frac{1}{N}\sum_{n1}^Nx_nxˉN1∑n1Nxn注意不是每个样本所有属性求均值。
其中SSS是原数据集的协方差矩阵 S1N∑n1N(xn−xˉ)(xn−xˉ)TS\frac{1}{N}\sum_{n1}^N(x_n-\bar{x})(x_n-\bar{x})^T SN1n1∑N(xn−xˉ)(xn−xˉ)T 【注】协方差反映的是属性与属性之间的关系而非样本与样本之间的关系。
第三步约束
上面我们经常约束u1u_1u1是方向向量那么 u1Tu11u_1^Tu_11 u1Tu11 结合这个约束以及为了让方差最大化的目标可以利用拉格朗日乘数法建立下式 u1TSu1λ1(1−u1Tu1)u_1^TSu_1\lambda_1(1-u_1^Tu_1) u1TSu1λ1(1−u1Tu1) 当上式导数为零时驻点满足 Su1λ1u1Su_1\lambda_1u_1 Su1λ1u1 很容易发现u1u_1u1一定是SSS的特征向量同时也能发现当λ1\lambda_1λ1越大方差越大。所以最大特征值对应的特征向量为第一主成分。同理就能利用特征分解的方法求解到第二、三、…主分量。
综上可以得到PCA的一般步骤为 整理原始矩阵Xn×mX_{n \times m}Xn×m 代表n个样本每个样本维度为m 求原始矩阵Xn×mX_{n \times m}Xn×m的协防差阵Sm×mCov(X)S_{m\times m}Cov(X)Sm×mCov(X) 求解协防差阵的特征值和特征向量。 选取最大的K(人为给定)个特征值所对应的特征向量组成构成矩阵Wm×kW_{m\times k}Wm×k 直接进行矩阵计算就得到了降维后的数据
Zn×kXn×mWm×kZ_{n\times k} X_{n\times m }W_{m\times k } Zn×kXn×mWm×k
SVD 理论
一般来说实对称矩阵可以被分解为AQ∑QTAQ\sum Q^TAQ∑QT的形式其中QQQ为标准正交矩阵∑\sum∑对角阵对角阵上的元素λi\lambda_iλi是矩阵A的特征值对应的特征向量是QiQ_iQi
那么如果矩阵AAA为非实对称矩阵的时候有没有类似的 AUΣVTAU\Sigma V^T AUΣVT 奇异值分解(singular value decompositionSVD)做的就是这件事。在SVD的官方术语中,U是(n,n)(n,n)(n,n)维的方阵称为左奇异向量Σ\SigmaΣ是(n,m)(n,m)(n,m)的对角阵对角线上的元素称为奇异值V 是(m,m)(m,m)(m,m)维度的方阵称为右奇异向量并且U和V均为单位正交矩阵UUT1UU^T1UUT1且VVT1VV^T1VVT1
求解方法就是利用AATAA^TAAT与ATAA^TAATA都是对称阵的特性得到 AATUΣΣTUTATAVΣTΣVTAA^TU\Sigma \Sigma ^T U^T \\ A^TAV\Sigma^T\Sigma V^T AATUΣΣTUTATAVΣTΣVT 这样就能求解出U、Σ\SigmaΣ、V。
这篇文章里面有例子。
PCA和SVD的关系
摘自此处通过协方差矩阵的求解方法建立联系
在SVD中 SATXVΣUTUΣVTVΣ2VTVΣ2V−1SA^TX V\Sigma U^T U\Sigma V^T V\Sigma ^2V^T V\Sigma^2V^{-1} SATXVΣUTUΣVTVΣ2VTVΣ2V−1 而在PCA中 Su1λ1u1−1Su_1\lambda_1u_1^{-1} Su1λ1u1−1 所以 λΣ2uV\lambda\Sigma^2\\ uV λΣ2uV 这一点可以通过代码验证
anp.array([[1,5,7],[2,3,6],[5,9,3]])
C np.dot(a.T, a)eigen_vals,eigen_vecs np.linalg.eig(C)
u,sigma,vnp.linalg.svd(a,full_matricesFalse,compute_uvTrue)print(eigen_vals,sigma**2)[208.58666048 1.52969164 28.88364788] [208.58666048 28.88364788 1.52969164]
eigen_vecsarray([[-0.34088613, -0.85005392, -0.40150339],[-0.72034757, 0.51060491, -0.46944862],[-0.60406625, -0.12919347, 0.78639241]])
v.Tarray([[-0.34088613, -0.40150339, -0.85005392],[-0.72034757, -0.46944862, 0.51060491],[-0.60406625, 0.78639241, -0.12919347]])使用PCA对mnist数据集降维
其实在这里遇到一个问题使用eig对手写数字数据集的协方差矩阵求解特征值时得到了复数特征值和特征向量这一点暂时没弄明白但是使用svd可以得到正常的特征值和特征向量。
sklearn中的pca
from sklearn.decomposition import PCA
pca PCA(n_components2)
result pca.fit_transform(data)得到结果图 numpy手撕PCA
def PCA_numpy(X):#零均值化print(X.shape)XX-X.mean(axis0)## 使用特征值和特征向量#协方差矩阵#cov_X np.cov(X,rowvar0)#每一列一个特征#eig_val,eig_vec np.linalg.eig(cov_X) #出现复数了##使用svdU,eig_val,eig_vec np.linalg.svd(X)#选两个最大的idx np.argsort(-eig_val)temp_M[]for i in range(2):temp_M.append(eig_vec[idx[i]])temp_M np.array(temp_M).Tresult np.dot(X,temp_M)return result同样得到结果值 这个图里面每个颜色代表手写数字数据集里面的0-9数字。
ZCA白化
在UFLDL中还介绍了基于PCA的白化(whitening或者球化sphering)方法白化的目标有两个
特征之间具有尽量少的相关性特征具有相同的方差
针对第一个目标前面的使用PCA降维xuTxxu^TxxuTx已经达到了效果。
针对第二个目标让每个输入特征值都具有单位方差(unit variance)只需要除以特征值的开根号即可 xpcaixiλix_{pcai}\frac{x_i}{\sqrt{\lambda _i}} xpcaiλixi 降维数据的第i列对应第i个特征值。这时候数据的协方差就是单位阵这就是所说的PCA白化(数据的不同成分无联系并且具有单位方差)。
但是我们第二个目标其实是具有相同方差而具有相同的单位方差并不是唯一的一个情况也可能是具有相同的非单位方差。在ZCA白化中又对pca白化做了一次左乘 xzcauxpcax_{zca}ux_{pca} xzcauxpca 这样虽然把方差不再是1了但是变换后的数据更加接近原始数据。
有一点需要注意PCA可以用于降维(取前面一部分主成分)但是zca必须保持原有的维度不变zca只做去相关不做降维。
后记
这个学习笔记主要是针对机器学习里面常见的降维方法PCA进行剖析和逐步实现具体代码包括手写数字的读取和最终降维图的画图请参看公众号简介中的github网址。后续将持续更新其它机器学习理论和算法敬请关注