背景:
我想用Python进行人脸识别。早些时候,在 Matlab 中,我大致使用以下代码实现了人脸识别:
[EigVec, projec, eigenVal] = myPCA(TrainingDataFaces);
prinComps = [1, 3, 5];
dimensionReduced = TrainingData'*EigVec(:,prinComps);%project it onto the face space to reduce dimension
model = NaiveBayes.fit(dimensionReduced, classesData);
ProjectedTestData = TestData' * EigVec(:,prinComps);%project it onto the face space to reduce dimension
r = model.predict(ProjectedTestData(1,:));
如您所见,我有
EigVec
可用,这为我提供了关于可以选择多少个主成分的足够信息。我需要选择特定的主成分,我选择[1,3,5]
。尝试使用 Skikit-learn:
在尝试使用 Skikit-learn 做“同样的事情”时,我发现虽然它提供了 pca = PCA(n_components=n_components).fit(X_train)
,但这只允许指定第一个
n
主成分。但如果我使用 pca=PCA().fit(X_train)
,然后使用 eigenfaces = self.pca.components_[[1,3,5], :]
,我可以选择特定的主成分。我需要能够选择特定的主成分。
要将特征脸投影到测试数据上,有这个 trainingProjected = pca.transform(trainingData)
。但
pca
包含所有主成分。我只想将 EigenFaces [1,3,5]
投影到训练数据上。我该如何实现这一目标?我唯一的选择是获取原始特征脸数组并将其手动与训练数据相乘吗? Skikit-learn 没有提供任何内置方法吗?我注意到this
pca.fit_transform()
,但docs并没有表明它可以按照我想要的方式使用。
np.dot(trainingData, selectedPrincipalComponents.transpose())
而不是
pca.transform(trainingData)
。