Implementing PCA/Whitening

From Ufldl

Jump to: navigation, search
Line 18: Line 18:
  sigma = x * x' / size(x, 2);
  sigma = x * x' / size(x, 2);
-
(自己推导一下看看)这里,我们假设 <math>x</math> 为一数据结构,其中每列表示一个训练样本(所以 <math>x</math> 是一个 <math>\textstyle n</math>-by-<math>\textstyle m</math> 的矩阵)。
+
(自己推导一下看看)这里,我们假设 <math>x</math> 为一数据结构,其中每列表示一个训练样本(所以 <math>x</math> 是一个 <math>\textstyle n</math>×<math>\textstyle m</math> 的矩阵)。
接下来,PCA计算 <math>\Sigma</math> 的特征向量。你可以使用Matlab的 <tt>eig</tt> 函数来计算。但是由于 <math>\Sigma</math> 是对称半正定的矩阵,用 <tt>svd</tt> 函数在数值计算上更加稳定。
接下来,PCA计算 <math>\Sigma</math> 的特征向量。你可以使用Matlab的 <tt>eig</tt> 函数来计算。但是由于 <math>\Sigma</math> 是对称半正定的矩阵,用 <tt>svd</tt> 函数在数值计算上更加稳定。
 +
具体来说,如果你使用
具体来说,如果你使用
  [U,S,V] = svd(sigma);
  [U,S,V] = svd(sigma);
-
那矩阵 <math>U</math> 将包含 <math>Sigma</math> 的特征向量(一个特征向量一列,从主向量开始排序),矩阵S 对角线上的元素将包含对应的特征值(同样降序排列)。矩阵V 等于U的转置,可以忽略。
+
那矩阵 <math>U</math> 将包含 <math>Sigma</math> 的特征向量(一个特征向量一列,从主向量开始排序),矩阵S 对角线上的元素将包含对应的特征值(同样降序排列)。矩阵 <math>\textstyle V</math> 等于 <math>\textstyle U</math> 的转置,可以忽略。
(注意 <tt>svd</tt> 函数实际上计算的是一个矩阵的奇异值和奇异向量,就对称半正定矩阵的特殊情况来说,它们对应于特征值和特征向量,这里我们也只关心这一特例。关于奇异向量和特征向量的详细讨论超出了本文范围。)
(注意 <tt>svd</tt> 函数实际上计算的是一个矩阵的奇异值和奇异向量,就对称半正定矩阵的特殊情况来说,它们对应于特征值和特征向量,这里我们也只关心这一特例。关于奇异向量和特征向量的详细讨论超出了本文范围。)
 +
最后,我们可以这样计 算<math>\textstyle x_{\rm rot}</math> 和 <math>\textstyle \tilde{x}</math> :
最后,我们可以这样计 算<math>\textstyle x_{\rm rot}</math> 和 <math>\textstyle \tilde{x}</math> :

Revision as of 16:04, 20 March 2013

Personal tools