Determinantit, käänteismatriisit ja transpoosit
Laske matriisien determinantit np.linalg.det-funktiolla, käänteismatriisit np.linalg.inv-funktiolla ja transpoosit .T-attribuutilla.
Determinantit, käänteismatriisit ja transpoosit on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Matriisin transpoosi
Matriisin transpoosissa matriisi käännetään lävistäjänsä suhteen: riveistä tulee sarakkeita ja sarakkeista rivejä. Jos A:n muoto on (m, n), niin A.T:n muoto on (n, m). Transpooseja käytetään kaikkialla lineaarialgebrassa, esimerkiksi kovarianssimatriisien laskennassa, gradientin takaisinlevityksen toteutuksessa sekä rivi- ja sarakevektorikäytäntöjen välillä muunnettaessa. NumPyssa transpoosi saadaan .T-attribuutilla – kopiota ei luoda, vaan kyseessä on uudelleenjärjestetyillä stride-arvoilla varustettu näkymä.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
print('A shape:', A.shape) # (2, 3)
print('A.T shape:', A.T.shape) # (3, 2)
print(A.T)Transpoosi käytännössä
Yleinen toimintamalli on laskea A.T @ A, jolloin tuloksena saadaan symmetrinen neliömatriisi, jota käytetään pienimmän neliösumman regressiossa, PCA:ssa ja normaal yhtälöissä. Jos A:n muoto on (n, p), niin A.T @ A:n muoto on (p, p). Tulos on aina symmetrinen, koska (A.T @ A)[i,j] == (A.T @ A)[j,i]. Monet numeeriset ratkaisumenetelmät hyödyntävät tätä ominaisuutta tehostaakseen laskentaa.
import numpy as np
A = np.array([[1.0, 2.0],
[3.0, 4.0],
[5.0, 6.0]]) # shape (3, 2)
ATA = A.T @ A # shape (2, 2), symmetric
print('A.T @ A:')
print(ATA)
print('Is symmetric:', np.allclose(ATA, ATA.T))Determinantti: mitä se tarkoittaa
Neliömatriisin determinantti on skalaariluku, joka sisältää geometrista tietoa: se ilmaisee kertoimen, jolla matriisi skaalaa pinta-aloja (kaksiulotteisessa tapauksessa) tai tilavuuksia (korkeammissa dimensioissa). Nollan determinantti tarkoittaa, että matriisi on singulaarinen – se supistaa avaruuden alemman dimension aliavaruudeksi eikä sillä ole käänteismatriisia. Nollasta poikkeava determinantti takaa, että matriisi on kääntyvä. NumPy laskee determinantit komennolla np.linalg.det().
import numpy as np
# Non-singular matrix
A = np.array([[3.0, 1.0],
[2.0, 4.0]])
print('det(A):', np.linalg.det(A)) # 3*4 - 1*2 = 10
# Singular matrix (row 2 = 2 * row 1)
B = np.array([[1.0, 2.0],
[2.0, 4.0]])
print('det(B):', np.linalg.det(B)) # ~0Käänteismatriisin laskeminen komennolla np.linalg.inv()
Matriisin A käänteismatriisi, joka merkitään A⁻¹, toteuttaa ehdon A @ A⁻¹ = I, jossa I on identiteettimatriisi. Käänteismatriisi on olemassa vain neliömatriiseille, jotka eivät ole singulaarisia. np.linalg.inv(A) laskee käänteismatriisin numeerisesti. Käytännössä käänteismatriisia kannattaa harvoin laskea suoraan, koska se on numeerisesti epävakaa; käyttäkää yhtälöryhmiin mieluummin komentoa np.linalg.solve(). Käänteismatriisien käsitteellinen ymmärtäminen on kuitenkin olennaista.
import numpy as np
A = np.array([[3.0, 1.0],
[2.0, 4.0]])
A_inv = np.linalg.inv(A)
print('Inverse:')
print(A_inv)
# Verify: A @ A_inv should be identity
I = A @ A_inv
print('A @ A_inv (should be I):')
print(np.round(I, 10))Suoran käänteislaskennan numeerinen epävakaus
Matriisin käänteismatriisin laskeminen ja sen jälkeen kertominen aiheuttaa liukulukuvirheitä, jotka kasaantuvat. Esimerkiksi A_inv @ b antaa epätarkemman tuloksen kuin kutsu np.linalg.solve(A, b) suoraan. Hyvin ehdollistettu matriisi (jonka determinantti poikkeaa selvästi nollasta) on vähemmän herkkä näille virheille. Ehtoluku (np.linalg.cond(A)) mittaa, kuinka lähellä matriisi on singulaarisuutta – suuret ehtoluvut ovat merkki numeerisista ongelmista.
import numpy as np
A = np.array([[1.0, 2.0],
[1.0001, 2.0]])
print('Condition number:', np.linalg.cond(A))
# Very high condition number -> near-singular, unstable inversion
b = np.array([3.0, 3.0001])
# Prefer solve over inv @ b
print('Solution via solve:', np.linalg.solve(A, b))Ortogonaaliset matriisit ja niiden transpoosit
Ortogonaaliset matriisit ovat matriisien erityinen luokka, jossa A.T @ A = I. Tämä tarkoittaa, että transpoosi ON käänteismatriisi, joten ortogonaalisten matriisien kääntäminen on erittäin edullista. Kiertomatriisit ja QR-hajotelman Q-tekijä ovat ortogonaalisia. Ortogonaalisen matriisin sarakkeet muodostavat ortonormaalin kannan – jokaisen sarakkeen pituus on yksi ja se on kohtisuorassa kaikkia muita sarakkeita vastaan.
import numpy as np
# 90-degree rotation matrix is orthogonal
theta = np.pi / 2
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
print('R.T @ R (should be identity):')
print(np.round(R.T @ R, 10))
print('Is orthogonal:', np.allclose(R.T @ R, np.eye(2)))Epäneliömatriisien pseudokäänteismatriisi
Tavallinen käänteismatriisi on olemassa vain neliömatriiseille, mutta Moore–Penrosen pseudokäänteismatriisi yleistää kääntämisen koskemaan mitä tahansa matriisia. np.linalg.pinv(A) laskee sen SVD:n avulla. Se muodostaa ylimääräisesti määritettyjen yhtälöryhmien (tuntemattomia enemmän yhtälöitä) pienimmän neliösumman ratkaisun perustan, ja juuri tämän lineaarinen regressio ratkaisee. Jos A on neliömatriisi ja kääntyvä, pinv(A) on sama kuin inv(A).
import numpy as np
# Over-determined system: 3 equations, 2 unknowns
A = np.array([[1.0, 1.0],
[1.0, 2.0],
[1.0, 3.0]])
b = np.array([2.0, 3.0, 5.0])
# Least-squares solution using pseudo-inverse
x = np.linalg.pinv(A) @ b
print('Best-fit solution:', x)
# Or use lstsq directly
x2, _, _, _ = np.linalg.lstsq(A, b, rcond=None)
print('lstsq solution:', x2)Determinantin merkki ja tilavuuden skaalaus
Determinantin merkki ilmaisee, säilyttääkö vai kääntääkö muunnos suunnan. Positiivinen determinantti tarkoittaa, että suunta säilyy (kuten kierrossa); negatiivinen determinantti tarkoittaa, että suunta kääntyy (kuten peilauksessa). Itseisarvo kertoo tilavuuden skaalauskertoimen. 2×2-matriisille [[a,b],[c,d]] pätee det = a*d - b*c. NumPy käsittelee tehokkaasti kaikenkokoisia neliömatriiseja.
import numpy as np
# Identity: det = 1 (no scaling, no flip)
I = np.eye(3)
print('det(I):', np.linalg.det(I)) # 1.0
# Scaling by 2 in all directions: det = 8 = 2^3
S = 2 * np.eye(3)
print('det(2I):', np.linalg.det(S)) # 8.0
# Reflection: det = -1
F = np.array([[-1.0, 0.0],
[ 0.0, 1.0]])
print('det(reflection):', np.linalg.det(F))Vakauden parantaminen komennolla np.linalg.slogdet()
Suurilla matriiseilla determinantti voi kasvaa yli esitettävän arvon tai alivuotaa nollaksi, vaikka matriisi ei olisi singulaarinen. np.linalg.slogdet(A) palauttaa arvon (sign, log_abs_det) – merkin ja determinantin itseisarvon luonnollisen logaritmin – mikä estää numeerisen ylivuodon. Tätä käytetään laajasti probabilistisissa malleissa (Gaussin uskottavuuksissa), joissa luvuilla lasketaan logaritmiavaruudessa niiden hallittavan koon säilyttämiseksi.
import numpy as np
A = np.random.rand(100, 100)
# Direct det might underflow for large matrices
sign, logdet = np.linalg.slogdet(A)
print('Sign:', sign)
print('Log|det|:', logdet)
print('Actual det (may be ~0 due to float):', np.linalg.det(A))
print('Reconstructed |det|:', np.exp(logdet))Käytännössä: 2×2-matriisin ratkaiseminen käsin ja NumPylla
2×2-matriisille [[a, b], [c, d]] käänteismatriisi on (1/det) * [[d, -b], [-c, a]], missä det = ad - bc. Tämän kaavan tunteminen auttaa tarkistamaan NumPyn tuloksen pistokokeella. Tätä suurempien matriisien käänteismatriisin analyyttinen laskeminen on epäkäytännöllistä – juuri siksi käytämme komentoa np.linalg.inv(). Varmistakaa numeeriset tulokset aina komennolla np.allclose(A @ A_inv, np.eye(n)).
import numpy as np
a, b, c, d = 3.0, 1.0, 2.0, 4.0
A = np.array([[a, b], [c, d]])
det = a*d - b*c
# Manual inverse
A_inv_manual = (1/det) * np.array([[d, -b], [-c, a]])
print('Manual inv:')
print(A_inv_manual)
# NumPy inverse
print('np.linalg.inv:')
print(np.linalg.inv(A))
print('Match:', np.allclose(A_inv_manual, np.linalg.inv(A)))Transpoosin ja käänteismatriisin yhdistäminen putkissa
Lineaarialgebrassa yleinen toimintamalli yhdistää transpoosin ja käänteismatriisin: (A.T @ A)⁻¹ @ A.T antaa tavallisessa pienimmän neliösumman menetelmässä käytettävän projektiomatriisin. NumPyssa tämän voi kirjoittaa muodossa np.linalg.inv(A.T @ A) @ A.T, mutta jälleen kerran np.linalg.lstsq on numeerisesti suositeltavampi. Taustalla olevan rakenteen tunteminen auttaa ymmärtämään ratkaisumenetelmän toimintaa ja selvittämään ongelmia, kun matriisit ovat lähes singulaarisia.
import numpy as np
# Design matrix for simple linear regression (with bias)
X = np.column_stack([np.ones(5), np.array([1., 2., 3., 4., 5.])])
y = np.array([2.1, 3.9, 6.2, 8.1, 9.8])
# OLS via normal equations: beta = (X.T @ X)^-1 @ X.T @ y
beta = np.linalg.inv(X.T @ X) @ X.T @ y
print('Coefficients (intercept, slope):', np.round(beta, 3))
# Verify with lstsq
beta2, _, _, _ = np.linalg.lstsq(X, y, rcond=None)
print('lstsq result:', np.round(beta2, 3))Pikatesti
Testatkaa, miten hyvin ymmärrätte tämän oppitunnin data-analyysin käsitteet.
Oppitunnin yhteenveto
Tässä oppitunnissa opitte, että A.T on rivit ja sarakkeet vaihtava transpoosi, np.linalg.inv() laskee matriisin käänteismatriisin, mutta sitä tulisi käyttää suoraan vain harvoin (käyttäkää mieluummin solve- tai lstsq-menetelmää), ja np.linalg.det() palauttaa determinantin, joka on singulaarisille matriiseille nolla. Seuraavaksi tutustumme lineaaristen yhtälöryhmien suoraan ratkaisemiseen komennolla np.linalg.solve.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Determinantit, käänteismatriisit ja transpoosit” ilmainen?
Kyllä – oppitunnin ”Determinantit, käänteismatriisit ja transpoosit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Determinantit, käänteismatriisit ja transpoosit”?
Laske matriisien determinantit np.linalg.det-funktiolla, käänteismatriisit np.linalg.inv-funktiolla ja transpoosit .T-attribuutilla. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Determinantit, käänteismatriisit ja transpoosit”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?
Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Matriisikertolasku np.matmulilla ja @-operaattorilla
- Determinantit, käänteismatriisit ja transpoosit
- Lineaaristen yhtälöryhmien ratkaiseminen
- Ominaisarvot ja SVD:n yleiskatsaus