Pandas & NumPy Academy · Oppitunti

Determinantit, käänteismatriisit ja transpoosit

Laske matriisien determinantit np.linalg.det-funktiolla, käänteismatriisit np.linalg.inv-funktiolla ja transpoosit .T-attribuutilla.

Oppitunti 2/413 vaihetta

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))   # ~0

Kää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.

Aloita maksutta

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

  1. Matriisikertolasku np.matmulilla ja @-operaattorilla
  2. Determinantit, käänteismatriisit ja transpoosit
  3. Lineaaristen yhtälöryhmien ratkaiseminen
  4. Ominaisarvot ja SVD:n yleiskatsaus
← Takaisin: Pandas & NumPy Academy