course
Czy kiedykolwiek próbowałeś wydobyć użyteczne wzorce z zestawu danych liczącego tysiące cech?
Wiesz, że w ogromnym zbiorze danych musi kryć się jakaś sensowna struktura. Problem w tym, że surowe dane niosą ze sobą sporo szumu, redundancji, braków oraz zdecydowanie więcej wymiarów, niż faktycznie potrzebujesz. Większość algorytmów uczenia maszynowego nie poradzi sobie z takimi danymi lub w najlepszym razie znacząco wydłuży czas trenowania.
Singular Value Decomposition (SVD) rozkłada dowolną macierz (w tym przypadku zbiór danych) na trzy prostsze macierze, które pokazują jej sedno. To matematyka stojąca za systemami rekomendacji, kompresją obrazów i metodami redukcji wymiarów, takimi jak PCA — a gdy ją zrozumiesz, zaczniesz widzieć SVD wszędzie w codziennej pracy.
W tym artykule wyjaśnię, czym jest SVD, jak działa, gdzie znajduje zastosowanie w data science i kiedy lepiej sięgnąć po alternatywę.
Czy pojęcia takie jak wektory i wyznaczniki cię mylą? Przeczytaj nasz wpis Demistyfikacja pojęć matematycznych w deep learningu, zanim przejdziesz dalej.
Czym jest dekompozycja według wartości osobliwych (SVD)?
SVD to metoda, która rozkłada dowolną macierz na trzy prostsze macierze.
Pomyśl o tym tak. Masz macierz A — może to być zbiór danych lub obraz. SVD dzieli A na trzy części:

Wzór SVD
-
Uto ortogonalna macierzm x m. Jej kolumny nazywamy lewymi wektorami osobliwymi i opisują one zależności między wierszami macierzyA -
\Sigmato diagonalna macierzm x n. Wartości na przekątnej to wartości osobliwe — zawsze nieujemne i uporządkowane malejąco -
V*to sprzężone transponowanie ortogonalnej macierzyn x n. Jej wiersze nazywamy prawymi wektorami osobliwymi i opisują one zależności między kolumnami A
Każda część pokazuje coś innego o oryginalnych danych. U zawiera wzorce na poziomie wierszy (jak wiersze odnoszą się do siebie), \Sigma przechowuje wagi ważności (na ile dany wzorzec ma znaczenie), a V* — wzorce na poziomie kolumn (jak kolumny odnoszą się do siebie).
Analogicznie do przepisu kulinarnego: możesz go rozbić na trzy części — składniki (co wchodzi w skład), proporcje (ile czego) i kroki (jak to połączyć). Żaden z tych elementów osobno nie odtworzy potrawy, ale razem dają wszystko, co potrzebne. SVD robi to samo z macierzami — rozdziela „co”, „ile” i „jak” na oddzielne komponenty, z którymi możesz pracować niezależnie.
To, co wyróżnia SVD w algebrze liniowej, to fakt, że działa na każdej macierzy. Nie musi być kwadratowa ani mieć szczególnych własności. Każdą macierz m x n można w ten sposób zdekomponować, dlatego SVD pojawia się wszędzie w data science.
Jak SVD działa w praktyce
Przyjrzyjmy się krok po kroku działaniu SVD, zaczynając od podstaw.
Wyjaśnienie dekompozycji macierzy
Załóżmy, że masz macierz 3×2 A:

Dekompozycja macierzy
SVD rozkłada ją na U (3×3), \Sigma (3×2) oraz V* (2×2). Kolumny U pochodzą z wektorów własnych A x A^T, a kolumny V — z wektorów własnych A^T x A. Wartości osobliwe w \Sigma to pierwiastki z wartości własnych któregoś z tych iloczynów.
Dobra wiadomość: nie musisz tego liczyć ręcznie. W Pythonie wystarczy jedna linijka kodu:
import numpy as np
A = np.array([[1, 2], [3, 4], [5, 6]])
U, sigma, Vt = np.linalg.svd(A, full_matrices=True)

