PCA·1——主成分分析

来源:互联网 发布:js根据class删除tr 编辑:程序博客网 时间:2024/06/07 01:29

PCA·1——主成分分析

  .
  主成分分析 ( Principal Component Analysis , PCA )是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算主成分的目的是将高维数据投影到较低维空间。给定 n 个变量的 m 个观察值,形成一个 n ′ m 的数据矩阵, n 通常比较大。对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下,并不能直接找出这样的关键变量。这时我们可以用原有变量的线性组合来表示事物的主要方面, PCA 就是这样一种分析方法。
  PCA 主要 用于数据降维,对于一系列例子的特征组成的多维向量,多维向量里的某些元素本身没有区分性,比如某个元素在所有的例子中都为1,或者与1差距不大,那么这个元素本身就没有区分性,用它做特征来区分,贡献会非常小。所以我们的目的是找那些变化大的元素,即方差大的那些维,而去除掉那些变化不大的维,从而使特征留下的都是“精品”,而且计算量也变小了。 对于一个k维的特征来说,相当于它的每一维特征与其他维都是正交的(相当于在多维坐标系中,坐标轴都是垂直的),那么我们可以变化这些维的坐标系,从而使这个特征在某些维上方差大,而在某些维上方差很小。例如,一个45度倾斜的椭圆,在第一坐标系,如果按照x,y坐标来投影,这些点的x和y的属性很难用于区分他们,因为他们在x,y轴上坐标变化的方差都差不多,我们无法根据这个点的某个x属性来判断这个点是哪个,而如果将坐标轴旋转,以椭圆长轴为x轴,则椭圆在长轴上的分布比较长,方差大,而在短轴上的分布短,方差小,所以可以考虑只保留这些点的长轴属性,来区分椭圆上的点,这样,区分性比x,y轴的方法要好!
  所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。
  举一个例子:
  对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个10*100的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。
  当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。
  所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。
  PCA 的目标是寻找 r ( r<n )个新变量,使它们反映事物的主要特征,压缩原有数据矩阵的规模。每个新变量是原有变量的线性组合,体现原有变量的综合效果,具有一定的实际含义。这 r 个新变量称为“主成分”,它们可以在很大程度上反映原来 n 个变量的影响,并且这些新变量是互不相关的,也是正交的。通过主成分分析,压缩数据空间,将多元数据的特征在低维空间里直观地表示出来。例如,将多个时间点、多个实验条件下的基因表达谱数据( N 维)表示为 3 维空间中的一个点,即将数据的维数从 RN 降到 R3 。
  在进行基因表达数据分析时,一个重要问题是确定每个实验数据是否是独立的,如果每次实验数据之间不是独立的,则会影响基因表达数据分析结果的准确性。对于利用基因芯片所检测到的基因表达数据,如果用 PCA 方法进行分析,可以将各个基因作为变量,也可以将实验条件作为变量。当将基因作为变量时,通过分析确定一组“主要基因元素”,它们能够很好地说明基因的特征,解释实验现象;当将实验条件作为变量时,通过分析确定一组“主要实验因素”,它们能够很好地刻画实验条件的特征,解释基因的行为。下面着重考虑以实验条件作为变量的 PCA 分析方法。假设将数据的维数从 R N 降到 R 3 ,具体的 PCA 分析步骤如下:
  (1) 第一步计算矩阵 X 的样本的协方差矩阵 S :
  (2) 第二步计算协方差矩阵S的本征向量 e1,e2,…,eN的本征值, i = 1,2,…,N 。本征值按大到小排序:;
  (3)第三步投影数据到本征矢张成的空间之中,这些本征矢相应的本征值为。现在数据可以在三维空间中展示为云状的点集。
  对于 PCA ,确定新变量的个数 r 是一个两难的问题。我们的目标是减小 r ,如果 r 小,则数据的维数低,便于分析,同时也降低了噪声,但可能丢失一些有用的信息。究竟如何确定 r 呢?这需要进一步分析每个主元素对信息的贡献。
  贡献率表示所定义的主成分在整个数据分析中承担的主要意义占多大的比重,当取前 r 个主成分来代替原来全部变量时,累计贡献率的大小反应了这种取代的可靠性,累计贡献率越大,可靠性越大;反之,则可靠性越小。一般要求累计贡献率达到 70% 以上。
  经过 PCA 分析,一个多变量的复杂问题被简化为低维空间的简单问题。可以利用这种简化方法进行作图,形象地表示和分析复杂问题。在分析基因表达数据时,可以针对基因作图,也可以针对实验条件作图。前者称为 Q 分析,后者称为 R 分析。
  PCA在matlab中的实现举例
  以下资料来自matlab的help,翻译和注解部分由笔者添加:(重点部分添加了翻译!)
  princomp-----函数名称
  Principal component analysis (PCA) on data
  Syntax------函数调用语法
  [COEFF,SCORE] = princomp(X)
  [COEFF,SCORE,latent] = princomp(X)
  [COEFF,SCORE,latent,tsquare] = princomp(X)
  [...] = princomp(X,'econ')
  Description -----函数描述
  COEFF = princomp(X) performs principal components analysis (PCA) on the n-by-p data matrix X, and returns the principal component coefficients, also known as loadings. Rows of X correspond to observations, columns to variables. COEFF is a p-by-p matrix, each column containing coefficients for one principal component. The columns are in order of decreasing component variance.
  在n行p列的数据集X上做主成分分析。返回主成分系数。X的每行表示一个样本的观测值,每一列表示特征变量。COEFF是一个p行p列的矩阵,每一列包含一个主成分的系数,列是按主成分变量递减顺序排列。(按照这个翻译很难理解,其实COEFF是X矩阵所对应的协方差阵V的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,COEFF每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序,后面有具体例子解释,见说明1)
  princomp centers X by subtracting off column means, but does not rescale the columns of X. To perform principal components analysis with standardized variables, that is, based on correlations, use princomp(zscore(X)). To perform principal components analysis directly on a covariance or correlation matrix, use pcacov.
  计算PCA的时候,MATLAB自动对列进行了去均值的操作,但是并不对数据进行规格化,如果要规格化的话,用princomp(zscore(X))。另外,如果直接有现成的协方差阵,用函数pcacov来计算。
  [COEFF,SCORE] = princomp(X) returns SCORE, the principal component scores; that is, the representation of X in the principal component space. Rows of SCORE correspond to observations, columns to components.
  返回的SCORE是对主分的打分,也就是说原X矩阵在主成分空间的表示。SCORE每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。
  [COEFF,SCORE,latent] = princomp(X) returns latent, a vector containing the eigenvalues of the covariance matrix of X.
  返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量。
  [COEFF,SCORE,latent,tsquare] = princomp(X) returns tsquare, which contains Hotelling's T2 statistic for each data point.
  返回的tsquare,是表示对每个样本点Hotelling的T方统计量(我也不很清楚是什么东东)。
  The scores are the data formed by transforming the original data into the space of the principal components. The values of the vector latent are the variance of the columns of SCORE. Hotelling's T2 is a measure of the multivariate distance of each observation from the center of the data set.
  所得的分(scores)表示由原数据X转变到主成分空间所得到的数据。latent向量的值表示SCORE矩阵每列的方差(见说明2)。Hotelling的T方是用来衡量多变量间的距离,这个距离是指样本观测值到数据集中心的距离。
  When n <= p, SCORE(:,n:p) and latent(n:p) are necessarily zero, and the columns of COEFF(:,n:p) define directions that are orthogonal to X.
  [...] = princomp(X,'econ') returns only the elements of latent that are not necessarily zero, and the corresponding columns of COEFF and SCORE, that is, when n <= p, only the first n-1. This can be significantly faster when p is much larger than n.
  当维数p超过样本个数n的时候,用[...] = princomp(X,'econ')来计算,这样会显著提高计算速度
  Examples--举例
  (上面说了那么多废话,看了还不一定懂,还不如举例容易理解,下面样本数据集为ingredients,这个数据集是matlab自带的)
  Compute principal components for the ingredients data in the Hald data set, and the variance accounted for by each component.
  load hald; %载入matlab内部数据
  [pc,score,latent,tsquare] = princomp(ingredients); %调用pca分析函数
  ingredients,score,pc,latent,tsquare %显示得到的结果
  ingredients =
  7 26 6 60
  1 29 15 52
  11 56 8 20
  11 31 8 47
  7 52 6 33
  11 55 9 22
  3 71 17 6
  1 31 22 44
  2 54 18 22
  21 47 4 26
  1 40 23 34
  11 66 9 12
  10 68 8 12
  score =
  36.8218 -6.8709 -4.5909 0.3967
  29.6073 4.6109 -2.2476 -0.3958
  -12.9818 -4.2049 0.9022 -1.1261
  23.7147 -6.6341 1.8547 -0.3786
  -0.5532 -4.4617 -6.0874 0.1424
  -10.8125 -3.6466 0.9130 -0.1350
  -32.5882 8.9798 -1.6063 0.0818
  22.6064 10.7259 3.2365 0.3243
  -9.2626 8.9854 -0.0169 -0.5437
  -3.2840 -14.1573 7.0465 0.3405
  9.2200 12.3861 3.4283 0.4352
  -25.5849 -2.7817 -0.3867 0.4468
  -26.9032 -2.9310 -2.4455 0.4116
  pc =
  -0.0678 -0.6460 0.5673 0.5062
  -0.6785 -0.0200 -0.5440 0.4933
  0.0290 0.7553 0.4036 0.5156
  0.7309 -0.1085 -0.4684 0.4844
  latent =
  517.7969
  67.4964
  12.4054
  0.2372
  tsquare =
  5.6803
  3.0758
  6.0002
  2.6198
  3.3681
  0.5668
  3.4818
  3.9794
  2.6086
  7.4818
  4.1830
  2.2327
  2.7216
  %下面我们来做一个验证
  %下面为计算ingredients协方差矩阵:
  cov_ingredients=cov(ingredients)
  cov_ingredients =
  34.6026 20.9231 -31.0513 -24.1667
  20.9231 242.1410 -13.8782 -253.4167
  -31.0513 -13.8782 41.0256 3.1667
  -24.1667 -253.4167 3.1667 280.1667
  %下面为计算ingredients所对应的协方差矩阵(也就是cov_ingredients矩阵)的特征值和特征
  %向量,下面的矩阵V为特征向量,D为特征值(对比上面的latent)组成的对角线矩阵
  [V,D] = eig(cov_ingredients)
  V =
  0.5062 0.5673 0.6460 -0.0678
  0.4933 -0.5440 0.0200 -0.6785
  0.5156 0.4036 -0.7553 0.0290
  0.4844 -0.4684 0.1085 0.7309
  D =
  0.2372 0 0 0
  0 12.4054 0 0
  0 0 67.4964 0
  0 0 0 517.7969
  %说明1:对比一下矩阵V和矩阵pc,现在很容易明白为什么COEFF是按列递减顺序排列的
  % 了!(V中第三列与pc中倒数第三列差个负号,学过线性代数的人都知道这没问题)
  %下面再验证一下说明2
  diag(cov(score))
  ans =
  517.7969
  67.4964
  12.4054
  0.2372
  %说明2:以上结果显示latent确实表示SCORE矩阵每列的方差,517.7969表示第一列方差
  下面做图表示结果:
  上面说了半天还没有达到我们终极想要的,其实我们要的是由函数[pc,score,latent,tsquare] = princomp(ingredients)它所产生的pc和latent。由latent可以算出降维后的空间所能表示原空间的程度,只要这个累积的值大于95%就行了。
  The following command and plot show that two components account for 98% of the variance:
  cumsum(latent)./sum(latent)
  ans =
  0.86597
  0.97886
  0.9996
  1
  %由以上ans值可以看出前两个主成分就能表示原空间的97.886%,所以取pc中的前两列可
  %做主成分变换矩阵tranMatrix = pc(:,1:2)。则从原来的4维空间降到2维空间。对任意一个
  %原空间样本,例如a=(7 ,26 ,6 ,60)变到低维空间的表达式为a1 = a*tranMatrix。(当然你也可
  %以取pc中的前三列,由原来的4维空间变到3维空间)
  biplot(pc(:,1:2),'Scores',score(:,1:2),'VarLabels',...
  {'X1' 'X2' 'X3' 'X4'})
  
  

编辑本段PCA·2——可编程计数器阵列

原创粉丝点击