2011-07-13 250 views
35

目前我使用numpy來完成這項工作。但是,因爲我正在處理數千行/列的矩陣,後來這個數字會高達數萬,我想知道是否存在可以更快執行這種計算的包?什麼是在python中找到特徵值/向量的最快方法?

+2

numpy不能很好地擴展嗎?我認爲這是爲那樣的事情設計的。這不是整個矢量化操作的重點嗎? – JAB

回答

48
  • **如果你的馬:在並行使用MPI計算trix是稀疏的,然後使用scipy.sparse的構造函數實例化您的矩陣,然後使用spicy.sparse.linalg中的類似特徵向量/特徵值方法。從性能上看,這樣做有兩個好處:

    • 你的矩陣,從spicy.sparse構造建成,將在比例更小,這是多麼稀少。

    • eigenvalue/eigenvector methods爲稀疏矩陣(eigseigsh)接受一個可選參數,ķ這是你想要返回特徵向量/本徵值對的數目。幾乎總是需要考慮到> 99%的變化所需的數量遠遠少於列的數量,您可以驗證事後;換句話說,你可以告訴方法不要計算並返回所有的特徵向量/特徵值對 - 超出瞭解決方差所需的(通常)很小的子集,它不太可能需要其餘部分。

  • 使用線性代數庫中SciPy的scipy.linalg,所述NumPy的庫中的相同名稱的,而不是 。這兩個庫有 相同的名稱並使用相同的方法名稱。但是,性能有所不同。 這種差異的事實,numpy.linalg是類似LAPACK例程 忠實的包裝物 犧牲一些性能的便攜性和方便性(即 遵守NumPy的設計目標造成的整個NumPy庫 應該在沒有Fortran編譯器的情況下構建)。 linalg上 SciPy的另一方面是LAPACK一個更完整的包裝和 使用f2py

  • 選擇適合您的用例的功能;換句話說,不要使用比你需要的功能更多的功能。在scipy.linalg 有幾個函數來計算特徵值; 的差異並不大,但通過仔細選擇功能 來計算特徵值,您應該會看到性能提升。對於 例如:

    • scipy.linalg.eig返回特徵值和特徵向量
    • scipy.linalg.eigvals,只返回的特徵值。因此,如果您只需要矩陣的特徵值,那麼不需要使用linalg.eig,使用linalg.eigvals來代替。
    • 如果你有一個實值方形對稱矩陣(等於它的轉置),然後使用scipy.linalg.eigsh
  • 優化SciPy的建立您準備建立SciPy的environement 是主要在SciPy的setup.py腳本中完成。或許 性能方面最重要的選擇是識別任何優化的LAPACK庫,如或Accelerate/vecLib框架(僅限OS X ?),以便SciPy可以檢測到它們並針對它們進行構建。 根據您目前所擁有的鑽機,優化您的SciPy 構建,然後重新安裝可以給你增加大量的性能 。 SciPy核心團隊的補充說明是here

這些功能是否適用於大型矩陣?

我應該這樣認爲。這些是工業強度矩陣分解方法,它們只是對類似的Fortran程序的薄包裝。

我已經使用linalg庫中的大多數方法來分解矩陣,其中列數通常在5到50之間,其中行數通常超過500,000。方法似乎沒有處理這種大小的矩陣的任何問題。

使用SciPy的linalg你可以計算特徵值和特徵值,具有單呼,使用任何從這個庫的幾種方法,EIGeigvalsh,並eigh

>>> 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的eigvals實際上比scipy的要快。 –

+0

我在40000對40,000對稱稀疏矩陣上使用scipy.sparse.linalg.eign.eigsh。我需要將近30分鐘才能找到125個最小的特徵向量。所以我也想知道Python中最有效的特徵向量求解器是什麼。 – Wedoso

相關問題