Ominaisarvot ja SVD:n yleiskatsaus
Laske ominaisarvot ja -vektorit np.linalg.eig-funktiolla ja ymmärrä, miten SVD mahdollistaa PCA-menetelmän mukaisen dimensioiden vähentämisen.
Ominaisarvot ja SVD:n yleiskatsaus on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Mitä ominaisarvot ja ominaisvektorit ovat?
Neliömatriisin A ominaisvektori on nollasta poikkeava vektori v, jolle pätee A @ v = lambda * v — kertominen matriisilla A muuttaa vain v:n mittakaavaa, ei sen suuntaa. Skalaaria lambda kutsutaan v:tä vastaavaksi ominaisarvoksi. Ominaisarvot paljastavat lineaarisen muunnoksen luontaiset ”venytyskertoimet”: ominaisarvo 2 tarkoittaa, että matriisi kaksinkertaistaa pituudet ominaisvektorin suunnassa; negatiivinen ominaisarvo kääntää suunnan.
import numpy as np
A = np.array([[3.0, 1.0],
[0.0, 2.0]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print('Eigenvalues:', eigenvalues)
print('Eigenvectors (columns):')
print(eigenvectors)Ominaisarvojen laskeminen komennolla np.linalg.eig()
np.linalg.eig(A) palauttaa tuplen (eigenvalues, eigenvectors). Ominaisarvot ovat yksiulotteinen taulukko ja ominaisvektorit ovat kaksiulotteinen taulukko, jossa kukin sarake on ominaisvektori. Reaalisymmetrisillä matriiseilla, kuten kovarianssimatriiseilla, ominaisarvot ovat aina reaalisia ja ominaisvektorit ortogonaalisia — käyttäkää symmetrisille matriiseille komentoa np.linalg.eigh(A), sillä se on nopeampi ja palauttaa varmasti reaaliset tulokset.
import numpy as np
# Symmetric matrix -> use eigh for efficiency and real eigenvalues
A = np.array([[4.0, 2.0],
[2.0, 3.0]])
vals, vecs = np.linalg.eigh(A)
print('Eigenvalues (real):', vals)
print('Eigenvectors (orthonormal columns):')
print(vecs)
# Verify: A @ v = lambda * v for each eigenvector
for i in range(len(vals)):
lhs = A @ vecs[:, i]
rhs = vals[i] * vecs[:, i]
print(f'v{i} check:', np.allclose(lhs, rhs))Ominaisarvot ja matriisin ominaisuudet
Ominaisarvot sisältävät tärkeitä tietoja matriisin ominaisuuksista. Determinantti on kaikkien ominaisarvojen tulo: det(A) = product(eigenvalues). Jälki (lävistäjäalkioiden summa) on ominaisarvojen summa: trace(A) = sum(eigenvalues). Matriisi on positiivisesti definiitti (kaikki ominaisarvot > 0) vain, jos kaikki ominaisarvot ovat positiivisia — tämä on tärkeä ominaisuus kelvollisille kovarianssimatriiseille ja konvekseille optimointiongelmille.
import numpy as np
A = np.array([[4.0, 2.0],
[2.0, 3.0]])
vals, _ = np.linalg.eigh(A)
print('Eigenvalues:', vals)
print('Product (should = det):', np.prod(vals))
print('np.linalg.det:', np.linalg.det(A))
print('Sum (should = trace):', np.sum(vals))
print('np.trace:', np.trace(A))
print('Positive definite:', np.all(vals > 0))Singulaariarvohajotelman (SVD) yleiskatsaus
Singulaariarvohajotelma (SVD) hajottaa minkä tahansa matriisin A:n, ei vain neliömatriiseja, muotoon A = U @ S @ V.T, jossa U ja V ovat ortogonaalisia matriiseja ja S on diagonaalimatriisi, jonka lävistäjällä ovat epänegatiiviset singulaariarvot. SVD on yleisin ja numeerisesti vakain matriisihajotelma. Se muodostaa PCA:n, kuvien pakkauksen, suosittelujärjestelmien ja pseudokäänteismatriisin laskennan perustan. np.linalg.svd(A) palauttaa U:n, s:n (yksiulotteiset singulaariarvot) ja Vh:n (transpoosatun V:n).
import numpy as np
A = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0]])
U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('U shape:', U.shape)
print('s (singular values):', s)
print('Vh shape:', Vh.shape)
# Reconstruct A
A_reconstructed = U @ np.diag(s) @ Vh
print('Reconstruction correct:', np.allclose(A, A_reconstructed))Singulaariarvot ja matriisin aste
Singulaariarvot (S:n lävistäjäalkiot) ovat aina epänegatiivisia, ja ne luetellaan yleensä laskevassa järjestyksessä. Nollasta poikkeavien singulaariarvojen lukumäärä on matriisin aste. Lähes nollan suuruiset singulaariarvot osoittavat, että rivit tai sarakkeet ovat lähes lineaarisesti riippuvia. Suurin singulaariarvo antaa matriisin spektrinormin, ja suurimman sekä pienimmän nollasta poikkeavan singulaariarvon suhde on numeerista vakautta mittaava kuntoluku.
import numpy as np
# Full-rank matrix
A = np.random.rand(5, 3)
U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('Singular values:', np.round(s, 4))
print('Rank (non-zero sv):', np.linalg.matrix_rank(A))
print('Condition number:', s[0] / s[-1])
# Rank-deficient matrix
B = np.array([[1.0, 2.0], [2.0, 4.0], [3.0, 6.0]])
_, sb, _ = np.linalg.svd(B, full_matrices=False)
print('Rank-deficient sv:', np.round(sb, 8))SVD ja PCA: yhteys
Pääkomponenttianalyysi (PCA) voidaan toteuttaa suoraan SVD:n avulla. Kun keskitätte datamatriisin X:n (vähennätte sarakkeiden keskiarvot), Vh:n oikeanpuoleiset singulaarivektorit ovat pääkomponentteja, ja singulaariarvojen neliöt jaettuna luvulla n-1 ovat selitettyjä variansseja. Sklearnin PCA käyttää täsmälleen tätä menetelmää. Tämän yhteyden ymmärtäminen auttaa toteuttamaan tai mukauttamaan PCA:n alusta alkaen ulottuvuuden pienentämistä varten.
import numpy as np
np.random.seed(0)
X = np.random.randn(100, 4)
# Center the data
X_centered = X - X.mean(axis=0)
# SVD-based PCA
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)
# Variance explained by each component
var_explained = (s ** 2) / (X.shape[0] - 1)
total_var = var_explained.sum()
print('Variance explained ratio:', np.round(var_explained / total_var, 3))
# Project onto top 2 principal components
X_pca = X_centered @ Vh[:2].T
print('Reduced shape:', X_pca.shape)Matala-asteinen approksimaatio SVD:n avulla
SVD mahdollistaa matala-asteisen matriisiapproksimaation: säilyttäkää vain k suurinta singulaariarvoa ja niitä vastaavat vektorit ja muodostakaa niiden avulla alkuperäisen matriisin approksimaatio. Tämä on kuvien pakkauksen ja suositteluihin käytettävän yhteistoiminnallisen suodatuksen perusta. Typistetty SVD U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :] antaa pienimmän neliösumman mielessä parhaan astetta k olevan approksimaation (Eckartin–Youngin lause).
import numpy as np
np.random.seed(1)
A = np.random.rand(20, 15)
U, s, Vh = np.linalg.svd(A, full_matrices=False)
# Rank-3 approximation
k = 3
A_approx = U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :]
error = np.linalg.norm(A - A_approx, 'fro')
total = np.linalg.norm(A, 'fro')
print(f'Approximation error: {error/total:.3f} (fraction of total)')
print(f'Top-3 singular values capture {(s[:3]**2).sum()/(s**2).sum():.1%} of variance')Ominaisarvohajotelma vai SVD: milloin kumpaakin käytetään
Käyttäkää ominaisarvohajotelmaa (np.linalg.eig tai eigh), kun käsiteltävänä on neliömäinen symmetrinen matriisi ja haluatte ymmärtää sen pääakselit — esimerkiksi PCA:n kovarianssimatriisin tai Markovin siirtymämatriisit. Käyttäkää SVD:tä (np.linalg.svd), kun matriisi ei ole neliömäinen tai tarvitsette parasta mahdollista numeerista vakautta. SVD on aina olemassa, kun taas ominaisarvohajotelma voi tuottaa kompleksilukuja epäsymmetrisille matriiseille.
import numpy as np
# Non-symmetric matrix: eigenvalues may be complex
A = np.array([[0.0, -1.0],
[1.0, 0.0]])
vals, _ = np.linalg.eig(A)
print('Eigenvalues (complex for rotation):', vals)
# SVD always gives real singular values
_, s, _ = np.linalg.svd(A)
print('Singular values (always real):', s)Symmetristen matriisien spektraalilause
Spektraalilauseen mukaan jokainen reaalinen symmetrinen matriisi A voidaan hajottaa muotoon A = Q @ diag(eigenvalues) @ Q.T, jossa Q on ortogonaalinen (Q.T = Q⁻¹). Tämä tarkoittaa, että symmetriset matriisit ovat aina diagonalisoituvia, ja niiden ominaisarvot ovat reaalisia ja ominaisvektorit ortogonaalisia. Kovarianssimatriisit, SVM-menetelmien kernelimatriisit ja optimoinnin Hessian-matriisi ovat kaikki symmetrisiä, joten tämä lause on erittäin hyödyllinen koneoppimisen teoriassa.
import numpy as np
A = np.array([[5.0, 2.0, 1.0],
[2.0, 3.0, 0.0],
[1.0, 0.0, 4.0]])
vals, Q = np.linalg.eigh(A)
print('Eigenvalues:', np.round(vals, 4))
# Reconstruct A = Q @ diag(vals) @ Q.T
A_reconstructed = Q @ np.diag(vals) @ Q.T
print('Reconstruction correct:', np.allclose(A, A_reconstructed))
print('Q is orthogonal:', np.allclose(Q.T @ Q, np.eye(3)))Käytännössä: iteraatio suurimman ominaisarvon löytämiseksi
Kun tarvitsette vain suurimman ominaisarvon ja sitä vastaavan ominaisvektorin, potenssi-iteraatio on paljon tehokkaampi kuin kaikkien ominaisarvojen laskeminen. Aloittakaa satunnaisesta vektorista, kertokaa se toistuvasti matriisilla A ja normalisoikaa tulos; näin se lähestyy dominoivaa ominaisvektoria. Googlen alkuperäinen PageRank-algoritmi toimi tällä tavalla. NumPyssa jokainen iteraatio koostuu yhdestä matriisi–vektorikertolaskusta operaattorilla @.
import numpy as np
A = np.array([[4.0, 1.0, 2.0],
[1.0, 3.0, 0.0],
[2.0, 0.0, 2.0]])
v = np.random.rand(3)
for _ in range(50):
v = A @ v
v = v / np.linalg.norm(v)
eigenvalue_approx = v @ A @ v
print('Dominant eigenvector:', np.round(v, 4))
print('Approx eigenvalue:', round(eigenvalue_approx, 4))
# Verify with eigh
vals, vecs = np.linalg.eigh(A)
print('True max eigenvalue:', round(vals[-1], 4))np.linalg.svd:n käyttäminen todellisissa putkissa
Varsinaisessa datan käsittelyputkessa SVD:tä käytetään kohinan vähentämiseen ja datan pakkaukseen. Kun SVD on sovitettu opetusdataan, säilytätte vain k tärkeintä komponenttia, jotka kattavat 95 % varianssista. Tämä pienentää uuden datan ulottuvuutta ennen sen syöttämistä luokittimelle tai regressiomallille, nopeuttaa opettamista ja usein parantaa yleistämistä poistamalla kohinaisia ulottuvuuksia. Sovittakaa SVD aina vain opetusdataan ja käyttäkää testidataan samaa muunnosta.
import numpy as np
np.random.seed(7)
X_train = np.random.randn(200, 50)
X_test = np.random.randn(40, 50)
# Fit on training data
X_mean = X_train.mean(axis=0)
X_centered = X_train - X_mean
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)
# Choose k to capture 90% variance
cumvar = np.cumsum(s**2) / (s**2).sum()
k = np.searchsorted(cumvar, 0.9) + 1
print(f'Components to capture 90% variance: {k}')
# Transform test data using the same Vh
X_test_reduced = (X_test - X_mean) @ Vh[:k].T
print('Reduced test shape:', X_test_reduced.shape)Pikatarkistus
Testaa, miten hyvin ymmärrät tämän oppitunnin data-analyysin käsitteet.
Oppitunnin kertaus
Tässä oppitunnissa opit, että np.linalg.eig()/eigh() laskevat matriisin luontaiset venytyssuunnat paljastavat ominaisarvot ja ominaisvektorit, np.linalg.svd() hajottaa minkä tahansa matriisin U:ksi, singulaariarvoiksi ja Vh:ksi mahdollistaen PCA:n ja matala-asteisen approksimaation, ja singulaariarvot määrittävät kunkin komponentin kattaman varianssin sekä matriisin asteen. Seuraavaksi opettelemme käsittelemään suuria aineistoja lukemalla CSV-tiedostoja suoratoistona paloissa.
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 ”Ominaisarvot ja SVD:n yleiskatsaus” ilmainen?
Kyllä – oppitunnin ”Ominaisarvot ja SVD:n yleiskatsaus” 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 ”Ominaisarvot ja SVD:n yleiskatsaus”?
Laske ominaisarvot ja -vektorit np.linalg.eig-funktiolla ja ymmärrä, miten SVD mahdollistaa PCA-menetelmän mukaisen dimensioiden vähentämisen. 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 4/4.
Kuinka kauan ”Ominaisarvot ja SVD:n yleiskatsaus”-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