คำนวณ SVD ที่ถูกตัดทอนหนึ่งค่า / เวกเตอร์หนึ่งตัวในแต่ละครั้ง


11

มีอัลกอริทึม SVD ที่ถูกตัดทอนที่คำนวณค่าเอกพจน์ทีละหนึ่งหรือไม่

ปัญหาของฉัน: ผมอยากจะคำนวณแรกค่าเอกพจน์ (และเวกเตอร์เอกพจน์) ของขนาดใหญ่ที่หนาแน่นเมทริกซ์แต่ผมไม่ทราบว่าสิ่งที่มีค่าที่เหมาะสมของจะเป็น มีขนาดใหญ่ดังนั้นด้วยเหตุผลด้านประสิทธิภาพฉันไม่อยากประเมิน SVD แบบเต็มเพียงเพื่อตัดทอน SV ที่เล็กที่สุดหลังจากนั้นM k MkMkM

เป็นการดีที่จะมีวิธีคำนวณค่าเอกพจน์ลำดับจากมากที่สุด ( ) ถึงน้อยที่สุด ( ) ด้วยวิธีนี้ฉันสามารถหยุดการคำนวณหลังจากคำนวณค่าเอกพจน์ th หากต่ำกว่าเกณฑ์σ 1 σ n k σ k / σ 1σ1,σ2,...σ1σnkσk/σ1

มีอัลกอริทึมดังกล่าวอยู่หรือไม่ (โดยเฉพาะอย่างยิ่งเมื่อใช้ Python) ใน googling ของฉันฉันพบเฉพาะฟังก์ชัน SVD ที่ถูกตัดทอนซึ่งใช้ k เป็นพารามิเตอร์ดังนั้นบังคับให้คุณคาดเดาว่าเป็นนิรนัย


M ของคุณเป็นสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยมไหม? ถ้าเป็นรูปสี่เหลี่ยมผืนผ้าคุณต้องการเวกเตอร์เอกพจน์ยาวหรือสั้น? นั่นคือถ้า M คือ (mxn) กับ m> n คุณต้องการ (mxk) หรือ (kxn) หรือไม่?
Max Hutchinson

M เป็นรูปสี่เหลี่ยมผืนผ้ามีแถวมากกว่าคอลัมน์ ฉันต้องการเวกเตอร์เอกพจน์สั้น ๆ (เช่น V ในหน่วย M = U S V ^ T)
SuperElectric

คำตอบ:


6

มีตัวเลือกให้เลือกสองแบบถ้าคุณต้องการ factorizations Rank-k โดยประมาณ

  1. แฟคตอเรียร์ QR ที่เปิดเผยอันดับที่ดี
  2. Interpolative decomposition (ID) และเทคนิคการสุ่มอื่น ๆ

A-Mยังไม่มีข้อความTปัจจัย×σk+1(A)=ε

การประมาณค่าตัวประกอบของแบบฟอร์มด้านบนสามารถแปลงเป็นการแยกย่อยมาตรฐานเช่น QR หรือ SVD โดยใช้เทคนิคมาตรฐาน บทวิจารณ์ที่ดีมีอยู่ในกระดาษโดย Halko, Martinsson และ Tropp "การค้นหาโครงสร้างด้วยการสุ่ม: อัลกอริธึมน่าจะเป็นสำหรับการสร้างการสลายตัวโดยประมาณของเมทริกซ์"

ในแง่ของซอฟต์แวร์ส่วนต่อประสานกับอัลกอริธึม ID มีให้บริการใน scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.htmlซึ่งอนุญาตให้คุณระบุ\ε


2

(แก้ไขเพราะฉันอ่านคำถามผิดในตอนแรกคุณรู้อยู่แล้วว่ามีกิจวัตรในการคำนวณค่าเอกพจน์แรก)k

หากคุณไม่รวมวิธีการคำนวณ SVD ทั้งหมดอัลกอริทึม SVD บางส่วนจะลดการใช้วิธีการวนซ้ำเพื่อแก้ปัญหาค่าลักษณะเฉพาะของ Hermitian ที่เกี่ยวข้อง ดังนั้นกลยุทธ์หนึ่งที่คุณสามารถทำได้คือการเขียนโค้ดสิ่งนี้ด้วยตัวคุณเองและแก้หาค่าเอกพจน์ที่ยังไม่ได้แก้ไขที่ใหญ่ที่สุดจนกว่าคุณจะต้องการหยุดใช้สิ่งที่ต้องการเช่นกลยุทธ์ shift-and-invert อาจจะมีวิธีที่สง่างามของทำเรียงลำดับของสิ่งนี้ในแพคเกจที่มีความซับซ้อนเช่นSLEPc

กลยุทธ์อื่นจะเป็นดังต่อไปนี้:

  • การคำนวณมูลค่าที่ใหญ่ที่สุดเอกพจน์{1}s1
  • ตั้งค่าความอดทนสัมบูรณ์ของรูทีน SVD แบบกระจัดกระจายเป็นโดยที่เป็นขีด จำกัด ของคุณและเป็นปัจจัยด้านความปลอดภัยเพื่อกำหนดจำนวนเอกพจน์ภายนอกที่คุณต้องการ คำนวณ.τ 0 < 1τs1τ0<1
  • เรียกรูทีน SVD sparse

k


หากคุณไม่ได้ระบุ 'k' ใน scipy.sparse.linalg.svds มันจะเริ่มต้นที่ k = 6 โดยไม่คำนึงถึงพารามิเตอร์ 'tol' ไม่ชัดเจนว่านี่เป็นข้อผิดพลาดหรือถ้า 'tol' ควรอ้างถึงความแม่นยำของค่าเอกพจน์ที่คำนวณได้ (แทนที่จะเป็นขนาด)
Nick Alger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.