เป็นวิธีที่เร็วที่สุดในการคำนวณค่าลักษณะเฉพาะทั้งหมดของเมทริกซ์ adjacency ใหญ่และเบาบางในงูใหญ่คืออะไร?


12

ฉันพยายามที่จะคิดออกว่ามีวิธีที่เร็วกว่าในการคำนวณค่าลักษณะเฉพาะและ eigenvector ทั้งหมดของเมทริกซ์ adjacency ขนาดใหญ่มากและกระจัดกระจายกว่าการใช้ scipy.sparse.linalg.eigsh เท่าที่ฉันรู้วิธีการนี้ใช้เพียงการกระจายและ คุณลักษณะสมมาตรของเมทริกซ์ เมทริกซ์คำวิเศษณ์เป็นเลขฐานสองสิ่งที่ทำให้ฉันคิดว่ามีวิธีที่เร็วกว่าที่จะทำ

ฉันสร้างเมทริกซ์ adjacency แบบสุ่มขนาด 1000x1000 และเปรียบเทียบระหว่างหลายวิธีในแล็ปท็อป x230 ubuntu 13.04 ของฉัน:

  • scipy.sparse.linalg.eigs: 0.65 วินาที
  • scipy.sparse.linalg.eigsh: 0.44 วินาที
  • scipy.linalg.eig: 6.09 วินาที
  • scipy.linalg.eigh: 1.60 วินาที

ด้วยการกระจัดกระจาย eigs และ eigsh ฉันตั้ง k จำนวนค่าลักษณะเฉพาะและ eigenvectors ที่ต้องการให้เป็นอันดับของเมทริกซ์

ปัญหาเริ่มต้นด้วยเมทริกซ์ที่ใหญ่กว่า - บนเมทริกซ์ 9000x9000 ใช้เวลา scipy.sparse.linalg.eigsh 45 นาที!


1
NB scipy.sparse.linalg.eigsh คือ ARPACK
pv

4
ในการติดตามยิ่งเมทริกซ์ของคุณมีขนาดใหญ่ขึ้นโอกาสที่คุณจะคำนวณค่าลักษณะภายในน้อยลง (นั่นคือไม่ใช่ค่าลักษณะเฉพาะที่ใหญ่ที่สุดหรือเล็กที่สุด) อย่างแม่นยำ คุณต้องการข้อมูลอะไรจากเมทริกซ์ที่คุณกำลังย่อยสลาย?
Geoff Oxberry

1
คำถามนี้ได้รับการข้ามโพสต์ที่นี่ ฉันจะแนะนำให้ปิดเวอร์ชันที่โพสต์แล้ว
Aron Ahmadia

2
ฉันต้องการคำนวณ A ^ k หลังจากคิดใหม่แล้วฉันคิดว่าด้วยเมทริกซ์นั้นเร็วกว่ามากในการคำนวณการคูณโดยตรง (A A A ... ) ที่อัดแน่นกว่าการใช้ eigendecomposition แน่นอนมันขึ้นอยู่กับ k
Noam Peled

2
ใช่ทำโดยตรง ผลลัพธ์ของ eigendecomposition ไม่กระจัดกระจายดังนั้นคุณจะมีปัญหาการจัดเก็บ (จากนั้นอีกครั้งไม่เป็น A ^ k ถ้า k มีขนาดใหญ่พอ) stackoverflow.com/a/9495457/424631
dranxo

คำตอบ:


6

FILTLANเป็นห้องสมุด C ++ สำหรับการคำนวณค่าลักษณะเฉพาะภายในของเมทริกซ์สมมาตรแบบเบาบาง ความจริงที่ว่ามีทั้งแพ็คเกจที่อุทิศให้กับสิ่งนี้ควรบอกคุณว่ามันเป็นปัญหาที่ค่อนข้างยาก การหาค่าลักษณะเฉพาะไม่กี่ค่าที่ใหญ่ที่สุดหรือเล็กที่สุดของเมทริกซ์สมมาตรสามารถทำได้โดยการเลื่อน / กลับด้านและใช้อัลกอริธึม Lanczos แต่จุดศูนย์กลางของสเปกตรัมเป็นอีกเรื่องหนึ่ง หากคุณต้องการใช้สิ่งนี้คุณสามารถใช้ SWIG เพื่อเรียกโปรแกรม C ++ จากไพ ธ อน

หากเป้าหมายสุดท้ายของคุณคือการคำนวณพลังขนาดใหญ่ของเมทริกซ์คุณสามารถคำนวณค่าไอเกนที่สอดคล้องกับค่าลักษณะเฉพาะที่ใหญ่ที่สุดเนื้อหาในความรู้ที่ว่าโหมดขนาดเล็กจะมีความสำคัญน้อยลงเมื่อคุณใช้พลังงานขนาดใหญ่

ที่กล่าวว่าคุณอาจจะดีกว่าในการคำนวณพลังโดยตรง พวกมันจะเติบโตน้อยลงเรื่อย ๆ เมื่อคุณคำนวณพลังที่สูงขึ้นซึ่งจะหมายถึงการใช้หน่วยความจำมากขึ้น ขึ้นอยู่กับวิธีการที่สูงคือคุณที่สุดอาจต้องการที่จะเปลี่ยนไปใช้เมทริกซ์มีความหนาแน่นสูงk

ยกโทษให้ฉันถ้าสิ่งเหล่านี้เห็นได้ชัดสำหรับคุณแล้ว: คุณสามารถใช้ประโยชน์จากลักษณะไบนารีของเมทริกซ์โดยบอกว่ามันประกอบด้วยจำนวนเต็มแทนที่จะลอยตัวพูดโดยใช้

a = np.zeros(100,dtype=np.uint)

สิ่งนี้ (หวังว่า) จะช่วยประหยัดพื้นที่ คุณสามารถประหยัดเวลา (แต่ไม่ใช่หน่วยความจำ) โดยการปิดกั้นการคูณเมทริกซ์ สมมติว่าคุณต้องการคำนวณ ; คุณคำนวณจากนั้นยกกำลังสองนี้เพื่อให้ได้สองนี้เพื่อให้ได้และอื่น ๆ ด้วยวิธีนี้คุณจะทำการ matrixเมทริกซ์แทนการคูณA16A2A4A8log2kk

นอกจากนี้คุณยังสามารถสำรวจการเรียกไลบรารี่พีชคณิตเชิงเส้นแบบขนานเช่น CUSP หรือ cuSPARSE จาก Python หากคุณกังวลเรื่องความเร็วและคุณมี NVIDIA GPU


1

ฉันต้องการที่จะแสดงความคิดเห็นในคำตอบของ Daniel Shapero แต่ฉันมีชื่อเสียงไม่เพียงพอ

คำตอบที่ยอมรับทำให้ฉันสับสนมาก ฉันคิดว่าสามารถใช้โหมด shift-invert เพื่อคำนวณค่าลักษณะเฉพาะภายในได้ ดู: https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html

หากต้องการตอบคำถามเดิม: คุณไม่ต้องการค่าลักษณะเฉพาะทั้งหมดของเมทริกซ์กระจัดกระจาย โดยปกติแล้วคุณต้องการสุดขั้วหรือกลุ่มของค่าภายใน ในกรณีนั้นสำหรับ Hermitian matrix eigshนั้นเร็วกว่า eigsสำหรับผู้ที่ไม่เทียนคุณจะต้องไปกับ และพวกเขาจะเร็วกว่า numpy หรือeigeigh

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.