最新numpy和scikit learn versons之间的不一致?

最新numpy和scikit learn versons之间的不一致?,numpy,scikit-learn,python-3.7,Numpy,Scikit Learn,Python 3.7,我刚刚将我的numpy和scikit-learn版本升级到最新版本,即numpy-1.16.3和sklearn-0.21.0(适用于Python 3.7)。很多都会崩溃,例如,数字矩阵上的简单PCA将不再有效。例如,考虑这个玩具矩阵: Xt Out[3561]: matrix([[-0.98200559, 0.80514289, 0.02461868, -1.74564111], [ 2.3069239 , 1.79912014, 1.47062378, 2.5240

我刚刚将我的numpy和scikit-learn版本升级到最新版本,即numpy-1.16.3和sklearn-0.21.0(适用于Python 3.7)。很多都会崩溃,例如,数字矩阵上的简单PCA将不再有效。例如,考虑这个玩具矩阵:

Xt
Out[3561]: 
matrix([[-0.98200559,  0.80514289,  0.02461868, -1.74564111],
        [ 2.3069239 ,  1.79912014,  1.47062378,  2.52407335],
        [-0.70465054, -1.95163302, -0.67250316, -0.56615338],
        [-0.75764211, -1.03073475,  0.98067997, -2.24648769],
        [-0.2751523 , -0.46869694,  1.7917171 , -3.31407694],
        [-1.52269241,  0.05986123, -1.40287416,  2.57148354],
        [ 1.38349325, -1.30947483,  0.90442436,  2.52055143],
        [-0.4717785 , -1.46032344, -1.50331841,  3.58598692],
        [-0.03124986, -3.52378987,  1.22626145,  1.50521572],
        [-1.01453403, -3.3211243 , -0.00752532,  0.56538522]])
然后对其运行PCA:

import sklearn.decomposition as skd
est2 = skd.PCA(n_components=4)
est2.fit(Xt)
这失败了:

Traceback (most recent call last):

  File "<ipython-input-3563-1c97b7d5474f>", line 2, in <module>
    est2.fit(Xt)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 341, in fit
    self._fit(X)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 407, in _fit
    return self._fit_full(X, n_components)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 446, in _fit_full
    total_var = explained_variance_.sum()

  File "/home/sven/anaconda3/lib/python3.7/site-packages/numpy/core/_methods.py", line 36, in _sum
    return umr_sum(a, axis, dtype, out, keepdims, initial)

TypeError: float() argument must be a string or a number, not '_NoValueType'
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
est2.fit(Xt)
文件“/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py”,第341行,适合
自适配(X)
文件“/home/sven/anaconda3/lib/python3.7/site packages/sklearn/decomposition/pca.py”,第407行
返回自装配(X、n组件)
文件“/home/sven/anaconda3/lib/python3.7/site packages/sklearn/decomposition/pca.py”,第446行,完整
总风险=解释的方差总和()
文件“/home/sven/anaconda3/lib/python3.7/site packages/numpy/core/_methods.py”,第36行,总计
返回umr_和(a、轴、数据类型、输出、保留、初始)
TypeError:float()参数必须是字符串或数字,而不是“\u NoValueType”
我的印象是,numpy已经在一个非常基本的级别上进行了重构,包括单列矩阵引用,使得诸如np.sum、np.sqrt等函数的行为与旧版本不同


有人知道numpy的发展方向是什么吗?在这一点上,您的代码将在
Xt
上运行
scipy.linalg.svd
,并查看奇异值
S

    self.mean_ = np.mean(X, axis=0)
    X -= self.mean_

    U, S, V = linalg.svd(X, full_matrices=False)
    # flip eigenvectors' sign to enforce deterministic output
    U, V = svd_flip(U, V)

    components_ = V

    # Get variance explained by singular values
    explained_variance_ = (S ** 2) / (n_samples - 1)
    total_var = explained_variance_.sum()
就我的工作而言:

In [175]: est2.explained_variance_                                              
Out[175]: array([6.12529695, 3.20400543, 1.86208619, 0.11453425])
In [176]: est2.explained_variance_.sum()                                        
Out[176]: 11.305922832602981
np.sum
解释说,从v1.15开始,它需要一个
初始
参数(参考
ufunc.reduce
)。默认值为
initial=np.\u NoValue

In [178]: np._NoValue                                                           
Out[178]: <no value>
In [179]: type(np._NoValue)                                                     
Out[179]: numpy._globals._NoValueType

我想知道您的
scipy.linalg.svd
是否返回了一个
S
数组,该数组是“旧的”
ndarray
,并且没有完全实现此
初始
参数。我无法解释为什么会发生这种情况,但无法解释为什么数组
sum
np存在问题。\u NoValue

应该是est2。上面的fit(Xt)我看到
Xt
numpy.matrix
矩阵
类的行为与常规numpy数组对象不同。您是否尝试过使用常规的numpy数组而不是
numpy.matrix
?使用与您相同的版本(除了Py3.6),您的代码运行得很好。我不知道对
numpy
的任何重大更改会带来问题,尽管我不知道
PCA
在做什么。@WarrenWeckesser,使用
np.matrix
不是问题所在。这段代码为我运行。
\u NoValueType
错误表明,
np.sum
的相对(np 1.15)新的
initial
参数可能存在问题,可能是在不兼容的
scipy
版本中。值得一提的是:我刚刚用Python 3.7、numpy 1.16.3、scipy 1.2.1和scikit learn 0.21.0尝试了您的代码,效果不错。这是在64 Linux平台上。感谢您指向
scipy
版本。我有1.1.0。重新安装
scipy
numpy
numpy-base
修复了该问题。
In [180]: import scipy                                                          
In [181]: scipy.__version__                                                     
Out[181]: '1.2.1'