2月28日 PCA降维,SVD压缩,中心化、归一化、标准化、k-l变换

文章目录


修订:

  • 20200229 计算相关系数矩阵的附录:数据按列排列,与行排列,导致协方差求解不一样,需要注意。
  • 20200229 K-L变换,DCT

前言

主成分分析与马氏距离有较深层次的相互映射。
另一篇文章写数据分析中,描写了相关性:https://blog.csdn.net/djfjkj52/article/details/104307351

常见的降维方法

参考:https://zhuanlan.zhihu.com/p/43225794 介绍了12种降维/特征选择方法。

如图:
在这里插入图片描述

名称优缺点
缺失值比率:如果数据集的缺失值太多,我们可以用这种方法减少变量数。
低方差滤波:这个方法可以从数据集中识别和删除常量变量,方差小的变量对目标变量影响不大,所以可以放心删去。
高相关滤波:具有高相关性的一对变量会增加数据集中的多重共线性,所以用这种方法删去其中一个是有必要的。
随机森林:这是最常用的降维方法之一,它会明确算出数据集中每个特征的重要性。
前向特征选择和反向特征消除:这两种方法耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。
因子分析:这种方法适合数据集中存在高度相关的变量集的情况。
PCA:这是处理线性数据最广泛使用的技术之一。
ICA:我们可以用ICA将数据转换为独立的分量,使用更少的分量来描述数据。
ISOMAP:适合非线性数据处理。
t-SNE:也适合非线性数据处理,相较上一种方法,这种方法的可视化更直接。
UMAP:适用于高维数据,与t-SNE相比,这种方法速度更快。

今天注意学习PCA降维方法

1.0 PCA (主成分分析)详解:这是处理线性数据最广泛使用的技术之一。

参考:https://my.oschina.net/gujianhan/blog/225241

1.1 降维目的:是将高维度数据压缩到低维度,但保留大部分有代表性的信息

PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题,在一个几万或者几百万甚至更大的数据库中查询一幅相近的图像。这时,我们通常的方法是对图像库中的图片提取响应的特征,如颜色,纹理,sift,surf,vlad等等特征,然后将其保存,建立响应的数据索引,然后对要查询的图像提取相应的特征,与数据库中的图像特征对比,找出与之最近的图片
这里,如果我们为了提高查询的准确率,通常会提取一些较为复杂的特征,如sift,surf等,一幅图像有很多个这种特征点,每个特征点又有一个相应的描述该特征点的128维的向量,设想如果一幅图像有300个这种特征点,那么该幅图像就有300*vector(128维)个,如果我们数据库中有一百万张图片,这个存储量是相当大的,建立索引也很耗时,如果我们对每个向量进行PCA处理,将其降维为64维,是不是很节约存储空间啊?对于学习图像处理的人来说,都知道PCA是降维的,但是,很多人不知道具体的原理,为此,我写这篇文章,来详细阐述一下PCA及其具体计算过程。

1.2 核心思想:PCA就是通过正交变换将原始的n维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量。

  • 主成分是原始变量的线性组合。
  • 第一个主成分具有最大的方差值。
  • 第二主成分试图解释数据集中的剩余方差,并且与第一主成分不相关(正交)。
  • 第三主成分试图解释前两个主成分等没有解释的方差。

1.3 PCA详解降维

PCA降维的基本思想:通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值、特征向量、选择特征值最大(即方差最大)的K个特征 所对应的特征向量组成的矩阵,这样可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

1.3.1 PCA降维有两种思路:一种是特征值分解协方差矩阵,一种是奇异值分解协方差矩阵**

https://blog.csdn.net/qq_24163555/article/details/89401069

2.0 二维降维一维的实例:

我们先看看最简单的情况,将数据从二维降维到一维。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向, u 1 u_1 u1 u 2 u_2 u2,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出, u 1 u_1 u1 u 2 u_2 u2好。

在这里插入图片描述
为什么 u 1 u_1 u1 u 2 u_2 u2好呢?可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。

假如我们把 n ′ n' n从1维推广到任意维,则我们的希望降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。

1、原始数据:

