0Pricing
Pandas & NumPy Academy · Lekcja

Wyznaczniki, macierze odwrotne i transpozycje

Oblicz wyznaczniki macierzy za pomocą np.linalg.det, macierze odwrotne za pomocą np.linalg.inv, a transpozycje za pomocą .T.

Wyznaczniki, macierze odwrotne i transpozycje to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Transpozycja macierzy

Transpozycja macierzy polega na odbiciu jej względem przekątnej: wiersze stają się kolumnami, a kolumny wierszami. Jeśli macierz A ma kształt (m, n), to A.T ma kształt (n, m). Transpozycje pojawiają się wszędzie w algebrze liniowej: przy obliczaniu macierzy kowariancji, implementowaniu propagacji wstecznej gradientu oraz konwertowaniu między konwencją wektora wierszowego i kolumnowego. NumPy udostępnia transpozycję za pomocą atrybutu .T — nie jest tworzona kopia, lecz widok z przestawionymi krokami w pamięci.

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)

Transpozycja w praktyce

Często spotykanym działaniem jest obliczanie A.T @ A, które daje symetryczną macierz kwadratową pojawiającą się w regresji metodą najmniejszych kwadratów, analizie PCA oraz równaniach normalnych. Jeśli A ma kształt (n, p), to A.T @ A ma kształt (p, p). Wynik jest zawsze symetryczny, ponieważ (A.T @ A)[i,j] == (A.T @ A)[j,i]. Wiele solverów numerycznych wykorzystuje tę właściwość w celu zwiększenia wydajności.

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))

Wyznacznik: co oznacza

Wyznacznik macierzy kwadratowej jest wartością skalarną zawierającą informacje geometryczne: mierzy współczynnik, przez który macierz skaluje pola (w 2D) lub objętości (w wyższych wymiarach). Wyznacznik równy zero oznacza, że macierz jest osobliwa — odwzorowuje przestrzeń na podprzestrzeń o niższym wymiarze i nie ma macierzy odwrotnej. Niezerowy wyznacznik gwarantuje odwracalność macierzy. NumPy oblicza go za pomocą 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

Obliczanie macierzy odwrotnej za pomocą np.linalg.inv()

Macierz odwrotna do macierzy A, oznaczana jako A⁻¹, spełnia warunek A @ A⁻¹ = I, gdzie I jest macierzą jednostkową. Macierze odwrotne istnieją tylko dla macierzy kwadratowych i nieosobliwych. np.linalg.inv(A) oblicza macierz odwrotną numerycznie. W praktyce należy rzadko obliczać macierz odwrotną bezpośrednio, ponieważ jest to niestabilne numerycznie; zamiast tego w układach równań należy używać np.linalg.solve(). Koncepcyjne zrozumienie macierzy odwrotnych jest jednak niezbędne.

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))

Niestabilność numeryczna bezpośredniego odwracania

Obliczenie macierzy odwrotnej, a następnie wykonanie mnożenia wprowadza błędy zmiennoprzecinkowe, które się kumulują. Na przykład rozwiązanie A_inv @ b jest mniej dokładne niż bezpośrednie wywołanie np.linalg.solve(A, b). Macierz o dobrym uwarunkowaniu (z wyznacznikiem odległym od zera) jest mniej podatna na te błędy. Współczynnik uwarunkowania (np.linalg.cond(A)) określa, jak blisko macierz znajduje się osobliwości — duże wartości współczynnika sygnalizują problemy numeryczne.

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))

Macierze ortogonalne i ich transpozycje

Szczególną klasę stanowią macierze ortogonalne, dla których A.T @ A = I. Oznacza to, że transpozycja JEST macierzą odwrotną, dzięki czemu odwracanie macierzy ortogonalnych jest niezwykle tanie obliczeniowo. Macierze obrotu oraz czynnik Q w rozkładzie QR są ortogonalne. Kolumny macierzy ortogonalnej tworzą bazę ortonormalną — każda kolumna ma długość jednostkową i jest prostopadła do wszystkich pozostałych kolumn.

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)))

Macierz pseudoodwrotna dla macierzy niekwadratowych

