KernelPCA生产NaNs

时间:2017-06-23 08:14:33

标签: python machine-learning scikit-learn

KernelPCA应用于我的数据并将其传递给分类器(SVC)后,我收到以下错误:

  

ValueError:输入包含NaN,无穷大或太大的值   D型细胞(' float64&#39)。

执行KernelPCA

和此警告:

  

RuntimeWarning:在sqrt X_transformed =中遇到无效值   self.alphas_ * np.sqrt(self.lambdas _)

查看转换后的数据,我发现了几个nan值。

{I}使用kernel没有区别。我尝试了cosinerbflinear

但有趣的是:

  • 我的原始数据仅包含0到1之间的值(无infnan),它与MinMaxScaler

  • 应用标准PCA 作品,我认为KernelPCAlinear kernel相同。

更多事实:

  • 我的数据是高维度的(> 8000个功能),而且大多数都是稀疏的。
  • 我使用的是最新版本的scikit-learn,18.2

任何想法如何克服这个以及可能是什么原因?

1 个答案:

答案 0 :(得分:2)

产生NaNs是因为输入矩阵的特征值(self.lambdas_)是负的,这会引起 ValueError ,因为平方根不会以负值运行。

可以通过设置KernelPCA(remove_zero_eig=True, ...)来克服此问题,但此类操作不会保留数据的原始维度。使用此参数是最后的手段,因为模型的结果可能会偏斜。

实际上,已经说过负特征值表示模型错误指定,这显然是不好的。在不使用 remove_zero_eig 参数破坏数据维度的情况下规避该事实的可能解决方案可能是减少原始特征的数量,这些特征是相关的。尝试构建相关矩阵并查看这些值是什么。然后,尝试省略冗余功能并再次适合KernelPCA()