2011-07-13 19 views
35

Şu anda iş yapan numpy kullanıyorum. Ancak, binlerce sıra/sütun içeren matrislerle uğraşırken ve bu rakam on binlerce kişiye kadar çıkacakken, bu tür hesaplamaları daha hızlı gerçekleştirebilecek bir paket olup olmadığını merak ettim.Python'da özdeğerleri/vektörleri bulmanın en hızlı yolu nedir?

+2

? Bunun gibi şeyler için tasarlandığını düşündüm. Bu vektörel operasyonların bütün noktası değil mi? Benim makinede – JAB

cevap

48
  • ** annen eğer: paralel kullanarak MPI içinde hesaplamalar trix seyrek, sonra scipy.sparse dan bir kurucu kullanarak matrisinizi örneğiniz sonra spicy.sparse.linalg spicy.sparse.linalg içinde kullanın. Ne kadar seyrek orantılı olarak daha küçük olacak

    • sizin matris, spicy.sparse yapıcısı inşa,: görünümünde bir performans açısından, bu iki avantajı vardır.

    • seyrek matrisler için eigenvalue/eigenvector methods

    • ( eigs, eigsh) isteğe bağlı bir argüman kabul döndürülen istediğiniz özvektör/özdeğer çiftlerinin sayısı k . Neredeyse her zaman varyansın>% 99'unu hesaba katmak için gereken sayı, ex post; Diğer bir deyişle, tüm özvektörler/özdeğer çiftlerini hesaplama ve geri döndürme yöntemini söyleyemezsiniz - varyansı hesaplamak için gereken (genellikle) küçük alt kümenin ötesinde, geri kalanına ihtiyacınız yoktur.

  • içinde scipy,scipy.linalg, aynı adı NumPy kitaplığı yerine lineer cebir kitaplığı kullanılır. Bu iki kitaplık aynı ada sahip ve aynı yöntem adlarını kullanın. Yine de performansta bir fark var. Bu fark numpy.linalg NumPy tasarım hedefi uymak için, örneğin, taşınabilirlik ve kullanım kolaylığı için ( bazı performans fedakarlık analog LAPACK rutinlerinin bir az sadık sarıcı gerçeği neden olduğu Tüm NumPy kütüphanesinin tümünün bir Fortran derleyicisi olmadan inşa edilmesi gerekir). linalg üzerinde SciPyDiğer yandan LAPACK üzerinde çok daha tam bir sarma ve f2py kullanır.

  • kullanımınız durumda için uygun işlevi seçin; Diğer bir deyişle, bir işlevi kullanmanız gerekenden daha fazlasını yapmaz. scipy.linalg 'da özdeğerleri hesaplamak için birçok fonksiyon vardır; farkları büyük değildir, ancak özdeğerleri hesaplamak için işlevinin dikkatli seçimi ile bir performans artışı görmelisiniz. Örneğin:

    • scipy.linalg.eig döner hem özdeğerler ve özvektörlerin
    • scipy.linalg.eigvals, sadece öz döndürür. Dolayısıyla, yalnızca bir matrisin öz değerlerine ihtiyaç duyarsanız, linalg.eig kullanın, bunun yerine linalg.eigvals kullanın. Eğer (onun devrik eşit) gerçek değerli kare simetrik matrisleri varsa
    • sonra sizin scipy olan environement inşa Hazırlama inşa sizin scipy optimize scipy.linalg.eigsh
  • kullanmak SciPy'nin setup.py komut dosyasında büyük ölçüde yapıldı. Belki en önemli seçenek epeyce herhangi optimize LAPACK kütüphaneleri tespitidir gibi ATLAS veya scipy onları tespit ve onlara karşı inşa böylece/vecLib çerçevesini (OS X sadece?) Hızlandırın. Şu anda sahip olduğunuz teçhizata bağlı olarak, SciPy yapınızı optimize etmek ve daha sonra yeniden yüklemek, size önemli bir performans artış sağlayabilir. SciPy çekirdek ekibinden ek notlar here. bu işlevler büyük matrisler için

çalışacak mı?

Bunu düşünmeliyim. Bunlar endüstriyel mukavemet matrisi ayrıştırma yöntemleridir ve bunlar, benzer Fortran LAPACK rutinleri üzerinde sadece ince sarmalayıcılardır.

Sütun sayısının genellikle 5 ile 50 arasında olduğu ve satır sayısının genellikle 500.000'i aştığı matrisleri ayrıştırmak için linalg kitaplığındaki yöntemlerin çoğunu kullandım. Ne SVD ne de özdeğeri yöntemlerinin, bu boyuttaki matrisleri işleme ile ilgili herhangi bir sorun yok gibi görünüyor.

bu kütüphaneden birkaç yöntemlerden birini kullanarak, tek bir çağrı ile, öz vektörlerini ve öz hesaplayabilir scipy kütüphaneye linalg kullanarak, eig, eigvalsh ve eigh. numpy iyi ölçek yapmaz

>>> import numpy as NP 
>>> from scipy import linalg as LA 

>>> A = NP.random.randint(0, 10, 25).reshape(5, 5) 
>>> A 
    array([[9, 5, 4, 3, 7], 
      [3, 3, 2, 9, 7], 
      [6, 5, 3, 4, 0], 
      [7, 3, 5, 5, 5], 
      [2, 5, 4, 7, 8]]) 

>>> e_vals, e_vecs = LA.eig(A) 
+1

, numpy en eigvals scipy yıllardan daha doğrusu hızlıdır. –

+0

Ben 40,000 40,000 ile simetrik seyrek matris üzerine scipy.sparse.linalg.eign.eigsh kullanıyorum. 125 en küçük özvektörleri bulmak neredeyse 30 dakika sürer. Bu yüzden de en verimli özvektör çözücüsünün Python'da ne olduğunu merak ediyorum. – Wedoso

İlgili konular