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


  ValueError:输入包含NaN,无穷大或值对于
  dtype('float64')。


并在执行KernelPCA时发出此警告:


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


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

我使用的kernel没什么区别。我尝试了cosinerbflinear

但是有趣的是:


我的原始数据仅包含0到1之间的值(没有infnan),它使用MinMaxScaler进行缩放
应用标准的PCA有效,我认为与KernelPCAlinear相同。


一些事实:


我的数据是高维的(> 8000个特征),并且大部分都是稀疏的。
我正在使用scikit-learn的最新版本18.2


任何想法如何克服这一点,可能是什么原因?

最佳答案

产生NaNs的原因是,输入矩阵的特征值(self.lambdas_)为负,这会引发ValueError,因为平方根不适用于负值。

可以通过设置KernelPCA(remove_zero_eig=True, ...)来解决该问题,但是这种操作不会保留数据的原始维数。由于该模型的结果可能会偏斜,因此使用此参数是最后的选择。

实际上,已经指出负特征值表示模型规格不正确,这显然是不好的。在不使用remove_zero_eig参数来避免破坏数据维数的情况下避免该事实的可能解决方案可能是减少原始特征的数量,而这些原始特征的相关性很高。尝试建立相关矩阵,看看这些值是多少。然后,尝试省略多余的功能并再次适合KernelPCA()

09-17 01:52