为了方便,我们假定数据是二维的,借助网络上的一组数据,如下:

x = [ 2.5 , 0.5 , 2.2 , 1.9 , 3.1 , 2.3 , 2 , 1 , 1.5 , 1.1 ] T x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]^T x=[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]T
y = [ 2.4 , 0.7 , 2.9 , 2.2 , 3.0 , 2.7 , 1.6 , 1.1 , 1.6 , 0.9 ] T y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]^T y=[2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]T

2、计算协方差矩阵

(1)协方差矩阵:
首先我们给你一个含有n个样本的集合,依次给出数理统计中的一些相关概念:

在这里插入图片描述

标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解这几科成绩之间的关系,这时,我们就要用协方差,协方差就是一种用来度量两个随机变量关系的统计量,其定义为:

在这里插入图片描述

从协方差的定义上我们也可以看出一些显而易见的性质,如:
在这里插入图片描述
在这里插入图片描述

需要注意的是,协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算在这里插入图片描述个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:
在这里插入图片描述
这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有{x,y,z}三个维度,则协方差矩阵为:

在这里插入图片描述
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

(2)协方差矩阵的求法:

协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。下面我们将在matlab中用一个例子进行详细说明:

1.3.2 解释:样本矩阵的每行是一个样本,每列为一个维度。矩阵表达的是一个“系统”信息。

在这里插入图片描述

%随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数
MySample = fix(rand(10,3)*50);

%为了描述方便,我们先将三个维度的数据分别赋值:

dim1 = MySample(:,1);
dim2 = MySample(:,2);
dim3 = MySample(:,3);

% 计算协方差需要计算均值,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。

%计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:

sum( (dim1-mean(dim1)) .* (dim2-mean(dim2)) ) / ( size(MySample,1)-1 ) % 得到  74.5333
sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到  -10.0889
sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到  -10***000

%协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算:

std(dim1)^2 % 得到   108.3222
std(dim2)^2 % 得到   260.6222
std(dim3)^2 % 得到  94.1778

% 这样,我们就得到了计算协方差矩阵所需要的所有数据,调用Matlab自带的cov函数进行验证:
cov(MySample)

%可以看到跟我们计算的结果是一样的,说明我们的计算是正确的。

用下面简化的方法进行计算:
先让样本矩阵中心化,即每一维度减去该维度的均值,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可。其实这种方法也是由前面的公式通道而来,只不过理解起来不是很直观而已。大家可以自己写个小的矩阵看一下就明白了。其Matlab代码实现如下:

X = MySample – repmat(mean(MySample),10,1);    % 中心化样本矩阵
C = (X’*X)./(size(X,1)-1)

B = repmat(A,m,n ) %%将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, (size(A,2)*n]

B = mean(A)的说明:
如果你有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
(1) 用mean(A)(默认dim=1)就会求每一列的均值,
ans =
3.0000 4.5000 6.0000
(2)用mean(A,2)就会求每一行的均值
ans =
2.0000
4.0000
6.0000
6.0000

size(A,n)%% 如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的是矩阵A的行数, c=size(A,2) 该语句返回的是矩阵A的列数)

原始数据中的协方差矩阵

在这里插入图片描述

计算协方差矩阵的特征向量和特征值

因为协方差矩阵为方阵,我们可以计算它的特征向量和特征值,如下:

[eigenvectors,eigenvalues] = eig(cov)

在这里插入图片描述
我们可以看到这些矢量都是单位矢量,也就是它们的长度为1,这对PCA来说是很重要的。

4、选择成分组成模式矢量

求出协方差矩阵的特征值及特征向量之后,按照特征值由大到小进行排列,这将给出成分的重要性级别。现在,如果你喜欢,可以忽略那些重要性很小的成分,当然这会丢失一些信息,但是如果对应的特征值很小,你不会丢失很多信息。如果你已经忽略了一些成分,那么最后的数据集将有更少的维数,精确地说,如果你的原始数据是n维的,你选择了前p个主要成分,那么你现在的数据将仅有p维。现在我们要做的是组成一个模式矢量(这只是几个矢量组成的矩阵的一个有意思的名字而已),它由你保持的所有特征矢量构成,每一个特征矢量是这个矩阵的一列

