ทำความเข้าใจว่า Numpy ทำ SVD อย่างไร


13

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

เท่าที่ฉันรู้ฟังก์ชั่น linalg.svd ใช้อัลกอริทึม QR เพื่อคำนวณค่าลักษณะเฉพาะของเมทริกซ์ของฉัน ฉันรู้ว่ามันใช้งานได้อย่างไรในทางคณิตศาสตร์ แต่ฉันไม่รู้ว่า Numpy สามารถจัดการได้อย่างรวดเร็วและไม่สูญเสียความแม่นยำมากนัก

ดังนั้นคำถามของฉัน: ฟังก์ชั่น numpy.svd ทำงานอย่างไรและโดยเฉพาะเจาะจงมากขึ้นมันทำงานได้อย่างรวดเร็วและแม่นยำอย่างไร (เทียบกับการกำจัดแบบเกาส์เซียน)


2
numpy ใช้ชุดคำสั่ง Lapack dgesddสำหรับค่าSVD ที่แท้จริง ดังนั้นคำถามที่แท้จริงของคุณน่าจะเป็น "Lapack dgesdd ทำงานอย่างไร" และนั่นเป็นหัวข้อที่ค่อนข้างสวยสำหรับ stackoverflow
talonmies

หากคุณอยากรู้อยากเห็นจริงๆฉันขอแนะนำให้ตรวจสอบแหล่ง LAPACK

ขอบคุณสำหรับความคิดเห็นของคุณและคำขอโทษของฉันฉัน offtopic
RobVerheyen

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

ฉันขอโทษฉันไม่ได้ตระหนักถึงโปรโตคอล ฉันหวังว่าฉันจะยังคงได้รับคำตอบ
RobVerheyen

คำตอบ:


15

คำถามของคุณมีปัญหามากมาย

อย่าใช้การกำจัดแบบเกาส์ (การแยกตัวประกอบแบบ LU) เพื่อคำนวณอันดับตัวเลขของเมทริกซ์ การแยกตัวประกอบ LU ไม่น่าเชื่อถือสำหรับจุดประสงค์นี้ในการคำนวณเลขทศนิยม ให้ใช้การย่อยสลาย QR ที่มีอันดับ (เช่นxGEQPXหรือxGEPQYใน LAPACK โดยที่ x คือ C, D, S หรือ Z แม้ว่ากิจวัตรเหล่านั้นจะยากต่อการติดตามดูที่คำตอบของ JedBrown สำหรับคำถามที่เกี่ยวข้อง ) หรือใช้ SVD (การสลายตัวของค่าเอกฐานเช่นxGESDDหรือxGESVDโดยที่ x คือ C, D, S หรือ Z อีกครั้ง) SVD เป็นอัลกอริทึมที่แม่นยำและเชื่อถือได้มากขึ้นสำหรับการกำหนดตำแหน่งตัวเลข แต่ต้องใช้การดำเนินการจุดลอยตัวมากขึ้น

อย่างไรก็ตามสำหรับการแก้ระบบเชิงเส้นนั้นการแยกตัวประกอบ LU (ด้วยการหมุนบางส่วนซึ่งเป็นการนำมาตรฐานไปใช้ใน LAPACK) มีความน่าเชื่อถืออย่างมากในทางปฏิบัติ มีบางกรณีทางพยาธิวิทยาที่ LU แยกตัวประกอบด้วยการหมุนบางส่วนไม่เสถียร (ดูการบรรยายที่ 22 ในพีชคณิตเชิงเส้นเชิงตัวเลขโดย Trefethen และ Bau ​​สำหรับรายละเอียด) การแยกตัวประกอบ QR เป็นอัลกอริธึมเชิงตัวเลขที่มีเสถียรภาพมากขึ้นสำหรับการแก้ระบบเชิงเส้นซึ่งอาจเป็นสาเหตุที่ทำให้คุณได้ผลลัพธ์ที่แม่นยำเช่นนั้น อย่างไรก็ตามมันต้องใช้การดำเนินการจุดลอยตัวมากกว่าตัวประกอบ LU โดยปัจจัย 2 สำหรับเมทริกซ์จตุรัส (ฉันเชื่อว่า JackPoulson อาจแก้ไขตัวฉันได้) สำหรับระบบสี่เหลี่ยมผืนผ้านั้นการแยกตัวประกอบ QR เป็นทางเลือกที่ดีกว่าเพราะมันจะให้ผลเฉลยน้อยที่สุดกับระบบเชิงเส้นที่บั่นทอน SVD ยังสามารถใช้ในการแก้ปัญหาระบบเชิงเส้น แต่จะมีราคาแพงกว่าตัวประกอบแบบ QR

