A 3.2. Mátrixszorzás és affín réteg affin rétege alakú batchelt leképezést definiált: , , és a bias sorirányban broadcastolódik. Ha ezt a réteget egy regressziós baseline-ként használjuk, akkor adott bemenetekhez egy valós célértéket szeretnénk közelíteni. Tekintsük az tervező- vagy adatmátrixot, amelynek egy sora egy megfigyelés jellemzőjét tartalmazza, és a célvektort. Az lineáris egyenletrendszer általában túlhatározott, ha : nincs olyan , amely minden egyenletet egyszerre kielégítene. A legkisebb négyzetes módszer azt az -et keresi, amelyre a hiba négyzetösszege minimális.
Induló becslés: ha két oszlopa majdnem párhuzamos, akkor a két megfelelő együtthatót nehéz külön-külön azonosítani, még akkor is, ha az előrejelzés összességében jól illeszkedik. Miért? Ezt a vetítés és a kondicionáltság fogalma teszi pontossá.
A 2.3. Izolált környezet, notebook és verzió
környezeti szerződését itt is használjuk: a labor kódja CPU-n fut,
float64 adattípusú, nem használ véletlent, ezért seedre
nincs szükség; az ellenőrzés toleranciás allclose
összehasonlítás.
Definíció 1 (reziduum). Legyen , , . Az együtthatóvektorhoz tartozó reziduumvektor
a négyzetes hiba pedig
A vektor altérre vett ortogonális vetülete az a , amelyre minimális. Mivel minden valamilyen -re, a legkisebb négyzetes megoldás a vetület -koordinátáját adja meg.
Lemma 2 (ortogonalitási kritérium). Az pontosan akkor minimalizálja -et, ha merőleges minden elemére, azaz .
Bizonyítás. Legyen . Ha minimális távolságú pont -ban, akkor bármely és esetén a
függvénynek -ban minimuma van, ahol . A -beli derivált , tehát minden -ra. Ez éppen azt jelenti, hogy merőleges minden elemére, speciálisan minden oszlopára, ami vektoralakban . Megfordítva, ha , akkor bármely mellett , ezért
tehát valóban minimális távolságú pont. ■
A lemma két iránya együtt adja a híres normálegyenletet: mivel oszlopai generálják -t, a merőlegesség ekvivalens azzal, hogy
A fenti átalakítás már megadja a levezetési kötelezettség első felét. A megoldhatóság és az egyértelműség kérdéséhez a Gram-mátrix invertálhatóságát kell ellenőrizni.
Tétel 3 (normálegyenlet, teljes oszloprang esetén). Legyen teljes oszloprangú, azaz . Ekkor:
Bizonyítás. Elsőként igazoljuk (1)-et. A Gram-mátrix nyilván szimmetrikus: . Legyen . Ekkor
tehát pozitív szemidefinit. Ha , akkor , így . A teljes oszloprang feltétel szerint magtere csak a nullvektort tartalmazza, ezért . Ez azt jelenti, hogy minden esetén, vagyis a mátrix pozitív definit. Pozitív definit mátrix invertálható.
A (2) állításhoz a 2. lemma szerint pontosan akkor minimalizáló, ha kielégíti az normálegyenletet. Az (1) pont miatt az együtthatómátrix invertálható, tehát a normálegyenletnek pontosan egy megoldása van, mégpedig a fenti zárt alakú . ■
Fontos, hogy a tétel létezési és egyértelműségi állítás, nem numerikus algoritmusajánlás. Erre a gyakori tévedésnél visszatérünk.
Ha , azaz ranghiányos az adatmátrix, akkor szinguláris. A normálegyenlet továbbra is konzisztens, de végtelen sok megoldása van; mind megvalósítja ugyanazt a vetületet, az együtthatók azonban nem azonosíthatók egyértelműen. Ilyenkor a könyvtárak tipikusan azt a megoldást adják vissza, amelynek saját normája, , a legkisebb a minimalizálók között; ezt minimum-norma megoldásnak nevezzük.
Egy valós regressziós baseline-ban a bias-t úgy kezeljük, hogy a tervezőmátrix első oszlopát konstans értékekkel bővítjük. Ekkor az modell affin a további jellemzőkben, összhangban a 3.2. Mátrixszorzás és affín réteg alfejezetben bevezetett affin réteg fogalmával.
Egy mátrix numerikus viselkedését a kondíciószám jellemzi. Teljes oszloprangú esetén az pozitív definit mátrix sajátértékei pozitívak; jelölje a legnagyobb, a legkisebb sajátértéket. A mátrix 2-es kondíciószáma
Az kondíciószámát ebből úgy kapjuk, hogy
A pontos szingulárisérték-felbontásos hátteret a 3.4. Sajátérték, SVD és spektrális határ egységben építjük fel; itt elegendő az az intuíció, hogy az operátor által okozott maximális és minimális nyújtás aránya. Közel kollineáris oszlopoknál van egy irány, amelyben a leképezés csak nagyon gyengén nyújt, ezért a kondíciószám nagy.
A normálegyenletes megoldás szempontjából döntő összefüggés:
Ez abból következik, hogy sajátértékei a szinguláris értékek négyzetei; a pontos levezetés az SVD-s egységben szerepel, itt numerikus következményként használjuk. Ha nagy, akkor kondíciószáma a négyzetével nagyobb, ezért az explicit inverzzel történő megoldás sokkal érzékenyebb a kerekítési hibákra, mint a közvetlen, QR- vagy SVD-alapú eljárás.
Legyen
Ekkor , , és oszlopai függetlenek. A normálegyenlet mátrixa és jobb oldala
A -es mátrix determinánsa , inverze , így
Ezzel , tehát a reziduum nulla: a célvektor a képtérben van, és a vetítés önmaga.
Ranghiányos ellenpéldaként vegyük az
mátrixot. Itt a második oszlop az első kétszerese, tehát . A normálegyenlet
ami az egyetlen független feltételre redukálódik. Az összes megoldás alakú. A legkisebb normájú megoldás a feltétel mellett a minimuma. A Lagrange-módszerrel vagy geometriailag ez a , amelyre , tehát a reziduum itt is nulla. A két példa különbsége: az elsőben az együtthatók egyértelműek, a másodikban a predikció egyértelmű, de az együtthatók nem.
lstsqA cél annak megmutatása, hogy a normálegyenlet elméleti helyességéből nem következik az explicit inverz numerikus jósága. Válasszunk megfigyelést és jellemzőt:
Írjuk fel a pontos legkisebb négyzetes referenciafeladatot: legyen , és a célvektor
ahol merőleges mindkét oszlopára, ezért , és a legkisebb négyzetes megoldás pontosan marad. A megfelelő ; a pontos reziduum , négyzetes hibája .
A labor munkakönyvtára lab/n011_lstsq/, futtatási
parancsa:
python lab/n011_lstsq/n011_lstsq.py# lab/n011_lstsq/n011_lstsq.py
# Input: nincs külső adat; CPU, float64, seed nem szükséges.
import numpy as np
EPS = 1e-5
A = np.array(
[[1.0, 1.0],
[1.0, 1.0 + EPS],
[1.0, 1.0 + 2.0 * EPS]],
dtype=np.float64,
)
x_ref = np.array([1.0, 2.0], dtype=np.float64)
delta = np.array([1.0, -2.0, 1.0], dtype=np.float64)
assert np.allclose(A.T @ delta, np.zeros(2), atol=1e-14)
b = A @ x_ref + delta
# 1) Expliciten invertált normálegyenlet.
x_explicit = np.linalg.inv(A.T @ A) @ A.T @ b
err_explicit = np.linalg.norm(x_explicit - x_ref)
# 2) Stabil, SVD-alapú megoldó.
x_lstsq, residues, rank_lstsq, _ = np.linalg.lstsq(A, b, rcond=None)
err_lstsq = np.linalg.norm(x_lstsq - x_ref)
print("x_ref =", x_ref)
print("explicit =", x_explicit, "hiba =", err_explicit)
print("lstsq =", x_lstsq, "hiba =", err_lstsq)
print("rank =", rank_lstsq, "reziduum-norma^2 =", residues[0])
print("cond(A.T A) =", np.linalg.cond(A.T @ A))
print("cond(A) =", np.linalg.cond(A))
# Elméleti kontrollok, amelyek a stabil megoldóra vonatkoznak.
assert rank_lstsq == 2
assert np.allclose(x_lstsq, x_ref, rtol=0.0, atol=2e-5)
assert np.allclose(residues[0], 6.0, rtol=1e-10, atol=1e-10)
print("Ellenőrzés: rank, x_lstsq és reziduum rendben.")A kimenet ebben a kéziratban nem futtatott; a
levezetésből származó kontrollérték
és a reziduum-norma négyzete
.
A numerikus eltérés platformfüggő, ezért a feladat az elméleti kontrollt
toleranciával ellenőrzi. A lstsq-t az elvárt,
abszolút paramétertoleranciával ellenőrizzük; az explicit normálegyenlet
hibája rendszerint nagyobb, de ennek mértéke platformfüggő. Az
illesztett predikció és a reziduum stabilabb ellenőrzési tárgy, mint a
rosszul kondicionált együtthatóvektor. A kondíciószám elméleti
közelítése kis
-ra
,
azaz
esetén mintegy
,
ami már jelentősen felerősítheti a kerekítési hibát.
A kód azt is kimutatja, hogy a rang az SVD-küszöb mellett még , tehát a mátrix matematikai értelemben teljes oszloprangú; a numerikus nehézséget nem szingularitás, hanem a nagy kondíciószám okozza.
F1 (fogalmi, nehézség 1). Legyen és . Definiálja a reziduumot és a vetületet. Magyarázza el, miért merőleges a legkisebb négyzetes megoldás reziduuma minden oszlopára, és miért nem elegendő ez a merőlegesség a ranghiányos eset egyértelműségéhez.
F2 (levezetési, nehézség 2). Alkalmazza a 3. tételt a speciális esetre, amikor egyetlen oszlopvektor. Vezesse le a normálegyenletet, adja meg az invertálhatóság feltételét, és fejezze ki -et az és vektorok skalárszorzataival.
F3 (implementációs, nehézség 2). Írjon
lab/n011_lstsq/least_squares.py fájlt, amely a
def least_squares(A: np.ndarray, b: np.ndarray) -> tuple[np.ndarray, np.ndarray, int]:
...függvényt tartalmazza. A függvény np.linalg.lstsq-t
használjon, adja vissza a megoldást, a reziduumot és a numerikus rangot.
Ellenőrizze a főszöveg
-es
példáján, hogy a visszaadott megoldás
abszolút tolerancián belül
,
a reziduum
,
a rang pedig
.
F4 (hibakeresési, nehézség 2). Valaki a következő függvényt írja:
def bad_solve(A, b):
return np.linalg.inv(A.T @ A) @ A.T @ bHol van a kettős hiba? Elemezze a ranghiányos esetet és a nagy kondíciószámú, de matematikailag teljes rangú esetet is. Adjon olyan javítást, amely mindkét hibát kezeli, és írja meg az ellenőrző tesztet.
F5 (kísérlettervezés, nehézség 3). Tervezzen kísérletet annak vizsgálatára, hogy a harmadik, a két közel kollineáris oszloptól független oszlop hozzáadása hogyan változtatja meg a legkisebb négyzetes megoldás stabilitását. Adja meg a kérdést, a generált adat sémáját, a baseline-t, a változó tényezőt, a metrikát és a következtetési korlátot. Nem szükséges futtatni; a protokollnak lektorálhatónak kell lennie.
F1. A reziduum ; a vetület ? Pontosan: a vetület az altér azon eleme, amelyre a távolság minimális. A 2. lemma bizonyítja, hogy a minimalizáló reziduum merőleges minden elemére, tehát minden oszlopára is, mert az oszlopok -t generálják. Ranghiányos esetén a merőlegesség még teljesülhet, de a normálegyenletnek végtelen sok megoldása van: az oszlopok lineáris függősége miatt több adhatja ugyanazt a -t. A reziduum tehát a predikciót jellemzi, nem az együtthatók azonosíthatóságát.
F2. Ha , akkor a normálegyenlet
Az invertálhatóság feltétele , azaz . Ilyenkor
Ez éppen a -nek az irányára vett ortogonális vetületi együtthatója. Ha , akkor minden , a vetület , és nincs egyértelmű ; a normálegyenlet alakú.
F3. Lehetséges teljes fájl:
# lab/n011_lstsq/least_squares.py
import numpy as np
def least_squares(A: np.ndarray, b: np.ndarray) -> tuple[np.ndarray, np.ndarray, int]:
if A.ndim != 2 or b.ndim != 1:
raise ValueError("A legyen 2D, b legyen 1D")
if A.shape[0] != b.shape[0]:
raise ValueError("A sorainak száma egyezzen b hosszával")
x, _, rank, _ = np.linalg.lstsq(A, b, rcond=None)
residual = b - A @ x
return x, residual, rank
if __name__ == "__main__":
EPS = 1e-5
A = np.array([[1.0, 1.0], [1.0, 1.0 + EPS], [1.0, 1.0 + 2.0 * EPS]])
x_ref = np.array([1.0, 2.0])
b = A @ x_ref + np.array([1.0, -2.0, 1.0])
x, r, rank = least_squares(A, b)
assert rank == 2
assert np.allclose(x, x_ref, rtol=0.0, atol=2e-5)
assert np.allclose(r, [1.0, -2.0, 1.0], atol=1e-8)
print("F3 kontroll: mindhárom feltétel teljesült.")Futtatás: python lab/n011_lstsq/least_squares.py. A
ranghiányos szélsőeseten, például
és
,
a visszaadott rang
,
a reziduum nulla, a megoldás pedig a minimum-norma
lesz a NumPy lstsq konvenciója szerint; ezt a
felhasználónak is tesztelnie kell.
F4. A bad_solve két hibája:
Javítás: használjon SVD- vagy QR-alapú megoldót, például
def good_solve(A, b):
x, _, rank, _ = np.linalg.lstsq(A, b, rcond=None)
if rank < A.shape[1]:
raise np.linalg.LinAlgError("ranghiányos adatmátrix")
return xEllenőrző teszt: a főszöveg közel kollineáris példáján a megoldás
hibája a referenciaértékhez képest kisebb, mint
;
a ranghiányos
példán a függvény kivételt dob, nem hallgat szingularitást. A numerikus
toleranciát a float64 és az input skálája indokolja.
F5. Egy lehetséges terv:
lstsq-val.A normálegyenlet levezetése nem teszi az explicit inverzt ajánlott
numerikus algoritmussá. A tétel azt mondja ki, hogy ha
az inverz pontosan számítható lenne, akkor a képlet pontos lenne. A
lebegőpontos számítás viszont kerekít, és eközben a
mátrix kondíciószáma
.
A labor
-es
mátrixánál
esetén ez mintegy
,
tehát az explicit normálegyenlet megoldása érezhetően érzékeny a
kerekítésre. Ugyanaz a feladat np.linalg.lstsq-val, amely
közvetlenül
-n
dolgozik, stabilabban oldható meg, mert ott a kondíciószám csak
.
Ranghiányos ellenpélda a kézi részben szerepelt: esetén a normálegyenlet mátrixa szinguláris, így az explicit inverz még egzakt aritmetikában sem létezik, holott a legkisebb négyzetes predikció tökéletesen definiált.
Ellenőrizze az alakokat: alakja , alakja , a megoldás -dimenziós, a reziduum pedig -dimenziós. Ha a feladat helyett átlagos négyzetes hibát minimalizál, a skálázás nem változtatja meg a minimalizálót. Ranghiányos esetben a predikció egyértelmű, de nem; a kettőt ne keverje össze. A nagy kondíciószám nem azonos a szingularitással: a labor mátrixa rangja , mégis instabil a normálegyenlet. Visszahívás 3.2. Mátrixszorzás és affín réteg alfejezetből: az affin réteg csak akkor lineáris, ha a bias nulla; a regressziós baseline konstans oszloppal éppen affin modellt ad.
A legkisebb négyzetes feladat a célvektor vetülete az adatmátrix
képterére. A minimalizáló reziduum merőleges a képtérre, ami az
normálegyenletet adja. Teljes oszloprang esetén
pozitív definit és invertálható, ezért a megoldás egyértelmű:
.
Ranghiányos esetben a predikció egyértelmű, az együttható nem; a
könyvtárak minimum-norma megoldást adnak. A normálegyenlet mátrixának
kondíciószáma
,
ezért közel kollineáris oszlopoknál az explicit inverz numerikusan
megbízhatatlan; a stabil lstsq közvetlenül az eredeti
mátrixon dolgozik. A kondíciószám nagy értéke nem szingularitás, hanem
érzékenységi figyelmeztetés.
A 3.4. Sajátérték, SVD és spektrális határ a sajátértékeket, a szinguláris értékeket és a spektrális határokat tárgyalja; ott a kondíciószám pontos SVD-alapú definícióját és a perturbációs korlátokat is levezetjük.