Pemahaman saya adalah bahwa numpy.linalg.lstsq bergantung pada dgelsd rutin LAPACK .
Masalahnya adalah untuk menyelesaikan:
minimize(overx)∥Ax−b∥2
Tentu saja, ini tidak memiliki solusi unik untuk matriks A yang peringkatnya kurang dari panjang vektor . Dalam kasus sistem yang tidak ditentukan, solusi sedemikian rupa sehingga:bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 untuk semua yang memenuhi . (yaitu adalah solusi norma minimum untuk sistem yang tidak ditentukan.xAx=bz
Contoh, jika sistem , numpy.linalg.lstsq akan mengembalikan .x+y=1x=.5,y=.5
Bagaimana cara kerja dgelsd?
Rutin dgelsd
menghitung dekomposisi nilai singular (SVD) dari A.
Saya hanya akan membuat sketsa ide di balik menggunakan SVD untuk menyelesaikan sistem linear. Dekomposisi nilai singular adalah faktorisasi mana dan adalah matriks ortogonal dan adalah matriks diagonal di mana entri diagonal dikenal sebagai nilai singular.UΣV′=AUVΣ
Peringkat efektif matriks adalah jumlah nilai singular yang secara efektif bukan nol (yaitu cukup berbeda dari nol relatif terhadap presisi mesin dll ...). Biarkan menjadi matriks diagonal dari nilai singular non-nol. SVD demikian:AS
A=U[S000]V′
The pseudo-inverse dari diberikan oleh:A
A†=V[S−1000]U′
Pertimbangkan solusinya . Kemudian:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Pada dasarnya ada dua kasus di sini:
- Jumlah nilai singular non-nol (yaitu ukuran matriks ) kurang dari panjang . Solusi di sini tidak akan tepat; kami akan memecahkan sistem linear dalam arti kuadrat terkecil.Ib
- Ax−b=0
Bagian terakhir ini agak sulit ... perlu melacak dimensi matriks dan menggunakan bahwa adalah matriks ortogonal.U
Kesetaraan dari invers semu
Ketika memiliki baris bebas linear, (mis. Kami memiliki matriks gemuk), maka:
AA†=A′(AA′)−1
Untuk sistem yang tidak ditentukan, Anda dapat menunjukkan bahwa invers semu memberi Anda solusi norma minimum.
Ketika memiliki kolom yang bebas linear, (mis. Kami memiliki matriks kurus), maka:
AA†=(A′A)−1A′