【发布时间】:2019-05-12 23:24:19
【问题描述】:
我刚刚将我的 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'
我的印象是 numpy 已经在一个非常基础的层面进行了重组,包括单列矩阵引用,这样 np.sum、np.sqrt 等函数的行为就不像旧版本中那样。
有谁知道 numpy 的前进道路是什么以及这里到底发生了什么?
【问题讨论】:
-
上面应该是est2.fit(Xt)
-
我看到
Xt是numpy.matrix。matrix类的行为与常规的 numpy 数组对象不同。您是否尝试过使用常规 numpy 数组而不是numpy.matrix来运行示例? -
使用与您相同的版本(Py3.6 除外),您的代码运行良好。我不知道
numpy的任何重大更改会带来问题,尽管我不太了解PCA正在做什么。 -
@WarrenWeckesser,使用
np.matrix不是问题。这段代码为我运行。_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 平台上。
标签: numpy scikit-learn python-3.7