Zwykła macierz odwrotna istnieje tylko dla macierzy kwadratowych, ale pseudoodwrotna Moore’a-Penrose’a uogólnia odwracanie na dowolne macierze. np.linalg.pinv(A) oblicza ją za pomocą SVD. Stanowi ona podstawę rozwiązania metodą najmniejszych kwadratów dla układów nadokreślonych (z większą liczbą równań niż niewiadomych), czyli dokładnie takich, jakie rozwiązuje regresja liniowa. Jeśli A jest kwadratowa i odwracalna, pinv(A) jest równe 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)

Znak wyznacznika i skalowanie objętości

Znak wyznacznika wskazuje, czy transformacja zachowuje, czy odwraca orientację. Dodatni wyznacznik oznacza zachowanie orientacji (jak w przypadku obrotu), a ujemny — jej odwrócenie (jak w przypadku odbicia). Wartość bezwzględna określa współczynnik skalowania objętości. Dla macierzy 2×2 [[a,b],[c,d]] zachodzi det = a*d - b*c. NumPy wydajnie obsługuje macierze kwadratowe o dowolnym rozmiarze.

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))

Używanie np.linalg.slogdet() dla stabilności

W przypadku dużych macierzy wyznacznik może przekroczyć zakres wartości lub zostać zredukowany do zera, nawet gdy macierz nie jest osobliwa. np.linalg.slogdet(A) zwraca (sign, log_abs_det) — znak oraz logarytm naturalny wartości bezwzględnej wyznacznika — co zapobiega przepełnieniu numerycznemu. Jest to powszechnie używane w modelach probabilistycznych (wiarygodnościach gaussowskich), w których obliczenia prowadzi się w przestrzeni logarytmów, aby utrzymać liczby w rozsądnym zakresie.

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))

Praktyka: rozwiązywanie układu 2×2 ręcznie i za pomocą NumPy

Dla macierzy 2×2 [[a, b], [c, d]] macierz odwrotna ma postać (1/det) * [[d, -b], [-c, a]], gdzie det = ad - bc. Znajomość tego wzoru pomaga punktowo sprawdzać wynik uzyskany w NumPy. Dla większych macierzy analityczne obliczanie macierzy odwrotnej jest niepraktyczne — właśnie dlatego używamy np.linalg.inv(). Wyniki numeryczne należy zawsze weryfikować za pomocą 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)))

Łączenie transpozycji i macierzy odwrotnej w potokach

Często spotykany wzorzec algebry liniowej łączy transpozycję i macierz odwrotną: obliczenie (A.T @ A)⁻¹ @ A.T daje macierz projekcji używaną w zwykłej metodzie najmniejszych kwadratów. W NumPy można zapisać to jako np.linalg.inv(A.T @ A) @ A.T, ale także w tym przypadku pod względem numerycznym lepsze jest np.linalg.lstsq. Znajomość podstawowego schematu pomaga zrozumieć działanie solvera i diagnozować problemy, gdy macierze są bliskie osobliwości.

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))

Szybki test

Sprawdźcie Państwo swoją wiedzę na temat pojęć analizy danych z tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że: A.T to transpozycja zamieniająca wiersze i kolumny, np.linalg.inv() oblicza macierz odwrotną, ale należy rzadko używać go bezpośrednio (zamiast tego preferowane są solve lub lstsq), a np.linalg.det() zwraca wyznacznik, który dla macierzy osobliwych wynosi zero. Następnie omówimy bezpośrednie rozwiązywanie układów równań liniowych za pomocą np.linalg.solve.

Często zadawane pytania

Czy lekcja „Wyznaczniki, macierze odwrotne i transpozycje” jest bezpłatna?

Tak — pełny tekst „Wyznaczniki, macierze odwrotne i transpozycje” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wyznaczniki, macierze odwrotne i transpozycje”?

Oblicz wyznaczniki macierzy za pomocą np.linalg.det, macierze odwrotne za pomocą np.linalg.inv, a transpozycje za pomocą .T. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wyznaczniki, macierze odwrotne i transpozycje”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Mnożenie macierzy za pomocą np.matmul i @
  2. Wyznaczniki, macierze odwrotne i transpozycje
  3. Rozwiązywanie układów równań liniowych
  4. Wartości własne i przegląd SVD
← Powrót do Pandas & NumPy Academy