Anladığım kadarıyla numpy.linalg.lstsq , LAPACK rutin dgelsd'sine dayanıyor .
Sorun şu:
minimize(overx)∥Ax−b∥2
Tabii ki, bunun derecesi vektörünün uzunluğundan daha az olan A matrisi için benzersiz bir çözümü yoktur . Belirsiz bir sistem söz konusu olduğunda, bir çözüm sağlar :bzdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 karşılayan tüm için . (yani , belirlenmemiş sistem için minimum norm çözümüdür.xAx=bz
Örneğin, sistem , numpy.linalg.lstsq .x+y=1x=.5,y=.5
Dgelsd nasıl çalışır?
Rutin , A'nın tekil değer ayrışmasını (SVD) dgelsd
hesaplar .
Doğrusal bir sistemi çözmek için bir SVD kullanmanın arkasındaki fikri çizeceğim. Tekil değer ayrışımı bir çarpanlara olan burada ve dik matrisler ve köşegen girişleri tekil değerler olarak bilinen bir köşegenel matristir.UΣV′=AUVΣ
matrisinin etkili sırası , etkin bir şekilde sıfır olmayan tekil değerlerin sayısı olacaktır (yani, makine hassasiyetine göre sıfırdan yeterince farklıdır ...). sıfır olmayan tekil değerlerin köşegen matrisi olsun . SVD böylece:AS
A=U[S000]V′
Yalancı ters bir ile verilir:A
A†=V[S−1000]U′
çözümünü düşünün . Sonra:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Burada temelde iki vaka var:
- Sıfır olmayan tekil değerlerin (yani matris boyutu ) sayısı uzunluğundan daha azdır . Buradaki çözüm kesin olmayacak; lineer sistemi en küçük kareler anlamında çözeceğiz.Ib
- Ax−b=0
Bu son bölüm biraz zor ... matris boyutlarını takip etmek ve dikey bir matris olduğunu kullanmak gerekiyor .U
Yalancı tersin denkliği
Ne zaman doğrusal bağımsız satır vardır (örneğin, bir yağ matrisi vardır.), O zaman:
AA†=A′(AA′)−1
Belirsiz bir sistem için, sahte tersin size minimum norm çözümünü verdiğini gösterebilirsiniz.
Ne zaman doğrusal bağımsız sütun vardır (örneğin, bir zayıf matris vardır.), O zaman:
AA†=(A′A)−1A′