Wynik Numpy
Trzy macierze „współdziałają” przez mnożenie. U obraca dane w przestrzeni wierszy, \Sigma skaluje je wzdłuż każdej osi, a V* obraca je w przestrzeni kolumn. W efekcie otrzymujesz oryginalną macierz A.
Rola wartości osobliwych
Wartości na przekątnej \Sigma mówią, jak bardzo każdy składnik przyczynia się do całej macierzy.
Pierwsza wartość osobliwa jest zawsze największa — wychwytuje najbardziej dominujący wzorzec w danych. Każda kolejna oddaje mniej. Jeśli kilka pierwszych wartości jest dużych, a reszta bliska zeru, to znaczy, że większość informacji w macierzy skupia się w zaledwie paru komponentach.
To właśnie umożliwia kompresję danych.
Możesz pominąć małe wartości osobliwe (oraz odpowiadające im kolumny w U i wiersze w V*), nie tracąc zbyt wiele informacji. Otrzymasz przybliżenie macierzy o niższym rzędzie — mniejsze i szybsze w użyciu.
Liczba niezerowych wartości osobliwych mówi też o rzędzie macierzy — liczbie liniowo niezależnych wierszy lub kolumn. Jeśli macierz 100×50 ma tylko 10 niezerowych wartości osobliwych, to dane mają jedynie 10 niezależnych wymiarów. Pozostałe 40 jest redundantne.
Rekonstrukcja macierzy
Możesz odtworzyć oryginalną macierz, mnożąc z powrotem te trzy składniki:

Rekonstrukcja macierzy
W praktyce zależy ci jednak na częściowej rekonstrukcji. Zamiast używać wszystkich wartości osobliwych, zostawiasz tylko pierwsze k i odpowiadające im wektory. Otrzymujesz przybliżenie rzędu k macierzy A:

