2013-02-27 32 views
5

Büyük bir seyrek matrisi tersine çevirmem gerekiyor. Matrisin tersine çevrilmesinden kaçamıyorum, tek kısayol sadece ana diyagonal elemanlar hakkında bir fikir edinmek ve diyagonal olmayan unsurları görmezden gelmek olurdu (tercih ederim, ama bir çözüm olarak kabul edilebilir).Büyük seyrek matrisleri scipy ile ters çevirme

Tersine çevirmem gereken matrisler genellikle büyüktür (40000 * 40000) ve yalnızca bir çift non nonro olmayan diyagonaldir. Benim şu anki yaklaşımı seyrek şeyi inşa etmek ve sonra

posterior_covar = np.linalg.inv (hessian.todense())

bu açıkça uzun bir süre ve hafıza bol sürer.

Herhangi bir ipucu, ya da sadece bir sabır meselesi mi yoksa sorunu daha küçük mi?

+0

'scipy' doc Eğer matris yoğunlaştırmak gerekmez söylüyor, bu yüzden biraz kafam karıştı: gelenlerden seyrek ters matris oluşturmak. http://docs.scipy.org/doc/scipy-0.8.x/reference/sparse.html – BenDundee

+3

Versiyon 0.12 scipy (şu anda beta testinde) scipy.sparse.linalg.inv işlevine sahiptir. –

cevap

5

Kaba modülün açık bir tersi yönteme sahip olduğunu sanmıyorum, ancak seyrek çözücülere sahip. Bu oyuncak örneği gibi bir şey çalışır:

>>> a = np.random.rand(3, 3) 
>>> a 
array([[ 0.31837307, 0.11282832, 0.70878689], 
     [ 0.32481098, 0.94713997, 0.5034967 ], 
     [ 0.391264 , 0.58149983, 0.34353628]]) 
>>> np.linalg.inv(a) 
array([[-0.29964242, -3.43275347, 5.64936743], 
     [-0.78524966, 1.54400931, -0.64281108], 
     [ 1.67045482, 1.29614174, -2.43525829]]) 

>>> a_sps = scipy.sparse.csc_matrix(a) 
>>> lu_obj = scipy.sparse.linalg.splu(a_sps) 
>>> lu_obj.solve(np.eye(3)) 
array([[-0.29964242, -0.78524966, 1.67045482], 
     [-3.43275347, 1.54400931, 1.29614174], 
     [ 5.64936743, -0.64281108, -2.43525829]]) 

Sonuç aktarıldığını unutmayın!

Tersinizin de seyrek olmasını ve son çözülmeden gelen yoğun dönüşün belleğe sığmayacağını düşünüyorsanız, aynı anda bir satır (sütun) oluşturabilir, sıfır olmayan değerleri ayıklayabilirsiniz.

>>> for k in xrange(3) : 
...  b = np.zeros((3,)) 
...  b[k] = 1 
...  print lu_obj.solve(b) 
... 
[-0.29964242 -0.78524966 1.67045482] 
[-3.43275347 1.54400931 1.29614174] 
[ 5.64936743 -0.64281108 -2.43525829]