มีอัลกอริธึมที่รวดเร็วสำหรับการคำนวณ SVD ที่ถูกตัดทอนหรือไม่


14

อาจจะปิดหัวข้อที่นี่ แต่มีอยู่หลายคน ( หนึ่ง , สอง ) คำถามที่เกี่ยวข้องแล้ว

สำรวจวรรณกรรม (หรือการค้นหา google สำหรับ Truncated SVD Algorithms) เปิดเอกสารจำนวนมากที่ใช้ SVD ที่ถูกตัดทอนในรูปแบบต่าง ๆ และเรียกร้อง (น่าหงุดหงิดมักไม่มีการอ้างอิง) ว่ามีอัลกอริธึมที่รวดเร็วสำหรับการคำนวณ แต่ไม่มีใคร ดูเหมือนว่าจะชี้ไปที่อัลกอริธึมเหล่านั้น

สิ่งเดียวที่ฉันสามารถหาเป็นหนึ่งในขั้นตอนวิธีการสุ่มที่ใช้ในห้องสมุด redSVD

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

ใครบ้างมีการอ้างอิงที่ดีสำหรับสิ่งนี้หรือไม่?


ถ้าฉันต้องการเก็บข้อมูลได้ดีฉันใช้ b-tree (หรือ rb-tree) ในแฮช (คิดว่า ram) หากฉันมี b-tree สำหรับข้อมูลดังนั้นฉันสามารถใช้ O (log (n)) เวลาตัวอย่างปริมาณและเช่น ฉันพนันได้เลยว่าด้วยข้อมูลขนาดใหญ่การสุ่มตัวอย่างดังกล่าวสามารถใช้ในการคำนวณการกระจัดกระจายที่เหมาะสมกับเมทริกซ์ svd ในระยะเวลาอันสั้น คุณอาจค้นหา "การตรวจจับที่ถูกบีบอัด" ซึ่งเป็นวิธีการทางสถิติอย่างมากสำหรับการบีบอัดข้อมูลที่รุนแรง
EngrStudent - Reinstate Monica

ด้วยการตัดทอน SVD คุณหมายความว่าคุณสนใจที่จะหาเวกเตอร์ / ค่าเอกพจน์นำหลายค่าเท่านั้นซึ่งไม่ใช่ทั้งหมดของพวกเขา?
อะมีบาพูดว่า Reinstate Monica

@ amoeba ใช่นั่นคือความคิด
John Doucette

คำตอบ:


16

การพูดอย่างกว้าง ๆ มีสองวิธีในการคำนวณค่าลักษณะเฉพาะหรือการสลายตัวของค่าเอกพจน์ วิธีการหนึ่งที่จะทำให้เมทริกซ์ในแนวทแยงมุมและสิ่งนี้ทำให้ได้ค่าการสลายตัวของค่า eigenvalue / เอกพจน์ทั้งหมด (สเปกตรัม eigenvalue ทั้งหมด) ในเวลาเดียวกันดูภาพรวมบางส่วนที่นี่: อัลกอริธึมที่มีประสิทธิภาพในการคำนวณ ทางเลือกคือใช้อัลกอริธึมวนซ้ำที่ให้ผล eigenvector หนึ่งครั้งหรือหลายตัว การวนซ้ำสามารถหยุดได้หลังจากที่คำนวณจำนวนไอเกนผู้ปฏิบัติงานที่ต้องการแล้ว

ฉันไม่คิดว่ามีอัลกอริทึมซ้ำสำหรับ SVD โดยเฉพาะ เพราะนี่คือหนึ่งสามารถคำนวณ SVD ของเมทริกซ์Bโดยทำ eigendecomposition ของตารางสมมาตร( n + ม. ) × ( n + ม. )เมทริกซ์= ( 0 B B 0 ) ดังนั้นแทนที่จะถามว่าขั้นตอนวิธีการคำนวณที่ถูกตัดทอน SVD คุณควรจะขอให้สิ่งที่ย้ำขั้นตอนวิธีการคำนวณ eigendecomposition: อัลกอริทึมสำหรับการตัดทอน SVD ซ้ำอัลกอริทึมสำหรับ eigendecompositionn×mB(n+m)×(n+m)

A=(0BB0).
อัลกอริทึมสำหรับ SVD ที่ถูกตัดทอนอัลกอริทึมซ้ำสำหรับ eigendecomposition.

อัลกอริธึมการทำซ้ำที่ง่ายที่สุดเรียกว่าการทำซ้ำพลังและแน่นอนง่ายมาก:

  1. x
  2. อัพเดทxAx
  3. ทำให้ปกติxx/x
  4. ไปที่ขั้นตอนที่ 2 เว้นแต่จะรวมตัวกัน

