使用 PCA 时出现数学域错误

2023-12-21

我正在使用 python 的 scikit-learn 包来实现 PCA 。我正在学习数学

domain error :
C:\Users\Akshenndra\Anaconda2\lib\site-packages\sklearn\decomposition\pca.pyc in _assess_dimension_(spectrum, rank, n_samples, n_features)
     78         for j in range(i + 1, len(spectrum)):
     79             pa += log((spectrum[i] - spectrum[j]) *
---> 80                       (1. / spectrum_[j] - 1. / spectrum_[i])) + log(n_samples)
     81 
     82     ll = pu + pl + pv + pp - pa / 2. - rank * log(n_samples) / 2.

ValueError: math domain error

我已经知道当我们取负数的对数时会导致数学域错误,但我不明白对数中怎么会有负数?因为此代码适用于其他数据集。 也许这与 sci-kitlearn 网站上写的内容有关 -“此实现使用奇异值分解的 scipy.linalg 实现。它仅适用于密集数组,不能扩展到大维数据。”(有大量0 值的数量)


我认为你应该加 1,因为numpy log1p 描述页面 https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.log1p.html。 由于当 p = 0 时 log(p+1) = 0 (而 log(e-99) = -99),并且作为链接中的引用

对于实值输入,log1p 对于小到 1 + x == 1 的浮点精度的 x 也是准确的

可以将代码修改如下,以使您尝试解决的问题更加合理:

for i in range(rank):
    for j in range(i + 1, len(spectrum)):
        pa += log((spectrum[i] - spectrum[j]) *
        (1. / spectrum_[j] - 1. / spectrum_[i]) + 1) + log(n_samples + 1)
    ll = pu + pl + pv + pp - pa / 2. - rank * log(n_samples + 1) / 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PCA 时出现数学域错误 的相关文章

随机推荐