Несоответствия между последней версией numy и scikit-learn? - PullRequest
1 голос
/ 13 мая 2019

Я только что обновил свои версии 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'

У меня сложилось впечатление, что numy имеетбыла реструктурирована на очень фундаментальном уровне, включая ссылки на матрицы из одного столбца, так что такие функции, как np.sum, np.sqrt и т. д., не ведут себя так, как в предыдущих версиях.

Кто-нибудь знает, каков путь вперед с numpy и что именно здесь происходит?

1 Ответ

1 голос
/ 13 мая 2019

В этот момент ваш код fit выполняется как scipy.linalg.svd на вашем Xt и просматривает единственные значения 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 объясняет, что, начиная с версии 1.15, он принимает параметр initial (ссылка ufunc.reduce). И по умолчанию initial=np._NoValue

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

Так что это частично объясняет ссылку _NoValueType в ошибке.

Какая у вас scipy версия?

In [180]: import scipy                                                          
In [181]: scipy.__version__                                                     
Out[181]: '1.2.1'

Интересно, возвращает ли ваш scipy.linalg.svd массив S, который является "старым" ndarray и не полностью реализует этот параметр initial. Я не могу объяснить, почему это могло произойти, но иначе не могу объяснить, почему у массива sum возникают проблемы с np._NoValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...