对于我们的数据集,因为有两个特征矢量,因此我们有两个选择。

我们可以用两个特征矢量组成模式矢量:
在这里插入图片描述

我们也可以忽略其中较小特征值的一个特征矢量,从而得到如下模式矢量:
在这里插入图片描述

5、得到降维后的数据

在这里插入图片描述

其中rowFeatureVector是由模式矢量作为列组成的矩阵的转置 T ^T T,因此它的行就是原来的模式矢量,而且对应最大特征值的特征矢量在该矩阵的最上一行。

rowdataAdjust是每一维数据减去均值后,所组成矩阵的转置,即数据项目在每一列中,每一行是一维,对我们的样本来说即是,第一行为x维上数据,第二行为y维上的数据。FinalData是最后得到的数据,数据项目在它的列中,维数沿着行。

这将给我们什么结果呢?这将仅仅给出我们选择的数据。我们的原始数据有两个轴(x和y),所以我们的原始数据按这两个轴分布。我们可以按任何两个我们喜欢的轴表示我们的数据。如果这些轴是正交的,这种表达将是最有效的,这就是特征矢量总是正交的重要性。我们已经将我们的数据从原来的xy轴表达变换为现在的单个特征矢量表达。

(说明:如果要恢复原始数据,只需逆过程计算即可,即:

在这里插入图片描述
在这里插入图片描述
到此为止,PCA及其原理了

3.0 PCA的function:

https://blog.csdn.net/watkinsong/article/details/38536463

function S=princa(X)[m,n]=size(X); 
%计算矩阵的行m和列n 
%-------------第一步:标准化矩阵-----------------%
mv=mean(X); %计算各变量的均值
st=std(X); %计算各变量的标准差
X=X-repmat(mv,m,1); %标准化矩阵X 

%-------------第二步:计算相关系数矩阵-----------------%
% R1=X'*X/(m-1); %方法一:协方差矩阵计算公式
% R2=cov(X);     %方法二:协方差矩阵计算函数
R=corrcoef(X); %方法三:相关系数矩阵函数 

%-------------第三步:计算特征向量和特征值-----------------%
[V,D]=eig(R);       
%计算矩阵R的特征向量矩阵V和特征值矩阵D,特征值由小到大      
%将特征向量矩阵V从大到小排序  
%将特征值矩阵由大到小排序
E=diag(D);          %将特征值矩阵转换为特征值向量 

%-------------第四步:计算贡献率和累计贡献率-----------------%
ratio=0; %累计贡献率
for k=1:n    
    r=E(k)/sum(E);   %第k主成份贡献率    
    ratio=ratio+r;  %累计贡献率    
    if(ratio>=0.8)  %取累计贡献率大于等于90%的主成分        
         q=k;        
         break;   
    end
end 

%-------------第五步:计算得分-----------------%
V=V(:,1:q);
S=X*V;

mean(x)默认求矩阵列的平均值。mean(x,2)求矩阵行的平均值。

std函数:求矩阵的标准差

std(A)是最常见的求标准差的函数,除以的是N-1

std(A,flag)代表的是用哪一个标准差函数,如果取0则代表除以N-1,如果1代表的是除以N

std(A,flag,dim)第三个参数代表的是按照列求标准差,还是按照行求标准差。

repmat函数处理大矩阵且内容重复时会用到

eg B=repmat([1 2;3 4],2,3)

B= 1 2 1 2 1 2

  3 4  3 4 3 4

  1 2  1 2 1 2

  3 4  3 4 3 4  

length(x)矩阵 M行N列返回M和N这两个数的最大值。

归一化(按列减均值)

标准化(按列缩放到指定范围)

正则化(范数)

eig函数的用法

a=[-1,1,0;-4,3,0;1,0,2]

eig(a)= [2,1,1]’

[v,d]=eig(a)

v =

     0    0.4082    0.4082
     0    0.8165    0.8165
1.0000   -0.4082   -0.4082

d =

 2     0     0
 0     1     0
 0     0     1

v是特征向量对应的特征矩阵。d是特征向量组成的矩阵。

rot函数的用法

b=rot90(a)逆时针旋转90度

b=rot90(a,-1)顺时针旋转90度

%%%%%%%%%%%%%%%%%%%%%%%%%
如何选择主成分个数K??
最好的K维特征是将n维样本点转换为K维后,每一维上的样本方差都很大。

第二步:计算相关系数矩阵的附录:

参考:https://blog.csdn.net/Mr_HHH/article/details/78490576

X、Y 是两个随机变量,X、Y 的协方差 cov(X, Y) 定义为:
在这里插入图片描述
矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。
在这里插入图片描述
协方差矩阵:
在这里插入图片描述
协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / m,而不是 1 / (m - 1).【!!???】

  1. 求解协方差矩阵的步骤
    在这里插入图片描述

注意:
有时候在书上或者网上会看到这样的公式,协方差矩阵 Σ:
在这里插入图片描述
这里之所以会是 X * X’ 是因为原始数据集 X 是按列排列的,即:
在这里插入图片描述
另外在 opencv 文档中关于计算协方差矩阵的 calcCovarMatrix 函数的说明我觉得是有问题的,
在正常的 CV_COVAR_NORMAL 状态下它给出的 cov = scale * X * X’,而这个定义仅仅是在数据按列排列下才有的,即 CV_COVAR_COLS.
URL:http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=calccovarmatrix#cv.CalcCovarMatrix

流程总结

从上面两节我们可以看出,求样本 x ( i ) x^{(i)} x(i) n ′ n' n维的主成分其实就是求样本集的协方差矩阵 X X T XX^T XXT的前 n ′ n' n个特征值对应特征向量矩阵 W W W,然后对于每个样本 x ( i ) x^{(i)} x(i),做如下变换 z ( i ) = W T x ( i ) z^{(i)}=W^Tx^{(i)} z(i)=WTx(i),即达到降维的PCA目的。

下面我们看看具体的算法流程。

输入: n n n维样本集 D = ( x ( 1 ) , x ( 2 ) , . . . , x ( m ) ) D=(x^{(1)},x^{(2)},...,x^{(m)}) D=(x(1),x(2),...,x(m)),要降维到的维数 n ′ n' n.

输出:降维后的样本集 D ′ D′ D
    
    1) 对所有的样本进行中心化: x ( i ) = x ( i ) − 1 m ∑ j = 0 m x ( j ) x^{(i)}=x^{(i)}−\frac{1}{m}\sum_{j=0}^m x^{(j)} x(i)=x(i)m1j=0mx(j)
    2) 计算样本的协方差矩阵 X X T XX^T XXT
    3) 对矩阵 X X T XX^T XXT进行特征值分解
    4)取出最大的 n ′ n' n个特征值对应的特征向量 ( w 1 , w 2 , . . . , w n ′ ) (w_1,w_2,...,w_{n′}) (w1,w2,...,wn), 将所有的特征向量标准化后,组成特征向量矩阵 W W W
    5)对样本集中的每一个样本 x ( i ) x^{(i)} x(i),转化为新的样本 z ( i ) = W T x ( i ) z^{(i)}=W^Tx^{(i)} z(i)=WTx(i)
    6) 得到输出样本集 D ′ = ( z ( 1 ) , z ( 2 ) ) . . . , z ( m ) ) D^′=(z^{(1)},z^{(2))}...,z^{(m)}) D=(z(1),z(2))...,z(m))

