主成分分析

5

我需要编写一个分类器(高斯混合模型),用于人体动作识别。

我有4个视频数据集。我选择其中3个作为训练集,1个作为测试集。

在将gm模型应用于训练集之前,我会在其上运行PCA。

pca_coeff=princomp(trainig_data);
score = training_data * pca_coeff;
training_data = score(:,1:min(size(score,2),numDimension));

在测试阶段,我应该做什么?是否应该在测试数据上执行新的princomp操作?

new_pca_coeff=princomp(testing_data);
score = testing_data * new_pca_coeff;
testing_data = score(:,1:min(size(score,2),numDimension));

我应该使用我为训练数据计算的pca_coeff吗?
score = testing_data * pca_coeff;
testing_data = score(:,1:min(size(score,2),numDimension));
1个回答

8
分类器正在以训练数据的主成分所定义的空间中进行训练。在不同的空间中评估它是没有意义的 - 因此,您应该对测试数据应用与训练数据相同的变换,因此不要计算不同的。

顺便提一下,如果您的测试数据是独立于训练数据从相同分布中抽取的,则对于足够大的训练和测试集,主成分应该大致相同。
选择使用多少个主成分的一种方法涉及检查PCA分解的特征值。您可以通过princomp函数获取这些值,如下所示:
[pca_coeff score eigenvalues] = princomp(data);
eigenvalues变量将成为一个数组,其中每个元素描述对应的主成分解释的方差量。如果您执行以下操作:
plot(eigenvalues);

你应该能看到第一个特征值最大,而它们会迅速减少(这被称为“Scree Plot”,应该是这样的:http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif,尽管你的可能有800个点而不是12个)。
有小特征值的主成分不太可能有用,因为在这些维度上数据的方差非常小。许多人选择一个阈值,然后选择所有特征值在该阈值以上的主成分。一种非正式的选取阈值的方法是查看Scree图并选择阈值刚好在某条线“水平化”之后 - 在我之前提供的图像中,一个好的值可能是~0.8,选择3或4个主成分。
如果我没记错的话,你可以做类似这样的事情:
proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues);

计算“低维数据描述的方差比例”。

然而,由于你正在使用主成分进行分类任务,你并不能确定特定数量的PC是最优的;一个特征的方差并不一定告诉你它在分类中有多有用。选择Scree图中的PCs的替代方法就是尝试使用各种数量的主成分进行分类,看看哪个数字是经验上最好的。


谢谢Richante,你的回答很清晰、有用。我还有一个疑问。我需要使用多少个组件?对于每个观测值,我计算了800个特征,这些是原始数据的维度。numDimension的最佳选择是什么?是否有公式可以使用,或者应该通过实验结果来选择? - Mario Lepore
我已经在我的原始答案中添加了一些信息,以描述如何选择主成分的数量。简短的回答是:实际上没有一个好的公式,通过实验选择可能是可以的。 - Richante
关于你的最后一行代码 proportion_of_variance = ...,Matlab文档将其计算如下:proportion_of_variance = cumsum(eigenvalues)./sum(eigenvalues),这样可以避免使用那个 k 变量,而是得到一个向量,可以使用 find 函数找到达到阈值的位置。 - Unapiedra

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