Przybliżenie macierzy rzędu k
Twierdzenie Eckarta-Younga gwarantuje, że to przybliżenie rzędu k jest najbliższą możliwą macierzą rzędu k względem oryginalnej A (mierzoną normą Frobeniusa). Innymi słowy, jeśli masz skompresować macierz do k wymiarów, SVD daje najlepszy możliwy wynik.
Zastosowania SVD w data science
Gdy zaczniesz się rozglądać, SVD pojawia się częściej, niż byś się spodziewał.
Chodzi zawsze o to samo: wziąć dużą macierz, zachować to, co istotne, i usunąć resztę. Zmienia się tylko to, co „istotne” znaczy w danym problemie.
Redukcja wymiarów
Zbiory danych o wysokiej wymiarowości są trudne w obróbce i interpretacji. Więcej cech oznacza dłuższe trenowanie i większe ryzyko przeuczenia. SVD przeciwdziała temu, zmniejszając liczbę wymiarów.
Ogólnie rzecz biorąc: dekomponujesz macierz danych, analizujesz wartości osobliwe i zostawiasz tylko pierwsze k komponentów. Małe wartości osobliwe reprezentują szum i drobne zmienności, więc ich usunięcie ledwie wpłynie na jakość danych. Zostaje ci zwarta reprezentacja, która zachowuje większość oryginalnej struktury.
Dokładnie tak działa analiza głównych składowych (PCA). PCA centruje dane, a następnie uruchamia na nich SVD. Składowe główne to prawe wektory osobliwe, a wartości osobliwe mówią, jaką część wariancji wyjaśnia każda składowa.
Systemy rekomendacji
Firmy takie jak Netflix czy Amazon mają ogromne macierze użytkownik–element, w których większość pozycji jest pusta. Użytkownik ocenia kilka filmów z tysięcy, więc macierz jest rzadka. SVD pomaga wypełnić luki.
Pomysł polega na rozkładzie macierzy ocen na preferencje użytkowników i cechy elementów. Macierz U reprezentuje to, na co zwraca uwagę każdy użytkownik (gatunek, tempo, ton), a V* — co oferuje każdy element. Wartości osobliwe w \Sigma skalują te czynniki według ważności. Po wymnożeniu z powrotem otrzymujesz przewidywane oceny dla filmów, których użytkownik jeszcze nie widział.
W praktyce standardowe SVD nie działa bezpośrednio na macierzach rzadkich, bo traktuje brakujące wartości jak zera. Dlatego stosuje się odmiany, takie jak obcięte SVD (truncated SVD) lub faktoryzacja macierzy, które operują wyłącznie na zaobserwowanych wpisach.
Kompresja obrazów
Obraz w skali szarości to po prostu macierz wartości pikseli. SVD może go skompresować, zachowując tylko najważniejsze wartości osobliwe.
Załóżmy, że masz obraz 1000×1000. Pełne SVD daje 1000 wartości osobliwych. Jeśli jednak zachowasz tylko pierwszych 50, odtworzysz obraz zaledwie z 50 komponentów zamiast 1000. Obraz będzie lekko rozmyty, ale rozpoznawalny — a pamięć spada z 1 000 000 wartości do około 100 500 (50 kolumn U + 50 wartości osobliwych + 50 wierszy V*).
Więcej wartości osobliwych oznacza lepszą jakość obrazu, ale mniejszą kompresję. Mniej wartości to mniejsze pliki, lecz większe straty. To ty decydujesz, gdzie postawić granicę w zależności od zastosowania.
Wydajność i ograniczenia
Im większa twoja macierz, tym większy koszt obliczeniowy.
Koszt obliczeniowy
Pełne SVD dla macierzy m x n ma złożoność czasową O(mn²) (zakładając m >= n). Dla małych macierzy to w porządku. Dla macierzy z milionami wierszy i tysiącami kolumn — kosztowne.
Drugim wąskim gardłem jest pamięć. Pełne SVD generuje trzy gęste macierze i przechowywanie ich naraz może przekroczyć dostępny RAM.
Rozwiązanie to unikać pełnego SVD, gdy nie jest potrzebne. Obcięte SVD (truncated SVD) liczy tylko pierwszych k wartości osobliwych i ich wektorów, co jest znacznie szybsze. W Pythonie robią to scipy.sparse.linalg.svds i sklearn.decomposition.TruncatedSVD. Zrandomizowane SVD (randomized SVD) idzie o krok dalej, używając losowego próbkowania do przybliżenia dekompozycji — sprawdza się, gdy potrzebujesz tylko dominujących komponentów.
Stabilność i dokładność
SVD jest zazwyczaj numerycznie stabilne, ale może mieć kłopoty z pewnymi wzorcami danych.
Jednym z przykładów są silnie zaszumione dane. Gdy stosunek sygnału do szumu jest niski, najwyższe wartości osobliwe nie odseparują się od szumu. Albo zatrzymasz szum w przybliżeniu, albo utniesz część sygnału.
Inny problem to macierze źle uwarunkowane. Gdy stosunek największej do najmniejszej wartości osobliwej jest ogromny (wysoka liczba uwarunkowania), drobne błędy numeryczne podczas obliczeń się wzmacniają. Może to dawać niewiarygodne wyniki, zwłaszcza przy ograniczonej precyzji zmiennoprzecinkowej.
Rozwiązanie: przeanalizuj wartości osobliwe przed obcięciem. Narysuj wykres i poszukaj wyraźnego załamania między sygnałem a szumem. Jeśli spadek jest stopniowy, bez wyraźnego „łokcia”, SVD może nie być najlepszym narzędziem dla tego zbioru danych.
Alternatywy dla SVD
SVD nie jest jedyną dekompozycją macierzy i nie zawsze jest najlepszym wyborem.
Każda z poniższych alternatyw rozwiązuje określony typ problemu. Nie zastępują SVD, bo działają przy innych założeniach i ograniczeniach. Właściwy wybór — jak zawsze — zależy od zadania, które chcesz wykonać.
Rozkład własny (eigendecomposition)
Rozkład własny jest najbardziej spokrewniony z SVD. Rozkłada macierz kwadratową na wartości własne i wektory własne:

