พิจารณาอย่างรวดเร็วว่าเมทริกซ์หนาแน่นหรือไม่นั้นอยู่ในระดับต่ำ


13

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

โดยทั่วไปแล้วเมทริกซ์ในคำถามจะเต็มหรือเกือบจะหนาแน่นเกือบสมบูรณ์โดยมี n ตั้งแต่หนึ่งร้อยถึงไม่กี่พัน หากเมทริกซ์มีอันดับต่ำ (พูดน้อยกว่า 5 ถึง 10) การคำนวณ SVD และใช้รูปแบบการแยกตัวประกอบอันดับต่ำนั้นคุ้มค่ากับความพยายาม อย่างไรก็ตามหากเมทริกซ์ไม่ได้อยู่ในอันดับต่ำความพยายามก็จะสูญเปล่า

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

ตัวเลือกที่ฉันถือว่ามีอันดับที่เปิดเผย LU หรือ QR ตัวประกอบตามด้วย SVD แบบเต็มเป็นเช็ค มีวิธีอื่นที่ฉันควรพิจารณาอีกหรือไม่

คำตอบ:


8

มีเคล็ดลับเรียบร้อยที่ฉันเพิ่งเรียนรู้จากบทความนี้ คุณเริ่มทำ QR เปิดเผยอันดับและหยุดหลังจากการสะท้อนเจ้าของบ้านครั้งแรกเมื่อคุณมีเมทริกซ์ของฟอร์ม กับสามเหลี่ยมขนาดและมักจะไม่เป็นรูปสามเหลี่ยม (ตั้งแต่เราหยุดหลังจากที่ครั้งแรกซ้ำของวงหลักของเรา) ณ จุดนี้คุณตรวจสอบว่า : ถ้าเก็บไว้แล้วอยู่ที่ระยะไกลที่สุดจากเมทริกซ์ของอันดับk

[R1R120R22],
R1k×kR22kR22εAεk; ไม่เช่นนั้นไม่ควร (ยกเว้นข้อผิดพลาดเชิงตัวเลข)

ขั้นตอนนี้มีค่าใช้จ่ายสำหรับเมทริกซ์หนาแน่นO(n2k)n×n


นี่เป็นวิธีการที่ฉันอธิบายในคำถาม ผมคิดว่าคำตอบที่เสนอโวล์ฟกัง Bangerth อาจทำได้ดีกว่าk) O(n2k)
Brian Borchers

7

ปัญหาแน่นอนคือการคำนวณอันดับที่แท้จริง (เช่นผ่านการสลายตัวของ QR) ไม่ได้มีราคาถูกกว่าการคำนวณด้วยการเป็นตัวแทนระดับต่ำของเมทริกซ์

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

ไม่ว่าจะคุ้มค่ากับเมทริกซ์ขนาดอาจเป็นคำถามที่ดี แต่ถ้าปัญหาของคุณมีขนาดใหญ่จริง ๆ ฉันก็สงสัยว่ามันจะจ่ายออกไป100×100


จากสิ่งที่ฉันรู้เกี่ยวกับอัลกอริธึมเหล่านี้พวกมันสร้างเมทริกซ์ระดับต่ำที่ใกล้เคียงกับมาตรฐานกับเมทริกซ์ที่กำหนด ฉันจำเป็นต้องรู้ว่ามีเมทริกซ์อันดับ (10) หรือน้อยกว่านั้นอยู่ใกล้กับเมทริกซ์ที่กำหนดหรือไม่ (พูดข้อผิดพลาดสัมพัทธ์ของ 1.0e-10 หรือดีกว่า)
Brian Borchers

ใช่ แต่คุณสามารถทำการแบ่งแยก QR ของเมทริกซ์ที่ฉาย (มิติต่ำ) และถ้าการสลายตัวนั้นเผยให้เห็นว่าไม่มีอันดับเต็มคุณก็จะมีเมทริกซ์ดั้งเดิมที่ขาดอันดับ นั่นไม่ใช่เกณฑ์ที่คุณต้องการในการทำ QR decomposition บนเมทริกซ์ดั้งเดิมใช่ไหม
Wolfgang Bangerth

