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));
4

1 回答 1

8

分类器正在由训练数据的主要组成部分定义的空间中的数据上进行训练。在不同的空间中评估它是没有意义的 - 因此,您应该对测试数据应用相同的转换,就像对训练数据所做的那样,所以不要计算不同的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 的另一种方法是尝试使用不同数量的主成分进行分类,并根据经验查看最佳数量。

于 2012-05-30T15:50:15.560 回答