在数据分析中,选择协方差矩阵中最大的特征值和特征向量意味着什么?

12

假设有一个名为B的矩阵,大小为500*1000 double(这里的500表示观测数,1000表示特征数)。

sigma是矩阵B的协方差矩阵,D是一个对角矩阵,其对角线元素为sigma的特征值。假设A是协方差矩阵sigma的特征向量。

我有以下问题:

  1. 我需要选择前k=800个对应于最大幅度特征值的特征向量来排名所选特征。生成的最终矩阵名为Aq。我该如何在MATLAB中实现?

  2. 这些被选择的特征向量有什么含义?

  3. 似乎计算得到的最终矩阵Aq大小为1000*800 double。观测时间点/信息的500已经消失。对于最终矩阵Aq,现在矩阵中的1000代表什么?800代表什么?

1个回答

24
我假设你使用eig函数确定了特征向量。在未来,我建议你使用eigs函数。它不仅会计算出特征值和特征向量,还会为你计算与其关联的k 最大 特征值及其特征向量。这可以节省计算开销,使你不必计算矩阵的所有特征值和相关特征向量,因为你只需要其中一部分。你只需提供数据的协方差矩阵给eigs函数,它就会为你返回k个最大的特征值和特征向量。
现在回到您的问题,您所描述的最终是主成分分析。其背后的机制是计算数据的协方差矩阵并找到计算结果的特征值和特征向量。众所周知,以这种方式进行不推荐,因为计算大矩阵的特征值和特征向量存在数值不稳定性。现在最常用的方法是通过奇异值分解来完成。具体而言,矩阵V的列给出了协方差矩阵或主成分的特征向量,相关的特征值是矩阵S对角线上产生的奇异值的平方根。

请参见Cross Validated上的这篇信息文章,了解为什么这是首选:

https://stats.stackexchange.com/questions/79043/why-pca-of-data-by-means-of-svd-of-the-data

我还会再提供一个链接,讲解奇异值分解在主成分分析中被使用的理论背景:

https://stats.stackexchange.com/questions/134282/relationship-between-svd-and-pca-how-to-use-svd-to-perform-pca


现在让我们逐个回答您的问题。

问题 #1

MATLAB 生成特征值和相应的特征向量的顺序是未排序的。如果您希望从eig的输出(例如,800)中选择最大的k个特征值和相应的特征向量,则需要按降序对特征值进行排序,然后重新排列从eig产生的特征向量矩阵的列,然后选择前k个值。

我还应该指出,使用eigs不能保证排序顺序,因此在必要时您也必须明确排序这些内容。

在MATLAB中,执行上述操作看起来像这样:

sigma = cov(B);
[A,D] = eig(sigma);
vals = diag(D);
[~,ind] = sort(abs(vals), 'descend');
Asort = A(:,ind);

请注意,对特征值的排序是基于其绝对值进行的,因为经过缩放后的特征值本身也是特征值。这些缩放值还包括负数。这意味着,如果我们有一个特征值为-10000的分量,则这非常明显地表明该分量对您的数据具有重要意义,如果我们仅按数字本身排序,则会将其放置在较低的排名附近。
代码的第一行找到了B的协方差矩阵,即使您说它已经存储在sigma中,但让我们使其可以再现。接下来,我们找到您的协方差矩阵的特征值和相关的特征向量。请注意,特征向量矩阵A的每个列代表一个特征向量。具体而言,A的第i列/特征向量对应于在D中看到的第i个特征值。
然而,特征值在对角矩阵中,因此我们使用diag命令提取出对角线,将其排序并确定它们的顺序,然后重新排列A以遵守这个顺序。我使用sort的第二个输出,因为它告诉您未排序结果中每个值在排序结果中出现的位置。这是我们需要重新排列特征向量矩阵A列的顺序。必须选择'descend'作为标志,以便最大的特征值和相关的特征向量首先出现,就像我们之前讨论过的那样。
然后,您可以通过以下方式挑选出前k个最大的向量和值:
k = 800;
Aq = Asort(:,1:k);

问题#2

众所周知,协方差矩阵的特征向量等于主成分。具体来说,第一个主成分(即最大特征向量和相关的最大特征值)给出了数据中最大可变性的方向。接下来的每个主成分都会给出递减的可变性。值得注意的是,每个主成分都正交于其他主成分。

以下是维基百科上针对二维数据的良好示例:

