Matlab – 多维数据的PCA分析与重构
我有一个很大的多维数据集(132维)。
我是一名初学者,执行数据挖掘,我想通过使用Matlab来应用主成分分析。 不过,我看到网上有很多function解释,但我不明白应该如何应用。
基本上,我想应用PCA并从我的数据中获得特征向量及其相应的特征值。
在这一步之后,我希望能够根据所获得的特征向量的select对我的数据进行重构。
我可以手动做到这一点,但我想知道是否有任何预定义的function可以做到这一点,因为他们应该已经被优化。
我的初始数据是这样的: size(x) = [33800 132]
。 所以基本上我有132
function(尺寸)和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
为了近似于原始数据,您可以开始从计算的主成分中删除列。 为了了解哪些列要放下,我们检查explained
variables
>> 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);
factors
与score
之间或者loadings
与coeff
之间不一定对应。 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')
做PCA的例子:
Reduced = compute_mapping(Features, 'PCA', NumberOfDimension);