ฉันสามารถเห็นได้ว่าอันดับของเมทริกซ์ที่คาดการณ์มีค่าน้อยกว่าหรือเท่ากับ (จำนวนแถวในเมทริกซ์แบบสุ่มที่ฉันคูณคูณ A) และอันดับของ A หากมันเป็นของอันดับดังนั้นเมทริกซ์ดั้งเดิมจะไม่สามารถ ของอันดับหรือน้อยกว่า ถ้ามันเป็นยศน้อยกว่าแล้วฉันจะได้รับเพียงแค่โชคร้ายหรือเป็นยศน้อยกว่าkการหาตำแหน่งของโดยเมทริกซ์สามารถทำได้ในเวลา อย่างไรก็ตามหากเมทริกซ์แบบสุ่มที่ฉันคูณคูณนั้นหนาแน่นการ mutiplication ต้องใช้kkk1kAkknO(k2n)AO(kn2)เวลา. มีเมทริกซ์กระจัดกระจายที่รักษาอันดับที่มีความน่าจะเป็นสูงหรือไม่?
Brian Borchers

ฉันไม่รู้ ฉันเห็นด้วย (และตั้งใจจะบอกเป็นนัย ๆ ) ว่าอัลกอริทึมสามารถบอกคุณได้ว่าเมทริกซ์ไม่ได้อยู่ในอันดับเต็ม มันไม่สามารถบอกคุณได้ว่าเมทริกซ์นั้นอยู่ในอันดับเต็มถ้าคุณใช้ทิศทางสุ่มทั้งหมด ความหวังของฉันก็จะเป็นได้ว่าคุณได้คำตอบสำหรับธุรกิจขนาดเล็กพอที่ 3 k=nkkn2n3
Wolfgang Bangerth

1

อีกวิธีหนึ่งที่ควรลองใช้คือการใช้ Adaptive Cross Approximation (ACA) มันเป็นอัลกอริทึมที่ได้รับความนิยมและมีการใช้งานออนไลน์มากมาย สำหรับการอ้างอิงคุณสามารถดูกระดาษต้นฉบับ:

ACA และรูปแบบต่างๆ (เช่น ACA +, การประมาณค่าข้ามผสมของ HCA) สามารถใช้ในสถานการณ์ต่าง ๆ คุณมีการคำนวณเมทริกซ์หนาแน่นทั้งหมดเป็นหนึ่งในมงคลเนื่องจากคุณจะสามารถคำนวณเศษเหลือได้อย่างถูกต้องหากจำเป็น

ถ้าเหลือความรู้เกี่ยวกับพฤติกรรม (ดูอัลกอริทึม) เพียงพอฉันเชื่อว่าความซับซ้อนของคุณจะเป็นโดยที่คือขนาดของเมทริกซ์จตุรัสและเป็นอันดับ ทราบว่าตำแหน่งเป็นหน้าที่ของความอดทนตัดกำหนด\ในขณะที่แน่นอนและรับประกันขอบเขตข้อผิดพลาดจะต้อง2r)O(Nr)Nr(ϵ)rϵO(N2r)


0

สำหรับกรณีง่าย ๆ ที่เมทริกซ์นั้นเป็นสมการบวกแน่นอนได้คำนวณค่าลักษณะเฉพาะที่ใหญ่ที่สุด 20 ค่าแล้วดูว่าพวกมันหรือเปรียบเทียบบรรทัดฐานหรือไม่ ARPACK รวดเร็วสำหรับสิ่งนี้; ที่สำคัญยิ่งไปกว่านั้นต้องการเพียงฟังก์ชั่นx ดังนั้นสำหรับทั่วไปดูที่ค่าลักษณะเฉพาะของ (ในฐานะ LinOp โดยไม่ต้องทำให้เป็นต้นฉบับ)A0xAxAATA

scipy.sparse.linalg.svds ทำสิ่งนี้: LinOp Arpack สำหรับทุกขนาด:(ATA)A

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.