2015-07-26 5 views
-1

Я пытаюсь использовать lda 1.0.2 package for python.LDA библиотека python не принимает разреженную матрицу в качестве ввода

The documentation говорит, что разреженная матрица приемлема, но когда я передаю разреженную матрицу функции transform(). Он бросает ошибку

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

transform() функция отлично работает с нормальной матрицей.

С кем-нибудь сталкивались с подобной проблемой?

любая помощь будет замечательной! Спасибо заранее

+1

Можете ли вы подробнее рассказать подробнее? Полная ошибка стека ошибки может быть полезна, как и код рядом с точкой, где происходит исключение. –

+1

Эй, добро пожаловать в переполнение стека. Чтобы помочь сообществу предоставить наилучший ответ, предоставьте полный текст ошибки, которую вы получаете, и, пожалуйста, предоставьте краткую информацию, которая может воспроизвести ошибку. Взгляните на [этот раздел справочного центра] (http://stackoverflow.com/help/how-to-ask) для получения дополнительной информации о том, как максимально использовать свой вопрос. – Engineero

ответ

0

У меня только такая же ошибка. Для воспроизведения:

from scipy.sparse import csr_matrix 
import lda 

X = csr_matrix([[1,0],[0,1]]) 
lda_test = lda.LDA(n_topics=2, n_iter=10) 
lda_test.fit(X) 
X_trans = lda_test.transform(X) 

Которая производит ошибку:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-192-a1a0875bac02> in <module>() 
     5 lda_test = lda.LDA(n_topics=2, n_iter=10) 
     6 lda_test.fit(X) 
----> 7 X_trans = lda_test.transform(X) 

C:\Users\lidw6lw\PortablePython\App\lib\site-packages\lda\lda.pyc in transform(self, X, max_iter, tol) 
    173   n_topics = len(self.components_) 
    174   doc_topic = np.empty((len(X), n_topics)) 
--> 175   WS, DS = lda.utils.matrix_to_lists(X) 
    176   # TODO: this loop is parallelizable 
    177   for d in range(len(X)): 

C:\Users\lidw6lw\PortablePython\App\lib\site-packages\lda\utils.pyc in matrix_to_lists(doc_word) 
    44  if np.count_nonzero(doc_word.sum(axis=1)) != doc_word.shape[0]: 
    45   logger.warning("all zero row in document-term matrix found") 
---> 46  if np.count_nonzero(doc_word.sum(axis=0)) != doc_word.shape[1]: 
    47   logger.warning("all zero column in document-term matrix found") 
    48  sparse = True 

C:\Users\lidw6lw\PortablePython\App\lib\site-packages\numpy\core\_methods.pyc in _sum(a, axis, dtype, out, keepdims) 
    23 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): 
    24  return um.add.reduce(a, axis=axis, dtype=dtype, 
---> 25        out=out, keepdims=keepdims) 
    26 
    27 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): 

C:\Users\lidw6lw\PortablePython\App\lib\site-packages\scipy\sparse\base.pyc in __bool__(self) 
    181    return True if self.nnz == 1 else False 
    182   else: 
--> 183    raise ValueError("The truth value of an array with more than one " 
    184        "element is ambiguous. Use a.any() or a.all().") 
    185  __nonzero__ = __bool__ 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

Похоже, это связано с lda.utils.matrix_to_lists

Оба ниже работы просто отлично:

X_trans = lda_test.fit(X.toarray()) 
X_trans2 = lda_test.fit_transform(X) 

EDIT: Это фактически, что функция преобразования, которая не учитывает разреженные матрицы правильно. копия пакета, а в коде для transform просто замените len(X) на X.shape(0) и закомментируйте строку np.atleast_2d(X). Таким образом, раздел, расположенный прямо под докстером в transform, выглядит следующим образом:

# X = np.atleast_2d(X) 
phi = self.components_ 
alpha = self.alpha 
# for debugging, let's not worry about the documents 
n_topics = len(self.components_) 
doc_topic = np.empty((X.shape[0], n_topics)) 
WS, DS = lda.utils.matrix_to_lists(X) 
# TODO: this loop is parallelizable 
for d in range(X.shape[0]): 
+0

Ошибка генерируется преобразованием, но не подходит или fit_transform. В реальном обучении и тестировании неприемлемо соответствовать вашему тестовому набору в модели. –

+0

Исправлено в новых версиях, поэтому нет необходимости изменять: https://github.com/ariddell/lda/commit/d44e73ccce8aa6b175811fa5e176ca82a07ab8e7#diff-14db5320aced81aaa087dee133ddf68f –