我需要编写一个用于人类动作识别的分类器(高斯混合模型)。我有四个视频数据集。我选择了其中的三个作为训练集,一个作为测试集。在将高斯混合模型应用于训练集之前,我先对其进行了主成分分析(PCA)。
pca_coeff=princomp(trainig_data);score = training_data * pca_coeff;training_data = score(:,1:min(size(score,2),numDimension));
在测试步骤中我应该怎么做?我应该对测试数据执行新的主成分分析吗?
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));
回答:
分类器是在由训练数据的主成分定义的空间中进行训练的。在不同的空间中评估它是没有意义的——因此,你应该对测试数据应用与训练数据相同的变换,所以不要计算不同的pca_coef
。
顺便说一下,如果你的测试数据是从与训练数据相同的分布中独立抽取的,那么对于足够大的训练和测试集,主成分应该大致相同。
选择使用多少个主成分的一种方法是检查PCA分解的特征值。你可以从princomp
函数中获取这些特征值,如下所示:
[pca_coeff score eigenvalues] = princomp(data);
eigenvalues
变量将是一个数组,其中每个元素描述了相应主成分所解释的方差量。如果你执行:
plot(eigenvalues);
你应该会看到第一个特征值最大,并且它们会迅速减少(这被称为“碎石图”,应该看起来像这样:http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif,虽然你的图可能有高达800个点而不是12个)。
对应特征值较小的主成分不太可能有用,因为在这些维度上的数据方差非常小。许多人选择一个阈值,然后选择所有特征值高于该阈值的主成分。选择阈值的一个非正式方法是查看碎石图,并选择阈值为线“变平”之后的点——在之前我链接的图像中,一个好的值可能是~0.8,选择3或4个主成分。
如果我没记错,你可以这样做:
proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues);
来计算“低维数据所描述的方差比例”。
然而,由于你使用主成分进行分类任务,你无法确定任何特定数量的主成分是最优的;一个特征的方差并不一定能告诉你它对分类有多有用。选择主成分的另一种方法是使用碎石图之外的方法,即尝试用不同数量的主成分进行分类,并通过经验确定最佳数量。