如何使用scikit-learn将选定的特征脸投影到测试数据?
解决方案
方法1:手动投影(与Matlab逻辑完全对齐)
Scikit-learn的PCA拟合后,components_存储主成分(形状为(n_components, n_features)),mean_为训练数据的均值。要完成特定主成分的投影,步骤如下:
- 对数据做中心化处理(减去训练集均值),这是PCA默认的前置操作;
- 将中心化后的数据与选定主成分的转置相乘,得到投影结果。
代码示例:
from sklearn.decomposition import PCA import numpy as np # 假设X_train为训练数据,形状(样本数, 特征数) pca = PCA().fit(X_train) selected_indices = [1, 3, 5] selected_components = pca.components_[selected_indices, :] # 训练数据投影 X_train_centered = X_train - pca.mean_ X_train_projected = X_train_centered @ selected_components.T # 测试数据投影(必须使用训练集的均值做中心化) X_test_centered = X_test - pca.mean_ X_test_projected = X_test_centered @ selected_components.T
方法2:自定义PCA对象(复用Scikit-learn接口)
如果想沿用Scikit-learn的transform标准接口,可以手动构建仅保留特定主成分的PCA对象,核心是复制原PCA的关键参数并筛选:
from sklearn.decomposition import PCA pca_full = PCA().fit(X_train) selected_indices = [1, 3, 5] # 创建仅包含选定主成分的PCA对象 pca_selected = PCA(n_components=len(selected_indices)) pca_selected.mean_ = pca_full.mean_ pca_selected.components_ = pca_full.components_[selected_indices, :] pca_selected.explained_variance_ = pca_full.explained_variance_[selected_indices] pca_selected.explained_variance_ratio_ = pca_full.explained_variance_ratio_[selected_indices] # 使用标准transform方法完成投影 X_train_projected = pca_selected.transform(X_train) X_test_projected = pca_selected.transform(X_test)
这种方式适合将投影步骤整合到Scikit-learn的Pipeline工作流中。
关于fit_transform()的说明
fit_transform()只是fit()与transform()的组合操作,默认会用所有主成分完成投影,无法指定特定主成分,因此不能满足你的需求。
内容的提问来源于stack exchange,提问作者John David
相关产品推荐
相关产品推荐