我从上面链接的维基百科主成分分析文章中获取了上述图像。这是一个样本散点图,其分布符合以(1,3)为中心、在(0.878, 0.478)方向上标准差约为3,在正交方向上标准差为1的二元高斯分布。标准差为3的分量是第一主成分,而正交的分量是第二主成分。所示向量是协方差矩阵的特征向量,按相应特征值的平方根缩放,并移动到它们的尾部位于平均值处。
现在让我们回到你的问题。我们查看前k个最大的特征值的原因是进行降维的一种方式。实质上,您将执行数据压缩,其中您将把高维数据投影到低维空间中。在投影中包括的主成分越多,它就越类似于原始数据。它实际上在某个点开始逐渐变得平稳,但前几个主成分允许您在很大程度上忠实地重构数据。

我曾经偶然发现了一个非常好的Quora帖子,其中提供了一个很棒的视觉示例,用于执行PCA(或SVD),并进行数据重建。

http://qr.ae/RAEU8a

第三题

您可以使用此矩阵将高维数据重新投影到较低维空间中。行数仍为1000,这意味着您的数据集中最初有1000个特征。将此矩阵视为从特征的原始维度(1000)向其降低的维度(800)的转换。

然后,您将与此矩阵一起使用重建原始数据。具体来说,这将为您提供最小误差下原始数据的近似值。在这种情况下,您不需要使用所有主成分(即只需使用k个最大向量),并且可以使用比以前更少的信息创建您的数据的近似值。

如何重构数据非常简单。首先让我们讨论完整数据的正向和反向操作。正向操作是获取原始数据并重新投影,但我们将使用所有组件,而不是较低的维数。您首先需要进行均值减法处理的原始数据:

Bm = bsxfun(@minus, B, mean(B,1));

Bm将产生一个矩阵,其中每个样本的每个特征都被减去了均值。bsxfun允许在不等尺寸的情况下减去两个矩阵,前提是您可以广播维度,使它们匹配。具体而言,在这种情况下,将计算B的每列/特征的平均值,并生成一个临时复制矩阵,其大小与B一样大。当您用此复制矩阵减去原始数据时,效果将减去每个数据点及其各自特征的平均值,从而使您的数据分散,以便每个特征的平均值为0。

一旦完成此操作,进行投影的操作就非常简单:

Bproject = Bm*Asort;

