使用PCA时出现数学域错误

我正在使用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加为the numpy log1p description page.
由于当p = 0时log(p 1)= 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
上一篇:数据压缩·课前任务二(PCA)


下一篇:NMF人脸数据特征提取