PCA实现的方式其实有四种:
标准化数据后的协方差矩阵
标准化数据后的相关系数矩阵
未标准化数据后的相关系数矩阵
标准化数据后的svd方式
这四种方式是等价的。

有时候,我们不指定降维后的 n ′ n' n的值,而是换种方式,指定一个降维到的主成分比重阈值 t t t。这个阈值 t t t ( 0 , 1 ] (0,1] 0,1]之间。假如我们的 n n n个特征值为 λ 1 ≥ λ 2 ≥ . . . ≥ λ n λ_1≥λ_2≥...≥λ_n λ1λ2...λn,则 n ′ n' n可以通过下式得到:

在这里插入图片描述

也可以:可以采用下面的公式计算 k 的取值, 因为在 对协方差矩阵进行奇异值分解的时候返回了 S , S 为协方差矩阵的特征值, 并且 S 是对角矩阵, 维度为 n * n, 计算 k 的取值如下:
在这里插入图片描述

X.0思考:PCA流程中的 1) 对所有的样本进行中心化;与归一化;是都需要?

链接:https://www.jianshu.com/p/ae9db78ebb0f

1.将数据进行中心化的原因:(平移)

减去均值等同于坐标移动,这样就能把原始数据点的中心移到与原点重合,此举有利于很多表达,比如数据的协方差矩阵可以直接写成XX’,若没有减去均值,则每两个特征之间都要进行(X-X均值)(Y-Y均值)运算,再组合成协方差矩阵。

