我有一个大的数据集的多维数据(132分的尺寸)的。
我在执行数据挖掘初学者,我想利用Matlab运用主成分分析。 但是,我看到有很多的功能,在网页上解释,但我不明白他们应该如何适用。
基本上,我想申请PCA并获得特征向量及其相应的特征值从我的数据。
这一步后,我希望能够做的基础上选择所获得的特征向量的我的数据重建。
我可以手动做到这一点,但如果有任何预定义的功能,这可以做到这一点,因为他们应该已经被优化我想知道。
我的初始数据是这样的: size(x) = [33800 132]
所以基本上我有132
的功能(尺寸)和33800
个数据点。 我想在这个数据集执行PCA。
任何帮助或暗示会怎么做。
这里有一个快速演练。 首先,我们创建的隐变量(或“因素”)的矩阵。 它有100个观测,并有两个独立因素。
>> factors = randn(100, 2);
现在创建一个载荷矩阵。 这将隐藏变量映射到您的观察变量。 说你的观察变量有四个特点。 然后你载荷矩阵必须是4 x 2
>> loadings = [
1 0
0 1
1 1
1 -1 ];
这告诉你,第一个因素第一个观测到可变负载,在第二个因素第二负载上的因素下述因素的差异第四可变负载之和与第三可变负载。
现在创建您的意见:
>> observations = factors * loadings' + 0.1 * randn(100,4);
我添加随机噪声的少量以模拟实验误差。 现在,我们执行使用的PCA pca
从统计工具箱功能:
>> [coeff, score, latent, tsquared, explained, mu] = pca(observations);
变量score
是主成分得分的阵列。 这将是由建筑,它可以检查正交 -
>> 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'
将重现你的观测中心的版本。 平均mu
被之前执行PCA减去。 要重现原来的意见,你需要重新添加它,
>> reconstructed = score * coeff' + repmat(mu, 100, 1);
>> sum((observations - reconstructed).^2)
ans =
1.0e-27 *
0.0311 0.0104 0.0440 0.3378
为了得到一个近似的原始数据,你就可以开始从计算的主成分删除列。 为了得到一个想法,其中列下降,我们考察explained
变量
>> explained
explained =
58.0639
41.6302
0.1693
0.1366
这些条目告诉你的方差的百分比是通过各主成分的解释。 我们可以清楚地看到,前两个部分是超过显著第二两(他们解释他们之间的差异超过99%)。 使用所述第一两个分量来重构观察给人的秩-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
此时的重构也不是那么好。 这是因为我们特意构建我们的数据有两个因素,而我们只从其中的一个重建它。
需要注意的是,尽管方式之间的相似性暗示我们构建的原始数据和其繁殖,
>> observations = factors * loadings' + 0.1 * randn(100,4);
>> reconstructed = score * coeff' + repmat(mu, 100, 1);
未必存在任何对应之间factors
和score
,或之间loadings
和coeff
。 PCA的算法不知道你的数据的构造方式什么 - 它只是试图解释尽可能多的总方差的,因为它可以与每个连续的组成部分。
用户@Mari要求在评论她怎么会绘制重建误差为主要成分的数量的函数。 使用变量explained
上面这是很容易的。 我会生成一个更有趣的因素结构来说明影响一些数据 -
>> 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')
你必须要在一个相当不错的降维工具箱http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.html此外PCA,该工具箱具有降维很多其他的算法。
做PCA的例子:
Reduced = compute_mapping(Features, 'PCA', NumberOfDimension);