主成分分析( PCA )与 白化( whitening )

主成成分分析(PCA):

1.相关背景 在许多领域的研究与应用中,一般须要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,可是也在必定程度上增长了数据采集的工做量。更重要的是在不少情形下,许多变量之间可能存在相关性,从而增长了问题分析的复杂性。若是分别对每一个指标进行分析,分析每每是孤立的,不能彻底利用数据中的信息,所以盲目减小指标会损失不少有用的信息,从而产生错误的结论。html

所以须要找到一种合理的方法,在减小须要分析的指标同时,尽可能减小原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。因为各变量之间存在必定的相关关系,所以能够考虑将关系紧密的变量变成尽量少的新变量,使这些新变量是两两不相关的,那么就能够用较少的综合指标分别表明存在于各个变量中的各种信息。主成分分析与因子分析就属于这类降维算法。python

主要思想:经过抛弃携带信息量较少的维度对数据进行降维处理,从而加速机器学习进程。算法

  1. 数据降维

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提高数据处理速度的目的。在实际的生产和应用中,降维在必定的信息损失范围内,能够为咱们节省大量的时间和成本。降维也成为应用很是普遍的数据预处理方法。bash

降维具备以下一些优势:app

  1. 使得数据集更易使用。
  2. 下降算法的计算开销。
  3. 去除噪声。
  4. 使得结果容易理解。 降维的算法有不少,好比奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。
  1. PCA原理详解

3.1 PCA的概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最普遍的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上从新构造出来的k维特征。PCA的工做就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据自己是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,能够获得n个这样的坐标轴。经过这种方式得到的新的坐标轴,咱们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。因而,咱们能够忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这至关于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。机器学习

思考:咱们如何获得这些包含最大差别性的主成分方向呢?源码分析

答案:事实上,经过计算数据矩阵的协方差矩阵,而后获得协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就能够将数据矩阵转换到新的空间当中,实现数据特征的降维。学习

因为获得协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,因此PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法.
3.2 协方差和散度矩阵
样本均值: 大数据


样本方差:


样本X和样本Y的协方差:


由上面的公式,咱们能够获得如下结论:

(1) 方差的计算公式是针对一维特征,即针对同一特征不一样样本的取值来进行计算获得;而协方差则必需要求至少知足二维特征;方差是协方差的特殊状况。ui

(2) 方差和协方差的除数是n-1,这是为了获得方差和协方差的无偏估计。

协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是相互独立。Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差其实是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:


散度矩阵定义为:


对于数据X的散度矩阵为 X^TX。其实协方差矩阵和散度矩阵关系密切,散度矩阵就是协方差矩阵乘以(总数据量-1)。所以它们的特征值和特征向量是同样的。这里值得注意的是,散度矩阵是SVD奇异值分解的一步,所以PCA和SVD是有很大联系。
3.3 特征值分解矩阵原理
(1) 特征值与特征向量

若是一个向量v是矩阵A的特征向量,将必定能够表示成下面的形式:


其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

(2) 特征值分解矩阵

对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能获得一组正交单位向量。特征值分解,就是将矩阵A分解为以下式:


其中,Q是矩阵A的特征向量组成的矩阵, \Sigma则是一个对角阵,对角线上的元素就是特征值。
3.4 SVD分解矩阵原理

奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A老是存在一个奇异值分解:


假设A是一个m n的矩阵,那么获得的U是一个mm的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。是v的转置矩阵,是一个nn的矩阵,它里面的正交向量被称为右奇异值向量。并且通常来说,咱们会将Σ上的值按从大到小的顺序排列。 SVD分解矩阵A的步骤:

(1) 求AA^T的特征值和特征向量,用单位化的特征向量构成 U。

(2) 求A^TA的特征值和特征向量,用单位化的特征向量构成 V。

(3) 将AA^T或者A^TA的特征值求平方根,而后构成 Σ。

3.5 PCA算法两种实现方法
(1) 基于特征值分解协方差矩阵实现PCA算法
输入:数据集X={(x_1,x_2...,x_n)},须要降到k维。

  1. 去平均值(即去中心化),即每一位特征减去各自的平均值。、

  2. 计算协方差矩阵\frac{1}{n}XX^T,注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

  3. 用特征值分解方法求协方差矩阵\frac{1}{n}XX^T的特征值与特征向量。

  4. 对特征值从大到小排序,选择其中最大的k个。而后将其对应的k个特征向量分别做为行向量组成特征向量矩阵P。

  5. 将数据转换到k个特征向量构建的新空间中,即Y=PX。
    总结:

1)关于这一部分为何用\frac{1}{n}XX^T,这里面含有很复杂的线性代数理论推导,想了解具体细节的能够看下面这篇文章。 CodingLabs - PCA的数学原理

2)关于为何用特征值分解矩阵,是由于\frac{1}{n}XX^T是方阵,能很轻松的求出特征值与特征向量。固然,用奇异值分解也能够,是求特征值与特征向量的另外一种方法。
举个例子:


以X为例,咱们用PCA方法将这两行数据降到一行。

1)由于X矩阵的每行已是零均值,因此不须要去平均值。

2)求协方差矩阵:


3)求协方差矩阵的特征值与特征向量。

求解后的特征值为:

对应的特征向量为:
其中对应的特征向量分别是一个通解,和能够取任意实数。那么标准化后的特征向量为:

4)矩阵P为:
5)最后咱们用P的第一行乘以数据矩阵X,就获得了降维后的表示:
结果如图1所示:
注意:若是咱们经过特征值分解协方差矩阵,那么咱们只能获得一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。
4. PCA实例
(1)PCA的Python实现:

##Python实现PCA
import numpy as np
def pca(X,k):#k is the components you want
  #mean of each feature
  n_samples, n_features = X.shape
  mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
  #normalization
  norm_X=X-mean
  #scatter matrix
  scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
  #Calculate the eigenvectors and eigenvalues
  eig_val, eig_vec = np.linalg.eig(scatter_matrix)
  eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
  # sort eig_vec based on eig_val from highest to lowest
  eig_pairs.sort(reverse=True)
  # select the top k eig_vec
  feature=np.array([ele[1] for ele in eig_pairs[:k]])
  #get new data
  data=np.dot(norm_X,np.transpose(feature))
  return data
 
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
 
print(pca(X,1))

复制代码

上面代码实现了对数据X进行特征的降维。结果以下:

(2)用sklearn的PCA与咱们的PCA作个比较:

##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X))

复制代码


5. PCA的理论推导 PCA有两种通俗易懂的解释:
(1)最大方差理论;(2)最小化降维形成的损失。这两个思路都能推导出一样的结果。

我在这里只介绍最大方差理论:


在信号处理中认为信号具备较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引发的。

所以咱们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

好比咱们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化)


假设咱们选择两条不一样的直线作投影,那么左右两条中哪一个好呢?根据咱们以前的方差最大化理论,左边的好,由于投影后的样本点之间方差最大(也能够说是投影的绝对值之和最大)。

计算投影的方法见下图:

图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,并且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>
6. 选择降维后的维度K(主成分的个数)
如何选择主成分个数K呢?先来定义两个概念:

选择不一样的K值,而后用下面的式子不断计算,选取可以知足下列式子条件的最小K值便可。
其中t值能够由本身定,好比t值取0.01,则表明了该PCA算法保留了99%的主要信息。当你以为偏差须要更小,你能够把t值设置的更小。上式还能够用SVD分解时产生的S矩阵来表示,以下面的式子:

Reference:

(1) 主成分分析(PCA)原理详解

http://blog.csdn.net/zhongkelee/article/details/44064401

(2) 机器学习之PCA主成分分析 - steed灬 - 博客园

https://www.cnblogs.com/steed/p/7454329.html

(3) 简单易学的机器学习算法——主成分分析(PCA)

https://blog.csdn.net/google19890102/article/details/27969459

(4) 机器学习实战之PCA - 笨鸟多学 - 博客园

https://www.cnblogs.com/zy230530/p/7074215.html

(5) 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园

http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

(6) 从PCA和SVD的关系拾遗

https://blog.csdn.net/Dark_Scope/article/details/53150883

(7) CodingLabs - PCA的数学原理

http://blog.codinglabs.org/articles/pca-tutorial.html

(8) PCA(主成分分析)python实现

https://www.jianshu.com/p/4528aaa6dc48

(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的应用及部分源码分析

https://www.cnblogs.com/lochan/p/7001907.html

相关文章
相关标签/搜索