2.将数据除以标准差的原因:(拉伸)

除以标准差是为了统一并消除量纲。一个样本中有多个特征,有些可能表示长度,有些可能表示重量。如果各个特征之间的数值或数量级存在较大差异,就会使得较小的数被淹没,导致主成分偏差较大。所以要将每个特征对应的样本除以标准差,这样才能让他们仅以“数的概念一起比较运算”。

简言之—除以标准差的作用:去掉量纲,将不同量纲的数据拉伸至同一水平。公平比较。

PCA的深层次解释:
协方差矩阵和主成分分析
m.blog.csdn.net/article/details
浅谈协方差矩阵
pinkyjie.com/2010/08/31/covariance/

方程比较:

链接:https://www.jianshu.com/p/95a8f035c86c

归一化

(1)Min-Max Normalization
   x’ = (x - X_min) / (X_max - X_min)

(2)平均归一化
   x’ = (x - μ) / (MaxValue - MinValue)
  (1)和(2)有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

(3)非线性归一化
  1)对数函数转换:y = log10(x)
  2)反余切函数转换:y = atan(x) * 2 / π
  (3)经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

标准化

(1)Z-score规范化(标准差标准化 / 零均值标准化)
  x’ = (x - μ)/σ

中心化

x’ = x - μ

定义

1 概念
  归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。 适用于本来就分布在有限范围内的数据。
  标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。适用于分布没有明显边界的情况。
  中心化:平均值为0,对标准差无要求
  
  归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。
  标准化和中心化的区别:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。
  无量纲:我的理解就是通过某种方法能去掉实际过程中的单位,从而简化计算。

进行归一化的原因是把各个特征的尺度控制在相同的范围内,这样可以便于找到最优解,不进行归一化时如左图,进行归一化后如右图,可发现能提高收敛效率,省事多了。
在这里插入图片描述
深度学习中,去均值作用
1.各维度都减对应维度的均值,使得输入数据各个维度都中心化为0,进行去均值的原因是因为如果不去均值的话会容易拟合。 这是因为如果在神经网络中,特征值x比较大的时候,会导致W*x+b的结果也会很大,这样进行激活函数(如relu)输出时,会导致对应位置数值变化量太小,进行反向传播时因为要使用这里的梯度进行计算,所以会导致梯度消散问题,导致参数改变量很小,也就会易于拟合,效果不好。
原文链接:https://blog.csdn.net/maqunfi/article/details/82252480
在这里插入图片描述

中心化是对每一个样本向量做的,而预处理是对每一特征维度做的,这也可以反应中心化并不算是预处理。

https://www.zhihu.com/question/40956812
个人觉得 去均值化是为了方面后面的协方差,去均值化后各维度均值为零,协方差中的均值也就是零了,方便求解。

具体,假设矩阵A去中心化后得到B,那么B的协方差就是B*B的转置

因为不做zero mean,根本做不了PCA。从线性变换的本质来说,PCA就是在线性空间做一个旋转(数据矩阵右乘协方差矩阵的特征向量矩阵),然后取低维子空间(实际上就是前n_components个特征向量张成的子空间)上的投影点来代替原本的点,以达到降维的目的,注意我说的,只做了旋转,没有平移,所以首先你要保证原本空间里的点是以原点为中心分布的,这就是zero mean的目的。

