Implementing PCA/Whitening
From Ufldl
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> | + | (自己推导一下看看)这里,我们假设 <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 | + | 那矩阵 <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> : | ||