Matlab – 多维数据的PCA分析与重构

我有一个很大的多维数据集(132维)。

我是一名初学者,执行数据挖掘,我想通过使用Matlab来应用主成分分析。 不过,我看到网上有很多function解释,但我不明白应该如何应用。

基本上,我想应用PCA并从我的数据中获得特征向量及其相应的特征值。

在这一步之后,我希望能够根据所获得的特征向量的select对我的数据进行重构。

我可以手动做到这一点,但我想知道是否有任何预定义的function可以做到这一点,因为他们应该已经被优化。

我的初始数据是这样的: size(x) = [33800 132] 。 所以基本上我有132function(尺寸)和33800数据点。 我想在这个数据集上执行PCA。

任何帮助或暗示都可以。

这是一个快速的演练。 首先,我们创build一个隐藏variables(或“因素”)的matrix。 它有100个观测值,有两个独立的因素。

 >> factors = randn(100, 2); 

现在创build一个加载matrix。 这将把隐藏的variables映射到你观察到的variables上。 说你观察到的variables有四个特征。 那么你的加载matrix需要是4 x 2

 >> loadings = [ 1 0 0 1 1 1 1 -1 ]; 

这就告诉你,第一个观察到的variables载荷是第一个因素,第二个载荷是第二个载荷,第三个载荷是因素总和,第四个载荷是因素差异。

现在创build你的观察:

 >> observations = factors * loadings' + 0.1 * randn(100,4); 

我添加了less量的随机噪声来模拟实验误差。 现在我们使用stats工具箱中的pca函数来执行PCA:

 >> [coeff, score, latent, tsquared, explained, mu] = pca(observations); 

可变score是主成分分数的数组。 这些将通过build设正交,你可以检查 –

 >> corr(score) ans = 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 

综合score * coeff'将重现您观察的中心版本。 在执行PCA之前减去平均值mu 。 要重现您的原始观察结果,您需要重新添加它,

 >> reconstructed = score * coeff' + repmat(mu, 100, 1); >> sum((observations - reconstructed).^2) ans = 1.0e-27 * 0.0311 0.0104 0.0440 0.3378 

为了近似于原始数据,您可以开始从计算的主成分中删除列。 为了了解哪些列要放下,我们检查explainedvariables

 >> explained explained = 58.0639 41.6302 0.1693 0.1366 

这些条目告诉你,每个主要组成部分解释了方差的百分比。 我们可以清楚地看到前两个部分比第二个部分更重要(他们解释了它们之间超过99%的差异)。 使用前两个分量来重build观测给出了秩-2近似,

 >> approximationRank2 = score(:,1:2) * coeff(:,1:2)' + repmat(mu, 100, 1); 

我们现在可以尝试绘制:

 >> for k = 1:4 subplot(2, 2, k); hold on; grid on plot(approximationRank2(:, k), observations(:, k), 'x'); plot([-4 4], [-4 4]); xlim([-4 4]); ylim([-4 4]); title(sprintf('Variable %d', k)); end 

在这里输入图像描述

我们得到了原始观察的几乎完美的再现。 如果我们想要一个更粗略的近似值,我们可以使用第一个主成分:

 >> approximationRank1 = score(:,1) * coeff(:,1)' + repmat(mu, 100, 1); 

并绘制它,

 >> for k = 1:4 subplot(2, 2, k); hold on; grid on plot(approximationRank1(:, k), observations(:, k), 'x'); plot([-4 4], [-4 4]); xlim([-4 4]); ylim([-4 4]); title(sprintf('Variable %d', k)); end 

在这里输入图像描述

这次重build不太好。 那是因为我们故意将数据构build成有两个因素,而我们只是从其中的一个重构它。

请注意,尽pipe我们构build原始数据的方式与其复制方式之间存在明显的相似性,

 >> observations = factors * loadings' + 0.1 * randn(100,4); >> reconstructed = score * coeff' + repmat(mu, 100, 1); 

factorsscore之间或者loadingscoeff之间不一定对应。 PCAalgorithm并不知道数据的构造方式 – 它只是试图解释每个连续分量尽可能多的总方差。


User @Mari在评论中询问如何将重构误差作为主要组件数量的函数来绘制。 使用上面explained这个variables是很容易的。 我会用一个更有趣的因子结构来生成一些数据来说明效果 –

 >> factors = randn(100, 20); >> loadings = chol(corr(factors * triu(ones(20))))'; >> observations = factors * loadings' + 0.1 * randn(100, 20); 

现在,所有的观测资料都载入了一个重要的共同因素,其他因素的重要性也在下降。 我们可以像以前一样得到PCA分解

 >> [coeff, score, latent, tsquared, explained, mu] = pca(observations); 

并绘制解释方差的百分比如下,

 >> cumexplained = cumsum(explained); cumunexplained = 100 - cumexplained; plot(1:20, cumunexplained, 'x-'); grid on; xlabel('Number of factors'); ylabel('Unexplained variance') 

在这里输入图像描述