อัลกอริธึมที่ซับซ้อนมากขึ้นทั้งหมดนั้นขึ้นอยู่กับแนวคิดของการทำซ้ำพลัง แต่ท้ายที่สุดก็ซับซ้อนมากขึ้น คณิตศาสตร์ที่จำเป็นจะได้รับจาก subspaces Krylov อัลกอริธึมคือการวนซ้ำของ Arnoldi (สำหรับเมทริกซ์แบบไม่สมมาตรสแควร์), การทำซ้ำ Lanczos (สำหรับเมทริกซ์สมมาตรแบบสี่เหลี่ยมจัตุรัส), และการแปรผันของมันเช่นเช่น "วิธีการเริ่มต้นใหม่แบบ Lanczos โดยปริยาย"

คุณสามารถหาคำอธิบายนี้ได้เช่นตำราเรียนต่อไปนี้:

  1. สินเชื่อ Golub & Van, การคำนวณเมทริกซ์
  2. Trefethen & Bau พีชคณิตเชิงเส้นเชิงตัวเลข
  3. Demmel พีชคณิตเชิงเส้นเชิงตัวเลขที่ใช้
  4. ซาดวิธีการเชิงตัวเลขสำหรับปัญหาค่าลักษณะเฉพาะขนาดใหญ่

ภาษาการเขียนโปรแกรมที่สมเหตุสมผลและแพ็คเกจสถิติ (Matlab, R, Python เป็นชื่อที่คุณใช้) ใช้ไลบรารี Fortran เดียวกันเพื่อดำเนินการแยกย่อยค่า eigen / เอกพจน์ เหล่านี้เป็นLAPACKและARPACK ARPACK ย่อมาจาก ARnoldi แพคเกจและมันคือทั้งหมดที่เกี่ยวกับการทำซ้ำ Arnoldi / Lanczos เช่นใน Matlab มีสองฟังก์ชั่นสำหรับ SVD: svdทำการย่อยสลายแบบเต็มผ่าน LAPACK และsvdsคำนวณจำนวนเวกเตอร์เอกพจน์ที่กำหนดผ่าน ARPACK และที่จริงแล้วมันเป็นเพียง wrapper สำหรับeigsเรียกใช้เมทริกซ์ "square-ized"

ปรับปรุง

BAABA

มีห้องสมุด Fortran สำหรับวิธีการเหล่านี้ด้วยเช่นกันมันเรียกว่าPROPACK :

แพคเกจซอฟต์แวร์ PROPACK มีชุดของฟังก์ชั่นสำหรับการคำนวณการสลายตัวของเอกพจน์ของเมทริกซ์ขนาดใหญ่และกระจัดกระจายหรือมีโครงสร้าง รูทีน SVD จะขึ้นอยู่กับอัลกอริทึมการปรับเปลี่ยนสองชั้นของ Lanczos พร้อมการทำซ้ำบางส่วน (BPRO)

อย่างไรก็ตาม PROPACK ดูเหมือนว่าจะมีมาตรฐานน้อยกว่า ARPACK มากและไม่ได้รับการสนับสนุนในภาษาการเขียนโปรแกรมมาตรฐาน มันเขียนโดย Rasmus Larsen ที่มีขนาดใหญ่ 90 หน้ายาว 1998 กระดาษLanczos bidiagonalization ด้วย reorthogonalization บางส่วนกับสิ่งที่ดูเหมือนว่าภาพรวมที่ดี ขอบคุณ @MichaelGrant ผ่านชุดการคำนวณทางวิทยาศาสตร์ SEนี้

ในบรรดาเอกสารล่าสุดที่ได้รับความนิยมมากที่สุดดูเหมือนจะเป็น Baglama & Reichel, 2005, Augmented เริ่มต้นใหม่โดยปริยาย Lanczos bidiagonalization วิธีซึ่งอาจจะเป็นรอบของศิลปะ ขอบคุณ @Dougal ที่ให้ลิงค์นี้ในความคิดเห็น

อัปเดต 2

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


โปรดทราบว่ามีวิธีการทำซ้ำเฉพาะ SVD อยู่; เช่นการเติมใหม่โดยนัยโดยนัยเริ่มต้นใหม่วิธีการทำให้เป็นสองมิติของ Lanczos , J. Baglama และ L. Reichel, SIAM J. Sci คอมพิวเต ปี 2005 (ผมยังไม่ได้อ่านกระดาษที่จะทราบว่าเป็นพื้นฐานที่แตกต่างจากวิธีการ eigenvalue คุณให้เพียงแค่รู้ว่าคนที่ชอบวิธีการที่.)
Dougal

