ฉันพยายามคำนวณ eigenvector เพียงไม่กี่ (5-500) ที่สอดคล้องกับค่าลักษณะเฉพาะขนาดเล็กที่สุดของเมทริกซ์กระจัดกระจาย - สมมาตรขนาดใหญ่ (สูงสุด 30000x30000) โดยน้อยกว่า 0.1% ของค่าที่ไม่ใช่ศูนย์
ขณะนี้ฉันกำลังใช้ scipy.sparse.linalg.eigsh ในโหมด shift-invert (sigma = 0.0) ซึ่งฉันคิดว่าผ่านการโพสต์ต่างๆในหัวข้อเป็นวิธีที่ต้องการ อย่างไรก็ตามอาจใช้เวลาถึง 1 ชั่วโมงในการแก้ปัญหาในกรณีส่วนใหญ่ ในทางกลับกันฟังก์ชั่นนั้นเร็วมากถ้าฉันขอค่าลักษณะเฉพาะที่ใหญ่ที่สุด (วินาทีย่อยในระบบของฉัน) ซึ่งคาดว่าจากเอกสาร
เนื่องจากฉันคุ้นเคยกับ Matlab มากขึ้นจากการทำงานฉันพยายามแก้ไขปัญหาใน Octave ซึ่งให้ผลลัพธ์แบบเดียวกันกับฉันโดยใช้ eigs (sigma = 0) ในเวลาเพียงไม่กี่วินาที (ช่วงย่อย 10 วินาที) เนื่องจากฉันต้องการทำการกวาดพารามิเตอร์ของอัลกอริธึมรวมถึงการคำนวณ eigenvector การเพิ่มเวลาแบบนั้นน่าจะเป็นเรื่องที่ดีสำหรับไพ ธ อนเช่นกัน
ฉันก่อนเปลี่ยนพารามิเตอร์ (โดยเฉพาะอย่างยิ่งความอดทน) แต่นั่นไม่ได้เปลี่ยนแปลงมากใน timescales
ฉันใช้ Anaconda บน Windows แต่พยายามที่จะเปลี่ยน LAPACK / BLAS ที่ใช้โดย scipy (ซึ่งเป็นอาการปวดมาก) จาก mkl (Anaconda เริ่มต้น) เป็น OpenBlas (ใช้โดย Octave ตามเอกสารประกอบ) แต่ไม่เห็นการเปลี่ยนแปลงใน ประสิทธิภาพ.
ฉันไม่สามารถทราบได้ว่ามีบางสิ่งที่เปลี่ยนแปลงเกี่ยวกับ ARPACK ที่ใช้แล้วหรือยัง?
ฉันอัปโหลด testcase สำหรับรหัสด้านล่างไปยังดรอปบ็อกซ์โฟลเดอร์ต่อไปนี้: https://www.dropbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnnjRaETQmka?dl=0
ในงูหลาม
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
ในระดับแปดเสียง:
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
ความช่วยเหลือใด ๆ ที่เป็นประโยชน์!
ตัวเลือกเพิ่มเติมบางอย่างที่ฉันลองใช้โดยอ้างอิงจากความคิดเห็นและข้อเสนอแนะ:
ระดับแปดเสียง:
eigs(M,6,0)
และeigs(M,6,'sm')
ให้ผลลัพธ์เดียวกันกับฉัน:
[1.8725e-05 1.0189e-05 7.5622e-06 7.5420e-07 -1.2239e-18 -2.5674e-16]
ในขณะที่eigs(M,6,'sa',struct('tol',2))
มาบรรจบกัน
[1.0423 2.7604 6.1548 11.1310 18.0207 25.3933]
เร็วกว่ามาก แต่ถ้าค่าความคลาดเคลื่อนสูงกว่า 2 มิฉะนั้นจะไม่รวมกันเลยและค่าจะแตกต่างกันอย่างมาก
Python:
eigsh(M,k=6,which='SA')
และeigsh(M,k=6,which='SM')
ทั้งคู่ไม่ได้มาบรรจบกัน (ข้อผิดพลาด ARPACK เมื่อไม่มีการลู่เข้าถึง) eigsh(M,k=6,sigma=0.0)
ให้ค่าลักษณะเฉพาะบางอย่างเท่านั้น(หลังจากผ่านไปเกือบหนึ่งชั่วโมง) ซึ่งต่างจากอ็อกเทฟสำหรับค่าที่เล็กที่สุด (พบ 1 ค่าเล็ก ๆ เพิ่มเติม):
[3.82923317e-17 3.32269886e-16 2.78039665e-10 7.54202273e-07 7.56251500e-06 1.01893934e-05]
หากความอดทนสูงพอฉันก็จะได้ผลลัพธ์eigsh(M,k=6,which='SA',tol='1')
เช่นกันซึ่งมาใกล้ ๆ กับค่าที่ได้รับอื่น ๆ
[4.28732218e-14 7.54194948e-07 7.56220703e-06 1.01889544e-05, 1.87247350e-05 2.02652719e-05]
อีกครั้งด้วยค่าลักษณะเฉพาะจำนวนน้อย เวลาในการคำนวณยังคงอยู่เกือบ 30 นาที ในขณะที่ค่าน้อยมากที่แตกต่างกันอาจเข้าใจได้เนื่องจากพวกเขาอาจเป็นตัวแทนของทวีคูณของ 0 ความหลากหลายที่แตกต่างกันทำให้ฉันยุ่งเหยิง
นอกจากนี้ดูเหมือนว่าจะมีความแตกต่างพื้นฐานบางอย่างใน SciPy และ Octave ซึ่งฉันยังไม่สามารถเข้าใจได้