另外如果自己手撸过PCA的算法就知道了,explained_variance_和explained_variance_ratio_是怎么实现的?explained_variance就是协方差矩阵的每个特征值除以sample数,而explained_variance_ratio_是每个特征值除以所有特征值之和。为什么这么简单呢?这也和zero mean有关,如果你用最大投影长度的证法去证明PCA就会在过程中很自然的发现这一点。

数据都需要标准化,让每个维度的重要性一样。如果已知某维度比较重要,可以再乘上系数。

http://sofasofa.io/forum_main_post.php?postid=1000375

PCA(主成分分析)所对应的数学理论是SVD(矩阵的奇异值分解)。而奇异值分解本身是完全不需要对矩阵中的元素做标准化或者去中心化的。

但是对于机器学习,我们通常会对矩阵(也就是数据)的每一列先进行标准化。

PCA通常是用于高维数据的降维,它可以将原来高维的数据投影到某个低维的空间上并使得其方差尽量大。如果数据其中某一特征(矩阵的某一列)的数值特别大,那么它在整个误差计算的比重上就很大,那么可以想象在投影到低维空间之后,为了使低秩分解逼近原数据,整个投影会去努力逼近最大的那一个特征,而忽略数值比较小的特征。因为在建模前我们并不知道每个特征的重要性,这很可能导致了大量的信息缺失。为了“公平”起见,防止过分捕捉某些数值大的特征,我们会对每个特征先进行标准化处理,使得它们的大小都在相同的范围内,然后再进行PCA。

此外,从计算的角度讲,PCA前对数据标准化还有另外一个好处。因为PCA通常是数值近似分解,而非求特征值、奇异值得到解析解,所以当我们使用梯度下降等算法进行PCA的时候,我们最好先要对数据进行标准化,这是有利于梯度下降法的收敛。

这个给力!估计很多人跟我一样,只注意到第二点。但是我觉得你写得第一点更重要!

应该说是数据都需要标准化,让每个维度的重要性一样。如果已知某维度比较重要,可以再乘上系数。然后再是PCA的问题

PCA算法总结

这里对PCA算法做一个总结。作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。为了克服PCA的一些缺点,出现了很多PCA的变种,比如为解决非线性降维的KPCA,还有解决内存限制的增量PCA方法Incremental PCA,以及解决稀疏数据降维的PCA方法Sparse PCA等。

PCA算法的主要优点有:

1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。

2)各主成分之间正交,可消除原始数据成分间的相互影响的因素。

3)计算方法简单,主要运算是特征值分解,易于实现。

PCA算法的主要缺点有:

1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。

2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

4.0 SVD用于PCA:

https://www.cnblogs.com/pinard/p/6251584.html
左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维

在主成分分析(PCA)原理总结中,我要用PCA降维,需要找到样本协方差矩阵 X T X X^TX XTX的最大的 d d d个特征向量,然后用这最大的 d d d个特征向量张成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 X T X X^TX XTX,当样本数多样本特征数也多的时候,这个计算量是很大的。

注意到我们的SVD也可以得到协方差矩阵 X T X X^TX XTX最大的 d d d个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不求先求出协方差矩阵 X T X X^TX XTX,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。

另一方面,注意到PCA仅仅使用了我们SVD的右奇异矩阵,没有使用左奇异矩阵,那么左奇异矩阵有什么用呢?

假设我们的样本是 m × n m×n m×n的矩阵 X X X,如果我们通过SVD找到了矩阵 X X T XX^T XXT最大的 d d d个特征向量张成的 m × d m×d m×d维矩阵U,则我们如果进行如下处理:
X d × n ′ = U d × m T X m × n X'_{d×n}= U^T_{d×m}X_{m×n} Xd×n=Ud×mTXm×n
可以得到一个 d × n d×n d×n的矩阵 X ‘ X‘ X,这个矩阵和我们原来的 m × n m×n m×n维样本矩阵 X X X相比,行数从 m m m减到了 d d d,可见对行数进行了压缩。也就是说,左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维

附录:SVD 简化矩阵求解

