ความเข้าใจของฉันอยู่ที่numpy.linalg.lstsqอาศัยLAPACKประจำdgelsd
ปัญหาคือการแก้ปัญหา:
minimize(overx)∥Ax−b∥2
ของหลักสูตรนี้ไม่ได้มีที่ไม่ซ้ำกันโซลูชั่นสำหรับเมทริกซ์ที่มียศน้อยกว่าความยาวของเวกเตอร์{ข} ในกรณีของระบบที่ไม่ได้ระบุให้จัดเตรียมโซลูชันเช่นนั้น:bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2สำหรับทุกที่ตอบสนอง{ข} (ieเป็นวิธีแก้ปัญหาบรรทัดฐานขั้นต่ำสำหรับระบบที่ไม่ได้ระบุxAx=bz
ตัวอย่างเช่นถ้าระบบเป็น , numpy.linalg.lstsq จะกลับมา0.5x+y=1x=.5,y=.5
dgelsd ทำงานอย่างไร
รูทีนdgelsd
คำนวณการแยกค่าเอกเทศ (SVD) ของ A
ฉันจะวาดภาพความคิดเบื้องหลังการใช้ SVD เพื่อแก้ปัญหาระบบเชิงเส้น การสลายตัวของค่าเอกพจน์คือการแยกตัวประกอบโดยที่และเป็นเมทริกซ์มุมฉากและเป็นเมทริกซ์แนวทแยงมุมUΣV′=AUVΣ
ยศที่มีประสิทธิภาพของเมทริกซ์จะเป็นจำนวนค่าเอกพจน์ที่มีประสิทธิภาพไม่เป็นศูนย์ (เช่นมีความแตกต่างจากศูนย์ที่สัมพันธ์กับความแม่นยำของเครื่องจักร ฯลฯ ... ) ให้เป็นเมทริกซ์แนวทแยงของค่าเอกพจน์ที่ไม่เป็นศูนย์ SVD จึงเป็น:AS
A=U[S000]V′
หลอกผกผันของจะได้รับโดย:A
A†=V[S−1000]U′
พิจารณาแก้ปัญหา{ข} แล้ว:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
โดยทั่วไปมีสองกรณีที่นี่:
- จำนวนไม่ใช่ศูนย์ค่าเอกพจน์ (เช่นขนาดของเมทริกซ์ ) น้อยกว่าความยาวของ{ข} ทางออกที่นี่จะไม่แน่นอน เราจะแก้ระบบเชิงเส้นอย่างน้อยกำลังสองIb
- Ax−b=0
ส่วนสุดท้ายนี้ค่อนข้างยุ่งยาก ... จำเป็นต้องติดตามมิติของเมทริกซ์และใช้นั้นเป็นเมทริกซ์มุมฉากU
ความเท่าเทียมของหลอกผกผัน
เมื่อมีแถวที่เป็นเส้นตรงอิสระ (เช่นเรามีเมทริกซ์แบบไขมัน) ดังนั้น:
AA†=A′(AA′)−1
สำหรับระบบที่ไม่บึกบึนคุณสามารถแสดงให้เห็นว่าระบบหลอกหลอกจะให้วิธีแก้ปัญหาเชิงบรรทัดฐานขั้นต่ำแก่คุณ
เมื่อมีคอลัมน์อิสระเชิงเส้นตรง (เช่นเรามีเมทริกซ์ผอม) ดังนั้น:
AA†=(A′A)−1A′