以上操作非常简单。您正在做的是将每个样本的特征表示为主成分的线性组合。例如,给定去中心化数据的第一个样本或第一行,投影域中第一个样本的特征是整个样本所涉及的行向量和第一个主成分(列向量)的点积。在投影域中,第一个样本的第二个特征是整个样本和第二个成分的加权和。您需要为所有样本和所有主成分重复此过程。实际上,您正在重新投影数据,使其相对于主成分——这是正交基向量,可以将您的数据从一种表示转换为另一种表示。
这里可以找到我刚才谈论的更好的描述。看看Amro的答案: Matlab Principal Component Analysis (eigenvalues order) 现在要反向操作,您只需执行逆操作,但特征向量矩阵具有的一个特殊属性是,如果您对其进行转置,则会得到逆矩阵。要恢复原始数据,请撤消上述操作并将平均值添加回问题中:
out = bsxfun(@plus, Bproject*Asort.', mean(B, 1));

您想要获取原始数据,因此您正在解决相对于我之前执行的操作的 Bm。然而,在这里,Asort 的逆只是转置。在执行此操作后发生的情况是,您正在获取原始数据,但数据仍然是分散的。要获取原始数据,您必须将每个特征的平均值添加回数据矩阵中,以获得最终结果。这就是为什么我们在这里使用另一个 bsxfun 调用,以便您可以对每个样本的特征值执行此操作。
通过上面两行代码,您应该能够在原始域和投影域之间来回切换。现在,降维(或原始数据的近似)起作用的是反向操作。首先,您需要将数据投影到主成分的基上(即正向操作),但是现在要返回到原始域,在那里我们试图使用减少的主成分数量重构数据,您只需在上述代码中用 Aq 替换 Asort,并且还要减少在 Bproject 中使用的特征数量。具体而言:
out = bsxfun(@plus, Bproject(:,1:k)*Aq.', mean(B, 1));

执行Bproject(:,1:k)会选择在您的数据投影域中与k个最大特征向量对应的k个特征。有趣的是,如果您只想要关于降低维度的数据表示,您可以使用Bproject(:,1:k)就足够了。然而,如果您想继续计算原始数据的近似值,我们需要进行反向计算。上述代码仅仅是我们之前在数据完整维度上使用的代码,但我们同时使用Aq以及从Bproject中选择出k个特征。这将给出由矩阵中k个最大特征向量/特征值表示的原始数据。


如果您想看到一个很棒的例子,我会模仿我给您链接的Quora帖子,但使用另一张图片。考虑使用灰度图像进行此操作,其中每行是“样本”,每列是特征。让我们使用图像处理工具箱中的摄影师图像。
im = imread('camerman.tif');
imshow(im); %// Using the image processing toolbox

我们得到这个图像:

enter image description here

这是一个256 x 256的图像,意味着我们有256个数据点,每个点有256个特征。我要做的是将图像转换成double,以便于计算协方差矩阵的精度。现在我要重复上述代码,但逐步增加k的值从3、11、15、25、45、65和125。因此,对于每个k,我们引入更多的主成分,应该会慢慢开始重建我们的数据。
下面是一些可运行的代码,用于说明我的观点:
%%%%%%%// Pre-processing stage
clear all;
close all;

%// Read in image - make sure we cast to double
B = double(imread('cameraman.tif'));

%// Calculate covariance matrix
sigma = cov(B);

%// Find eigenvalues and eigenvectors of the covariance matrix
[A,D] = eig(sigma);
vals = diag(D);

%// Sort their eigenvalues
[~,ind] = sort(abs(vals), 'descend');

%// Rearrange eigenvectors
Asort = A(:,ind);

%// Find mean subtracted data
Bm = bsxfun(@minus, B, mean(B,1));

%// Reproject data onto principal components
Bproject = Bm*Asort;

%%%%%%%// Begin reconstruction logic
figure;
counter = 1;

for k = [3 11 15 25 45 65 125 155]
    %// Extract out highest k eigenvectors
    Aq = Asort(:,1:k);

    %// Project back onto original domain
    out = bsxfun(@plus, Bproject(:,1:k)*Aq.', mean(B, 1));

    %// Place projection onto right slot and show the image
    subplot(4, 2, counter);
    counter = counter + 1;
    imshow(out,[]);
    title(['k = ' num2str(k)]);
end

正如您所看到的,大部分代码与我们所见的相同。不同之处在于我循环遍历所有 k 的值,使用前 k 个特征向量将其投影回原始空间(即计算近似值),然后显示图像。
我们得到了这个漂亮的图像:

enter image description here

k=3 开始,并没有为我们带来什么好处...我们可以看到一些一般性结构,但增加更多的部件也不会有害。随着组件数量的增加,我们开始更清晰地看到原始数据的样貌。在 k=25 时,我们实际上可以完美地看到摄影师的样子,并且我们不需要26及其以后的部件来了解发生了什么。这就是我所谈论的数据压缩问题,您不需要处理所有的主要部件即可清晰地了解正在发生的情况。


我想通过引用Chris Taylor关于主成分分析的精彩阐述来结束这个注释,其中包括代码、图表和很好的解释!这是我开始学习PCA的地方,但Quora的帖子才巩固了我的知识。

Matlab - 多维数据的PCA分析和重构


1
@Olologin - 说实话,我除了协方差矩阵外从未使用过特征向量和特征值。然而,根据我的了解,特征向量和特征值的一个结果是,矩阵乘法在矩阵和向量之间进行时等于将相同的向量按一定比例缩放。在几何意义上,如果你沿着特征向量的方向拉它们,这看起来就像向量简单地被缩放了。请查看维基百科上的这个不错的动态GIF以获取更多详细信息:https://upload.wikimedia.org/wikipedia/commons/0/06/Eigenvectors.gif - rayryeng
@Olologin - 我已经添加了一个具体的可重现示例。请告诉我您的想法! - rayryeng
2
@rayryeng,我已经投票给你了!但我会非常认真地阅读它!!非常感谢! - Shawn
@rayryeng,你能否用奇异值分解的方式写另一种实现PCA的方法,而不是使用矩阵B的协方差? - Shawn
@Shawn - 我认为不必要。我已经给你发送了一个SVD链接,顶部讨论了这个问题:http://stats.stackexchange.com/questions/134282/relationship-between-svd-and-pca-how-to-use-svd-to-perform-pca - 请特别注意第9点。 - rayryeng
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接