【问题标题】:sklearn PCA with n_components = 'mle' and svd_solver = 'full' results in math domain errorsklearn PCA 与 n_components = 'mle' 和 svd_solver = 'full' 导致数学域错误
【发布时间】:2017-11-29 08:28:21
【问题描述】:

我的问题与math domain error while using PCA高度相关

我收到以下错误:

  File "$path$\Python\Python36\lib\site-packages\sklearn\decomposition\pca.py", line 88, in _assess_dimension_(1. / spectrum_[j] - 1. / spectrum_[i])) + log(n_samples)
ValueError: math domain error

指的是this line of code

pa += log((spectrum[i] - spectrum[j]) * (1. / spectrum_[j] - 1. / spectrum_[i])) + log(n_samples)

仔细看后发现问题是由这部分方程引起的:

(spectrum[i] - spectrum[j])

如果这些值相等,则结果为 0。这会导致乘以 0,从而产生 log(0) 导致此异常的原因。

现在我的问题。发生此错误的事实是否表明我的数据有问题,或者实施是否应该处理这种情况? 如果实现应该处理这个问题,你会推荐什么方式来正确处理这个问题? 在链接的问题中已经有 an answer 对此,但它看起来不是很有信心是正确的并且没有任何反馈。

在 scikit-learn 的 github 存储库上创建了一个 issue,其中包含重现错误的步骤。

【问题讨论】:

  • 您应该在 scikit-learn github 问题页面上发布此内容。它在 PCA 文档中提到,当 n_components == ‘mle’ 时,Minka’s MLE 用于猜测维度。所以也许这有实施问题。
  • 我知道Minka的MLE就是用这个配置的。我想知道这个算法是否存在实现问题,或者我的数据是否不适合这个算法。我也在 github 上打开了一个 issue 并参考了它。

标签: python scikit-learn pca mle


【解决方案1】:

这是由于 sklearn 内部存在一个未解决的问题。 已确认here

【讨论】:

  • 可以确认这个问题仍然存在 (29-9-2019) 在高维数据中是 (1024 列)。有没有人找到修补程序/解决方法?
  • 在此日期最新版本中仍然存在
  • 我今天遇到了同样的问题
【解决方案2】:

scikit-learn 0.23.0 中引入了对此问题的修复,因此只需更新到此版本即可。

Release Notes for scikit-learn 0.23

[MRG+1] Adress decomposition.PCA mle option problem #16224

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2020-10-11
    • 2016-08-08
    • 2018-12-20
    • 2018-12-05
    相关资源
    最近更新 更多