Wzór rozkładu własnego
Gdzie Q zawiera wektory własne, a \Lambda jest diagonalną macierzą wartości własnych.
Haczyk tkwi w tym, że działa tylko na macierzach kwadratowych. Jeśli twoja macierz danych ma rozmiar m x n, gdzie m != n, rozkład własny nie zadziała bezpośrednio. SVD działa dla dowolnego kształtu, dlatego jest narzędziem ogólniejszym.
Dla macierzy kwadratowych i symetrycznych (np. macierzy kowariancji) rozkład własny i SVD dają ściśle powiązane wyniki. Wartości osobliwe symetrycznej macierzy dodatnio półokreślonej są jej wartościami własnymi. Jeśli więc pracujesz na macierzach kowariancji w PCA, obie metody prowadzą do tych samych rezultatów. SVD to wersja, która uogólnia się na przypadki niekwadratowe.
Rozkład QR
Rozkład QR dzieli macierz na macierz ortogonalną Q oraz górnotrójkątną macierz R:

Wzór rozkładu QR
Dla niektórych zadań jest szybszy niż SVD, zwłaszcza przy rozwiązywaniu układów równań liniowych i problemów najmniejszych kwadratów.
Kompromisem jest ilość informacji. QR nie daje wartości osobliwych, więc nie powie ci nic o rzędzie macierzy ani o tym, które komponenty niosą największy ciężar. Jeśli musisz rozwiązać Ax = b i nie zależy ci na zrozumieniu struktury, QR będzie dobrym wyborem. Jeśli jednak chcesz dane zrozumieć lub skompresować, lepsze będzie SVD.
Niejednoznaczna faktoryzacja macierzy (NMF)
NMF rozkłada macierz na dwie macierze, w których wszystkie wartości są nieujemne:

Wzór NMF
To ograniczenie sprawia, że NMF świetnie nadaje się do danych z natury nieujemnych (np. intensywności pikseli czy zliczeń słów). SVD tego nie wymusza — w jego macierzach mogą występować wartości ujemne, co czasem prowadzi do komponentów trudniejszych w interpretacji.
NMF jest szczególnie popularne w eksploracji tekstu i modelowaniu tematów. Każda kolumna W może reprezentować temat, a każdy wiersz H pokazuje, ile tego tematu jest w każdym dokumencie. Ograniczenie do wartości nieujemnych sprawia, że tematy powstają poprzez addytywne kombinacje słów, co bywa czytelniejsze niż mieszane znaki w komponentach SVD.
Minusem jest brak gwarancji jednoznacznego rozwiązania — wynik zależy od inicjalizacji. SVD zawsze daje ten sam wynik dla tych samych danych.
Zrandomizowane SVD
Jeśli twoja macierz jest zbyt duża na pełne SVD, ale nadal chcesz poznać wartości osobliwe, warto rozważyć randomized SVD. Używa projekcji losowych do przybliżenia pierwszych k wartości osobliwych i wektorów bez wyznaczania pełnej dekompozycji. Biblioteki takie jak scikit-learn (TruncatedSVD) i fbpca od Facebooka implementują to podejście i dobrze skalują się do macierzy z milionami wierszy.
Poniższa tabela podsumowuje, kiedy warto wybrać każdą z metod.