https://www.bilibili.com/video/av15971352?p=2
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:

在这里插入图片描述
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据预处理标准化后的效果

没做标准化的PCA是找covariance matrix的eigenvector,标准化后的PCA是找correlation matrix的eigenvector。如清风说的第一点,如果没有做标准化,eigenvector会偏向方差最大的变量,偏离理论上的最佳值。

举例说明。假设一个2维Gaussian,correlation matrix是[1 0.4;0.4 1], std(x1)=10,std(x2)=1。理论上最佳的分解向量是椭圆的长轴,如果没有做标准化,PCA算出的向量和长轴会有偏差。标准化后偏差会减到很小。

#standarization of PCA
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
np.set_printoptions(precision=3)
np.random.seed(0)
n=1000000
mu=[0,0]
corr=np.array([[1.,.4],[.4,1.]])
std_vector=[10.,1]

A_ori=np.random.multivariate_normal(mu,corr,n)
A_scaled=np.matmul(A_ori,np.diag(std_vector))
scaler = StandardScaler()
scaler.fit(A_scaled)
A_standarized=scaler.transform(A_scaled)

pca = PCA()
pca.fit(A_scaled)
pca1 = PCA()
pca1.fit(A_standarized)

print('Correlation Coefficient matrix is:')
print(corr)
print('std vector is:')
print(std_vector)

print('Covariance matrix is:')
print(np.cov(A_scaled.T))

print('---Before standarization---')
print('Components:')
print(pca.components_)
print('Sigular values:')
print(pca.explained_variance_)

print('---After standarization---')
print('Components:')
print(pca1.components_)
print('Sigular values:')
print(pca1.explained_variance_)

在这里插入图片描述

主分量分析(PCA)、K-L变换(Hotelling变换)是一种方法

https://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter11/chapt11_ahz.htm
一般而言,这一方法的目的是寻找任意统计分布的数据集合之主要分量的子集。相应的基向量组满足正交性且由它定义的子空间最优地考虑了数据的相关性。将原始数据集合变换到主分量空间使单一数据样本的互相关性(cross-correlation)降低到最低点。

上述方法是图象数据压缩的数学基础之一,通常被称为Principal Component Analysis (PCA)或Karhunen-Loeve (K-L)变换。

K-L变换的核心过程是计算特征值和特征向量,有很多不同的数值计算方法。一种常采用的方法是根据如下的推导:
在这里插入图片描述

奇异值分解(SVD)

奇异值分解(Singular Value Decomposition)是矩阵分析中正规矩阵酉对角化的推广。设矩阵A是m*n的秩为r,它的奇异值是指n阶方阵 A H A A^HA AHA(或m阶方阵 A A H AA^H AAH)的正特征值的平方根 ( A H A^H AH是A的共轭转置)。奇异值分解 是指如下形式的分解:
在这里插入图片描述

对于图象数据而言,任意一个的N*N矩阵A定义的奇异值变换为:
在这里插入图片描述

Cov = 1 / (m-1) * (X' * X);
[U, S, V] = svd(Cov);
fprintf('compute cov done.\n');

%% dimension reduction
k = 100; % reduce to 100 dimension
test = zeros(2, 32 * 64);
for i = 1:2
  img = imread(strcat('./pic_origin/',int2str(i + 180), '.jpg'));
  img = double(rgb2gray(img));
  img = imresize(img, [32 64]);
  test(i, :) = img(:);
end
 
% test set need to do normalization
test_norm = bsxfun(@minus, test, mu);
test_norm = bsxfun(@rdivide, test_norm, sigma);
 
% reduction
Uk = U(:, 1:k);
Z = test_norm * Uk;
fprintf('reduce done.\n');

K-L与DCT

这时DCT的基向量可以很好地近似K-L变换的基向量。由于这个原因,在图象压缩算法中常被用来代替K-L变换,如JPEG算法。尽管DCT在降低谱的相关性方面不如K-L变换有效,但是其好处是它的基函数是固定的,而K-L变换的基函数取决于待变换图象的协方差矩阵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hali_Botebie

文中错误请不吝指正!!!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值