主成分分析

时间:2012-05-30 14:49:06

标签: matlab pca princomp

我必须编写一个用于人类行为识别的分类器(高斯混合模型)。 我有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 个答案:

答案 0 :(得分:7)

分类器正在训练由训练数据的主要组成部分定义的空间中的数据。在不同的空间中评估它是没有意义的 - 因此,您应该像对训练数据一样对测试数据应用相同的转换,因此不要计算不同的pca_coef

很明显,如果您的测试数据是独立于与训练数据相同的分布绘制的,那么对于足够大的训练和测试集,主要组件应该大致相同。

选择使用多少主成分的一种方法涉及检查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个主要组件

IIRC,你可以这样做:

proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues);

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

但是,由于您使用主要组件进行分类任务,因此您无法确定任何特定数量的PC是否最佳;特征的方差不一定告诉您有关分类的有用性的任何信息。选择具有Scree图的PC的另一种方法是尝试使用不同数量的主成分进行分类,并根据经验查看最佳数字。