Alternatywy dla SVD
Inne kwestie związane z SVD
Kilka rzeczy często myli początkujących data scientistów.
Pierwsza to błędna interpretacja wartości osobliwych. Duża wartość osobliwa oznacza, że dana składowa wyjaśnia dużo wariancji w danych — nie znaczy to, że jest „ważna” w sensie domenowym. Na przykład dominująca wartość osobliwa w macierzy ocen użytkowników może oddawać fakt, że większość osób ocenia popularne filmy, a nie jakiś istotny wzorzec preferencji. Zawsze interpretuj wartości osobliwe w kontekście danych, nie tylko ich wielkości.
Druga to sięganie po SVD, gdy nie jest potrzebne. W małych zbiorach danych (kilkaset wierszy i kilka kolumn) SVD tylko komplikuje sprawę. Prostsze metody, jak analiza korelacji czy podstawowa selekcja cech, często wystarczają — szybciej i z mniejszą ilością kodu. SVD świetnie się sprawdza przy danych wysokowymiarowych z redundantną strukturą — jeśli twój zbiór taki nie jest, wybierz prostsze metody.
Wnioski
SVD rozkłada dowolną macierz na trzy składniki, które ujawniają jej strukturę. Wartości osobliwe mówią, które części danych mają największe znaczenie, a lewe i prawe wektory osobliwe pokazują wzorce w wierszach i kolumnach, które za nimi stoją.
Ta dekompozycja stoi za wieloma praktycznymi narzędziami, których używasz na co dzień. Systemy rekomendacji wykorzystują ją do przewidywania brakujących ocen. Kompresja obrazów — do zmniejszania rozmiarów plików przy zachowaniu jakości wizualnej. Matematyka w obu przypadkach jest niemal identyczna, choć domeny są zupełnie różne.
Ale SVD nie zawsze jest właściwym narzędziem. Jest kosztowne dla dużych macierzy i może mieszać sygnał z szumem, gdy wartości osobliwe słabo się rozdzielają. Jest też przerostem formy dla małych zbiorów danych. Alternatywy, takie jak rozkład QR, rozkład własny czy NMF, lepiej radzą sobie w konkretnych przypadkach.
Klucz to wiedzieć, kiedy użyć SVD, a kiedy prościej będzie lepiej. Aby zdobyć tę wiedzę, zapisz się na nasz Machine Learning Scientist in Python i bądź gotowy do pracy w 2026 roku.
SVD — najczęstsze pytania
Czym jest dekompozycja według wartości osobliwych (SVD)?
SVD to metoda dekompozycji macierzy, która rozkłada dowolną macierz na trzy komponenty: lewe wektory osobliwe (U), wartości osobliwe (Σ) oraz prawe wektory osobliwe (V*). Działa na każdej macierzy, niezależnie od kształtu i rozmiaru. SVD ujawnia ukrytą strukturę danych, rozdzielając je na wzorce i ich względną wagę.
Dlaczego SVD jest używane w data science i uczeniu maszynowym?
SVD pomaga zmniejszyć liczbę wymiarów w zbiorach danych o wysokiej wymiarowości, zachowując najważniejsze wzorce. To matematyka stojąca za PCA i systemami rekomendacji. Wszystkie te zastosowania opierają się na tym samym pomyśle: zachować dominujące komponenty i usunąć resztę.
Czym różni się SVD od rozkładu własnego (eigendecomposition)?
Rozkład własny działa tylko na macierzach kwadratowych, podczas gdy SVD działa dla każdego kształtu macierzy. Dla macierzy kwadratowych i symetrycznych, takich jak macierze kowariancji, obie metody dają ściśle powiązane wyniki — wartości osobliwe macierzy dodatnio półokreślonej są jej wartościami własnymi. SVD jest narzędziem bardziej ogólnym, dlatego jest domyślnym wyborem w większości workflowów data science.
Jak wartości osobliwe mają się do kompresji danych?
Wartości osobliwe są posortowane malejąco i każda reprezentuje, jaką część wariancji wyjaśnia dana składowa. Usunięcie małych wartości osobliwych (i odpowiadających im wektorów) eliminuje drobne wzorce i szum, a zachowuje dominującą strukturę. Rezygnujesz z odrobiny dokładności na rzecz dużej redukcji rozmiaru.
Kiedy powinienem unikać SVD?
SVD jest kosztowne dla dużych macierzy — pełna dekompozycja ma złożoność O(mn^2). W przypadku małych zbiorów z kilkoma cechami prostsze metody, takie jak analiza korelacji czy podstawowa selekcja cech, wykonają zadanie szybciej. Jeśli twoja macierz jest bardzo duża i potrzebujesz tylko głównych komponentów, lepsze będzie obcięte lub zrandomizowane SVD zamiast pełnego SVD.