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