使用PCA时出现数学域错误

2024-05-04 10:11:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用scipca的软件包来实现

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网站上写的内容有关-“此实现使用西皮·利纳格奇异值分解的实现。它只适用于密集数组,不能扩展到大维数据。”(有大量的0值)


Tags: 数据inlogdomain对数errorusersspectrum
2条回答

我想你应该加1,作为the numpy log1p description page。 因为log(p+1)=0时p=0(而log(e-99)=-99),并且作为链接中的引号

For real-valued input, log1p is accurate also for x so small that 1 + x == 1 in floating-point accuracy

可以按如下方式修改代码,使您试图解决的问题更加合理:

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

我不知道我是对还是错,但我确实找到了解决问题的办法。在

我只是打印了一些错误信息(spectrum_[I]和spectrum_j]的值),我发现:

有时候,他们是一样的!!!在

(也许他们不一样,但他们太接近了,我猜)

所以,这里

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

计算日志(0)时将报告错误。在

我的解决方法是把一个很小的数字1e-99加到0上,这样它就变成log(0+1e-99)

这样您就可以将其更改为:

^{pr2}$

相关问题 更多 >