目前我使用numpy來完成這項工作。但是,因爲我正在處理數千行/列的矩陣,後來這個數字會高達數萬,我想知道是否存在可以更快執行這種計算的包?什麼是在python中找到特徵值/向量的最快方法?
回答
**如果你的馬:在並行使用MPI計算trix是稀疏的,然後使用scipy.sparse的構造函數實例化您的矩陣,然後使用spicy.sparse.linalg中的類似特徵向量/特徵值方法。從性能上看,這樣做有兩個好處:
你的矩陣,從spicy.sparse構造建成,將在比例更小,這是多麼稀少。
的eigenvalue/eigenvector methods爲稀疏矩陣(eigs,eigsh)接受一個可選參數,ķ這是你想要返回特徵向量/本徵值對的數目。幾乎總是需要考慮到> 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你可以計算特徵值和特徵值,具有單呼,使用任何從這個庫的幾種方法,EIG,eigvalsh,並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)
在我的機器上,numpy的eigvals實際上比scipy的要快。 –
我在40000對40,000對稱稀疏矩陣上使用scipy.sparse.linalg.eign.eigsh。我需要將近30分鐘才能找到125個最小的特徵向量。所以我也想知道Python中最有效的特徵向量求解器是什麼。 – Wedoso
如果你的矩陣是稀疏的,你可以嘗試使用SciPy的的稀疏特徵值函數,它應該會更快:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html
您還可以檢查出專門的包,比如SLEPc,其中有python綁定,可以做
- 1. 找到與最小特徵值對應的特徵向量
- 2. 使用R查找大量值的最快方法是什麼?
- 3. 在C++中比較向量的最快方法是什麼?
- 4. MATLAB使用什麼算法找到特徵向量?
- 5. 在python中迭代字典值的最快方法是什麼?
- 6. 計算k個最大特徵值和對應特徵向量的最快方法
- 7. 蟒蛇找到特徵值和特徵向量
- 8. cvBlobsLib的特徵向量和特徵值
- 9. cvBlobsLib的特徵向量和特徵值
- 10. 找到NSString中空格的最快方法是什麼?
- 11. 在scikit-learn中查找和利用PCA中的特徵值和特徵向量
- 12. [R特徵值/特徵向量
- 13. 在桶中查找數字的最快方法是什麼?
- 14. 找到n個數字的gcd最快的方法是什麼?
- 15. 什麼是在Python中過濾整數表的最快方法?
- 16. 在Python中執行I/O的最快方法是什麼?
- 17. 在Python中檢查重複項的最快方法是什麼?
- 18. 什麼是在python中擴展url的最快方法
- 19. 特徵值和特徵向量的方程組
- 20. 什麼是找到連續日期列表的最快方法
- 21. 什麼是找到時間差異最快的方法
- 22. 基於GLSL中矢量特定分量做最小最大值的最快方法是什麼?
- 23. 如何找到沒有numpy和scipy的特徵向量和特徵值?
- 24. 在python中找到大數的階乘的確切值的最快方法是什麼?
- 25. 使用兩個最低特徵值和特徵向量在圖中繪製numpy
- 26. 什麼是檢測SAS中最大變量值的最快方法
- 27. 什麼是String.Split的最佳特徵?
- 28. 在sympy中查找特徵值和特徵向量返回空括號
- 29. 找到給定語句的x值的最快方法是什麼?
- 30. 如何找到主要特徵方向?
numpy不能很好地擴展嗎?我認爲這是爲那樣的事情設計的。這不是整個矢量化操作的重點嗎? – JAB