2015-12-08 4 views
0

У меня есть следующий код в питонаPython Матрица факторизации

############################################################################### 

""" 
@INPUT: 
    R  : a matrix to be factorized, dimension N x M 
    P  : an initial matrix of dimension N x K 
    Q  : an initial matrix of dimension M x K 
    K  : the number of latent features 
    steps : the maximum number of steps to perform the optimisation 
    alpha : the learning rate 
    beta : the regularization parameter 
@OUTPUT: 
    the final matrices P and Q 
""" 
def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): 
    Q = Q.T 
    for step in xrange(steps): 
     for i in xrange(len(R)): 
      for j in xrange(len(R[i])): 
       if R[i][j] > 0: 
        eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) 
        for k in xrange(K): 
         P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) 
         Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j]) 
     eR = numpy.dot(P,Q) 
     e = 0 
     for i in xrange(len(R)): 
      for j in xrange(len(R[i])): 
       if R[i][j] > 0: 
        e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2) 
        for k in xrange(K): 
         e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) 
     if e < 0.001: 
      break 
    return P, Q.T 

############################################################################### 

Ссылка на этот код выглядит следующим образом: http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/

код работает правильно для маленькой матрицы, но у меня есть две большие матрицы Р (15715 , 203) и Q (203,16384), и когда я пытаюсь выполнить этот код на P и Q это дает мне следующую ошибку

K=203 

matrix_factorization(R, P, Q, K) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-3-00b8211f2507> in <module>() 
----> 1 matrix_factorization(R, P, Q, K) 

/Users/ajinkyachandrakantbobade/Desktop/random_choicefile/trial.py in matrix_factorization(R, P, Q, K, steps, alpha, beta) 
    52    for j in xrange(len(R[i])): 
    53     if R[i][j] > 0: 
---> 54      eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) 
    55      for k in xrange(K): 
    56       P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) 

/Users/ajinkyachandrakantbobade/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/frame.pyc in __getitem__(self, key) 
    1967    return self._getitem_multilevel(key) 
    1968   else: 
-> 1969    return self._getitem_column(key) 
    1970 
    1971  def _getitem_column(self, key): 

/Users/ajinkyachandrakantbobade/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/frame.pyc in _getitem_column(self, key) 
    1974   # get column 
    1975   if self.columns.is_unique: 
-> 1976    return self._get_item_cache(key) 
    1977 
    1978   # duplicate columns & possible reduce dimensionality 

/Users/ajinkyachandrakantbobade/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/generic.pyc in _get_item_cache(self, item) 
    1087   """ return the cached item, item represents a label indexer """ 
    1088   cache = self._item_cache 
-> 1089   res = cache.get(item) 
    1090   if res is None: 
    1091    values = self._data.get(item) 

TypeError: unhashable type 

Can кто-нибудь, пожалуйста, помогите в отношении этой ошибки?

ответ

0

Размер матриц, которые вы пытаетесь размножить, слишком велик, и у вас недостаточно памяти для завершения вычисления. Несколько вещей, которые могли бы помочь:

  • получить больше оперативной памяти
  • если ваша матрица содержит множество 0, вы можете попробовать использовать разреженных матриц. Они являются регулярными матрицами, которые хранят только элементы, отличающиеся от нуля. The documentation of scipy предоставит вам некоторую информацию.
  • , кажется, что вы уже используете питона 64bit, но если это не будет работать лучше, чем питон 32bit
+0

на основе каталога наименовании (т.е. Canopy_64), ОП использует 64-битную питона. –

+0

Хорошо заметили, я отредактирую ответ –

+0

Спасибо за ваш комментарий. В результирующей матрице много нулей. Я прочитал документацию, но не смог найти способ создания разреженной матрицы такой огромной матрицы, есть ли другой документ, который я должен сослаться на то, что решит вопрос? –

Смежные вопросы