2017-06-01 39 views
2

我正在尝试使用sklearn执行PCA的python实现。我创建了以下功能:将pca应用于测试数据

def dimensionality_reduction(train_dataset_mod1, train_dataset_mod2, test_dataset_mod1, test_dataset_mod2): 

    pca = PCA(n_components= 200) 
    pca.fit(train_dataset_mod1.transpose()) 
    mod1_features_train = pca.components_ 
    pca2 = PCA(n_components=200) 
    pca2.fit(train_dataset_mod2.transpose()) 
    mod2_features_train = pca2.components_ 
    mod1_features_test = pca.transform(test_dataset_mod1) 
    mod2_features_test = pca2.transform(test_dataset_mod2) 

    return mod1_features_train.transpose(), mod2_features_train.transpose(), mod1_features_test, mod2_features_test 

我矩阵的大小如下:

train_dataset_mod1 733x5000
test_dataset_mod1 360x5000
mod1_features_train 200x733
train_dataset_mod2 733x8000
test_dataset_mod2 360x8000
mod2_features_train 200x733

然而,当我试图运行我收到以下消息整个脚本:

File "\Anaconda2\lib\site-packages\sklearn\decomposition\base.py", line 132, in transform X = X - self.mean_

问题是什么?我怎样才能将pca应用于测试数据?

这里PCA为MOD1的调试的示例:

enter image description here

的转化的数据集mod1_features_train和mod1_features_train具有正确的尺寸既500x733。但是我不能这样做test_dataset_mod1和test_dataset_mod2,为什么?

编辑:期间,我注意到,PCA的base.py文件,还有一个操作X = X调试 - self.mean其中X是我的测试数据和self_mean从拟合计算了火车的平均设置(slf_mean的大小是733,与X不匹配)。如果我在训练过程中移除了转置(),那么pca正常工作正常,没有错误,但test_dataset_mod1和test_dataset_mod2的大小正确为360x500,但train_dataset_mod1和train_dataset_mod2的大小错误为5000x500?

回答

1

你不应该转你的矩阵在拟合函数,或者如果你有,你有你的转矩阵变换功能:

pca.fit(train_dataset_mod1) 
    pca2.fit(train_dataset_mod2) 
    mod1_features_test = pca.transform(test_dataset_mod1) 
    mod2_features_test = pca2.transform(test_dataset_mod2) 

或:

pca.fit(train_dataset_mod1.transpose()) 
    pca2.fit(train_dataset_mod2.transpose()) 
    mod1_features_test = pca.transform(test_dataset_mod1.transpose()) 
    mod2_features_test = pca2.transform(test_dataset_mod2.transpose()) 
+0

用尽全力在这两种情况下我都收到了错误。如果我不会将转置置于列车数据中,那么pca不会在这些功能中执行,但它会在没有用处的样本中执行。对于第二种解决方案,当我尝试使用转置或不转换测试数据时,我正在接收相同的消息。值错误:操作数无法与形状一起广播(5000,360)(733,) – konstantin

+0

第一种方法正在工作,但结果,降维发生在样本中,而不是发生在矩阵的特征中。 – konstantin

+1

@konstantin如果我理解你的问题是正确的,当我们使用.fit它只是找到没有变换数据的变换矩阵,你可以先使用.transform或.fit_transform来变换你的数据,祝你好运bro –