Mar*_*ore 5 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));
Run Code Online (Sandbox Code Playgroud)
在测试步骤中,我该怎么办?我应该在测试数据上执行新的princomp
new_pca_coeff=princomp(testing_data);
score = testing_data * new_pca_coeff;
testing_data = score(:,1:min(size(score,2),numDimension));
Run Code Online (Sandbox Code Playgroud)
或者我应该使用我为训练数据计算的pca_coeff?
score = testing_data * pca_coeff;
testing_data = score(:,1:min(size(score,2),numDimension));
Run Code Online (Sandbox Code Playgroud)
分类器正在训练由训练数据的主要组成部分定义的空间中的数据.在不同的空间中评估它是没有意义的 - 因此,您应该像测量数据一样对测试数据应用相同的转换,因此不要计算不同的数据pca_coef.
很明显,如果您的测试数据是独立于与训练数据相同的分布绘制的,那么对于足够大的训练和测试集,主要组件应该大致相同.
选择使用多少主成分的一种方法涉及检查PCA分解的特征值.您可以从princomp函数获取这些:
[pca_coeff score eigenvalues] = princomp(data);
Run Code Online (Sandbox Code Playgroud)
eigenvalues然后该变量将是一个数组,其中每个元素描述相应的主成分所占的方差量.如果你这样做:
plot(eigenvalues);
Run Code Online (Sandbox Code Playgroud)
您应该看到第一个特征值将是最大的,它们将迅速减少(这称为"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);
Run Code Online (Sandbox Code Playgroud)
计算"低维数据描述的方差比例".
但是,由于您使用主要组件进行分类任务,因此您无法确定任何特定数量的PC是否最佳; 特征的方差不一定告诉您有关分类的有用性的任何信息.选择具有Scree图的PC的另一种方法是尝试使用不同数量的主要组件进行分类,并根据经验查看最佳数字.