1
ขอบคุณสำหรับลิงค์ @Dougal ฉันควรจะบอกว่าฉันไม่รู้วิธีการเหล่านี้จริงๆ มันจะดีถ้ามีคนที่มีความรู้มากกว่าจะอธิบายความสัมพันธ์ระหว่างวิธีการวนซ้ำต่างๆ เท่าที่ฉันเข้าใจวิธี vanilla Lanczos สำหรับการคำนวณค่าลักษณะเฉพาะของเมทริกซ์จตุรัสไม่ใช่สำหรับ SVD "เพิ่มการรีสตาร์ท Lanczos โดยปริยาย" ควรเกี่ยวข้องกับมันอย่างใกล้ชิด แต่คุณพูดถูก - ดูเหมือนว่าจะเกี่ยวข้องกับ SVD โดยตรง ไม่แน่ใจว่ามันเข้ากันได้อย่างไร ฉันจะอัปเดตคำตอบของฉันหากฉันได้มองอย่างใกล้ชิด
อะมีบาพูดว่า Reinstate Monica

1
@ ผิดกฎหมายฉันได้อ่านคร่าวๆและทำการอัปเดต
อะมีบาพูดว่า Reinstate Monica

@ amoeba จะ "ตัดทอน SVD" ในบริบทของกำลังสองน้อยที่สุดที่เป็นมาตรฐานโดยพื้นฐานแล้วจะเหมือนกับ"การวิเคราะห์องค์ประกอบหลัก"หรือไม่
GeoMatt22

1
@ amoeba คุณสามารถแสดงความคิดเห็นเกี่ยวกับการใช้งาน SVD แบบสุ่มของ Facebook ได้หรือไม่บางคนดูเหมือนจะบอกว่ามันเป็นหนึ่งในโซลูชั่นที่เร็วที่สุดที่เป็นไปได้ มันจะดีมากถ้าคุณสามารถแก้ไขเพื่อแสดงความคิดเห็นในเรื่องนี้
ทิม

4

ฉันเพิ่งสะดุดด้ายผ่าน googling SVD ที่รวดเร็วดังนั้นฉันจึงพยายามหาสิ่งต่าง ๆ ด้วยตัวเอง แต่บางทีคุณควรดูการปรับตัวแบบข้ามโดยประมาณ (ACA)

MM=Σผม=0kยูผมVผมTยังไม่มีข้อความ×ยังไม่มีข้อความO(ยังไม่มีข้อความ) ) ดังนั้นมันจึงเร็วมาก น่าเสียดายที่หลายคนใช้คำว่า "เร็ว" เบา ๆ

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

หมายเหตุ:ฉันต้องการที่จะเขียนเป็นความคิดเห็น แต่เพราะฉันเพิ่งสร้างบัญชีนี้ฉันไม่ได้มีชื่อเสียงพอสำหรับความคิดเห็น ... แต่การโพสต์งาน


2

นี่เป็นเทคนิคที่ฉันใช้มาแล้วในอดีตเพื่อคำนวณ SVD ที่ถูกตัดทอน (ในชุดข้อมูล Netflix) มันถูกนำมาจากบทความนี้ ในการตั้งค่าการกรองแบบทำงานร่วมกันฉันควรทราบว่าค่าส่วนใหญ่หายไปและประเด็นคือการทำนายค่าดังนั้นการใช้ SVD ที่ถูกตัดทอนเพื่อแก้ไขปัญหาดังกล่าวคุณต้องใช้เทคนิคที่ทำงานภายใต้เงื่อนไขนั้น คำอธิบายสั้น ๆ :

  1. ก่อนที่คุณจะทำอะไรให้พอดีกับรูปแบบง่าย ๆ (เช่นค่าเฉลี่ยส่วนกลาง + คอลัมน์และค่าคงที่แถว) และเมื่อคุณทำเสร็จแล้วควรย้ายไปใช้ SVD ที่ถูกตัดทอนเพื่อให้พอดีกับส่วนที่เหลือ
  2. เริ่มต้นเวกเตอร์แบบสุ่มที่มีความยาว k (ซึ่งเป็นอันดับที่คุณตัดทอน) ไปยังแต่ละแถวและคอลัมน์ (สำหรับภาพยนตร์และผู้ใช้แต่ละคนในกรณี Netflix)
  3. กดค้างเวกเตอร์แถวคงที่และอัพเดตเวกเตอร์คอลัมน์เพื่อลดข้อผิดพลาด wrt รายการที่รู้จักในเมทริกซ์ ขั้นตอนที่ได้รับในรหัส MATLAB ในกระดาษ
  4. ถือคอลัมน์เวกเตอร์คงที่และปรับปรุงเวกเตอร์แถวในลักษณะที่คล้ายคลึงกัน
  5. ทำซ้ำ 3 และ 4 จนกว่าคุณจะมาบรรจบกันหรือได้รับผลลัพธ์ที่ดีพอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.