janneb ถูกต้องที่ numpy.linalg.svd เป็น wrapper รอบ ๆxGESDDใน LAPACK การย่อยสลายค่าเอกพจน์ดำเนินการในสองขั้นตอน อันดับแรกเมทริกซ์ที่จะย่อยสลายจะลดลงเป็นรูปแบบสองเหลี่ยม อัลกอริทึมที่ใช้ในการลดรูปแบบสองเหลี่ยมใน LAPACK อาจเป็นอัลกอริทึม Lawson-Hanson-Chan และใช้การแยกตัวประกอบ QR ในจุดเดียว การบรรยายครั้งที่ 31 ในพีชคณิตเชิงเส้นเชิงตัวเลขโดย Trefethen และ Bau ​​ให้ภาพรวมของกระบวนการนี้ จากนั้นxGESDDใช้อัลกอริทึมหารและพิชิตในการคำนวณค่าเอกพจน์และเวกเตอร์เอกพจน์ซ้ายและขวาจากเมทริกซ์ bidiagonal ในการรับพื้นหลังในขั้นตอนนี้คุณจะต้องปรึกษาการคำนวณเมทริกซ์โดย Golub และ Van Loan หรือพีชคณิตเชิงเส้นเชิงตัวเลขประยุกต์โดย Jim Demmel

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


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

คุณจะแนะนำอะไรแทน
Geoff Oxberry

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

ฉันอาจเพิ่มว่าเมทริกซ์ที่ฉันกำลังแก้ไขนั้นเป็นเอกพจน์จริง ๆ ในความเป็นจริงอันดับของเมทริกซ์นั้นมีขนาดเพียงครึ่งเดียวของขนาดของเมทริกซ์ บางทีนี่อาจทำให้วิธีการบางอย่างเป็นที่นิยมมากกว่า
RobVerheyen

1
@RobVerheyen: QR จะช้ากว่า LU แต่จะมีความแม่นยำมากกว่า SVD จะช้ากว่า QR แต่ SVD นั้นถือว่าเป็นวิธีที่เชื่อถือได้มากที่สุดในการกำหนดระดับตัวเลข (เช่น MATLAB ใช้ SVD ในการrankทำงาน) นอกจากนี้ยังใช้ดุลยพินิจเล็กน้อยเมื่อใช้วิธีการใดวิธีการหนึ่ง ในวิธี SVD ลำดับตัวเลขคือจำนวนของค่าเอกพจน์เหนือ cutoff ที่ระบุ (มักจะเล็กมาก) (วิธี QR นั้นคล้ายกัน แต่แทนที่ค่าเอกพจน์ด้วยรายการแนวทแยงของเมทริกซ์ R)
Geoff Oxberry

8

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

  1. UAVAAB:=UAHAVAUAVABO(n3)
  2. {UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. UABVAH=AA=(UAUB)Σ(VAVB)HUAVAUBVBO(n3)

7

numpy.linalg.svd เป็น wrapper รอบ {Z, D} GESDD จาก LAPACK ในทางกลับกัน LAPACK นั้นถูกเขียนขึ้นอย่างพิถีพิถันโดยผู้เชี่ยวชาญชั้นนำของโลกบางคนเกี่ยวกับพีชคณิตเชิงเส้นเชิงตัวเลข แน่นอนว่ามันน่าประหลาดใจมากถ้ามีคนที่ไม่คุ้นเคยกับสนามจะประสบความสำเร็จในการเอาชนะ LAPACK (ไม่ว่าจะด้วยความเร็วหรือความแม่นยำ)

สำหรับเหตุผลที่ QR นั้นดีกว่าการกำจัดแบบเกาส์เซียนนั่นน่าจะเหมาะสมกว่าสำหรับ/scicomp//


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