将pca应用于测试数据

时间:2017-06-01 17:55:02

标签: python math matrix pca

我正在尝试使用sklearn执行PCA的python实现。我创建了以下函数:

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

但是,当我尝试运行整个脚本时,我收到以下消息:

  

文件" \ Anaconda2 \ lib \ site-packages \ sklearn \ decomposition \ base.py",第132行,在转换中       X = X - self.mean _

问题是什么?如何将pca应用于测试数据?

这里是mod1的pca调试示例:

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不匹配)。如果我在训练过程中删除了transpose(),pca正常工作没有错误,test_dataset_mod1和test_dataset_mod2的大小正确为360x500,但是,train_dataset_mod1和train_dataset_mod2的大小错误为5000x500 ???

1 个答案:

答案 0 :(得分: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())