ML Atlas

05 · Bez nadzoru · 5 min czytania · aktualizacja

Czym jest nieujemny rozkład macierzy (NMF) i czym różni się od PCA?

W skrócie

NMF rozkłada dane na sumę nieujemnych części. Na cyfrach z 10 składowymi 61,1% wartości w składowych to zera, za cenę błędu 0,326 wobec 0,289 dla SVD.

Co to jest

Nieujemny rozkład macierzy (Non-negative Matrix Factorization, NMF) przybliża macierz danych X o nieujemnych wartościach iloczynem dwóch mniejszych macierzy, również nieujemnych: X ≈ WH. Gdy X ma n wierszy (np. obrazów) i m kolumn (pikseli), H zawiera k „części” — wzorców o m wartościach — a W mówi, ile każdej części jest w każdym obrazie. Liczbę części k wybiera użytkownik.

Ograniczenie do liczb nieujemnych ma ważny skutek: części można tylko dodawać, nigdy odejmować. Obraz powstaje jak z naklejek, a nie jak w PCA, gdzie jedna składowa dorzuca jasność, a druga ją zabiera. Lee i Seung (1999) pokazali, że na zdjęciach twarzy NMF znajduje fragmenty przypominające nos, oczy czy usta, a na tekstach — grupy słów o wspólnym temacie. Nazwali to reprezentacją przez części.

Typowe dane: obrazy (jasność pikseli), teksty (liczby słów lub TF-IDF), widma, liczby zdarzeń, oceny. Wszędzie tam ujemna wartość nie ma sensu fizycznego.

Mechanizm — dlaczego tak działa

dane jako suma nieujemnych częściXdane≈W×H: częściW ≥ 0H ≥ 0Obraz = część + część + część=++tylko dodawanie,nigdy odejmowanie
Schemat: dane jako suma nieujemnych części

NMF minimalizuje błąd odtworzenia, najczęściej kwadrat normy Frobeniusa ‖X − WH‖², przy warunkach W ≥ 0 i H ≥ 0. Zadanie nie jest wypukłe względem obu macierzy naraz, ale jest wypukłe względem każdej z osobna. Dlatego większość algorytmów naprzemiennie poprawiają W przy ustalonym H i H przy ustalonym W.

Reguły multiplikatywne (Lee i Seung, 2001) mnożą każdy element przez iloraz: H ← H ⊙ (WᵀX) ⊘ (WᵀWH), analogicznie dla W. Wartość nieujemna pomnożona przez nieujemny iloraz zostaje nieujemna, więc warunek pilnuje się sam, a błąd nigdy nie rośnie. Wadą jest powolna zbieżność, a element, który raz stanie się zerem, już z zera nie wyjdzie.

Zejście po współrzędnych (coordinate descent, solver cd w scikit-learn) poprawia po kolei jedną kolumnę W albo wiersz H rozwiązaniem dokładnym, przyciętym do zera (wariant HALS, Cichocki i Phan, 2009). Zwykle zbiega szybciej. Obie metody znajdują jednak tylko minimum lokalne, zależne od inicjalizacji.

Porównanie z PCA i SVD. Obcięte SVD daje najlepsze możliwe przybliżenie rzędu k w normie Frobeniusa (twierdzenie Eckarta–Younga), więc NMF z tym samym k nigdy nie odtworzy danych lepiej. Płaci się błędem za interpretowalność: składowe SVD mają wartości dodatnie i ujemne i są gęste, a składowe NMF często są rzadkie — wiele pikseli ma dokładnie zero. Zera biorą się z ograniczenia: optimum często leży na granicy W ≥ 0, H ≥ 0.

Niejednoznaczność. Dla dowolnej macierzy Q takiej, że WQ i Q⁻¹H pozostają nieujemne, iloczyn się nie zmienia. Zawsze można przeskalować i przestawić części, a często da się też je „obrócić”. Donoho i Stodden (2004) opisali warunki, przy których rozkład na części jest jednoznaczny; w zwykłych danych nie muszą być spełnione.

Na przykładzie

Zbiór cyfr z scikit-learn: 1797 obrazków 8 × 8 pikseli, jasność od 0 do 16; 48,9% wszystkich wartości to zera, a 3 piksele są puste w każdym obrazku. Błąd odtworzenia mierzymy jako ‖X − WH‖ / ‖X‖.

Błąd maleje z liczbą składowych w obu metodach, ale NMF zostaje z tyłu. Przy 2 składowych: 0,508 dla NMF i 0,507 dla obciętego SVD. Przy 10: 0,326 wobec 0,289. Przy 40: 0,081 wobec 0,061. Zgodnie z teorią SVD wygrywa przy każdym k.

W zamian składowe NMF są rzadkie. Przy 10 składowych 61,1% wartości w H to dokładne zera: przeciętna część zajmuje 25 z 64 pikseli. Przy 40 składowych zer jest już 90,7%. Składowe SVD mają zera tylko w 3 pustych pikselach (4,7%), a 44,1% ich wartości jest ujemnych. Także W jest rzadkie: przeciętny obrazek składa się z 7,2 z 10 części, pozostałe mają wagę zero.

Algorytmy. Przy 10 składowych i tej samej inicjalizacji zejście po współrzędnych zatrzymało się po 847 iteracjach z błędem 0,3263. Reguły multiplikatywne po 200 iteracjach miały 0,3351, a gdy spełniło kryterium zatrzymania (po 3520 iteracjach) — 0,3291, nadal więcej niż cd.

Stabilność. Dziesięć losowych inicjalizacji daje błędy od 0,3247 do 0,3273, czyli prawie to samo. Same części różnią się jednak bardziej. Po dopasowaniu części z dwóch przebiegów w pary mediana podobieństwa kosinusowego wynosi 0,919, ale tylko 54,7% par przekracza 0,9, a 6,0% leży poniżej 0,5. Interpretować warto tylko części, które powtarzają się między inicjalizacjami.

Jak to policzono
  • sklearn.datasets.load_digits().data: 1797 × 64, wartości 0–16, udział zer 0,489, 3 piksele zawsze zerowe. scikit-learn 1.9.1, NumPy 2.5.3, SciPy 1.18.1.
  • Błąd względny ‖X − X̂‖_F / ‖X‖_F. NMF(k, init="nndsvda", solver="cd", max_iter=1000, random_state=0) i TruncatedSVD(k, algorithm="arpack") (bez centrowania). k = 2; 5; 10; 20; 30; 40 — NMF: 0,5075; 0,4086; 0,3263; 0,2232; 0,1485; 0,0813; SVD: 0,5070; 0,3893; 0,2892; 0,1820; 0,1132; 0,0608. Dla porównania PCA(k) z centrowaniem (k składowych plus średnia): 0,4727; 0,3771; 0,2861; 0,1818; 0,1131; 0,0607.
  • Zera (wartość < 10⁻¹⁰) w H dla k = 2; 5; 10; 20; 30; 40: 0,172; 0,469; 0,611; 0,791; 0,873; 0,907. Przy k = 10: niezerowe piksele w składowych 25, 25, 26, 19, 33, 21, 31, 27, 20, 22 (średnio 24,9); zera w W 0,276, średnio 7,24 aktywnych składowych na obraz. TruncatedSVD(10): zera 0,047, wartości ujemne (< −10⁻¹⁰, po ustaleniu znaku tak, by suma składowej była dodatnia) 0,441; PCA(10) przy tej samej regule: ujemne 0,464.
  • Solvery, k = 10, init="nndsvda", tol=1e-8, random_state=0: cd — 200 iteracji 0,3290, zbieżność po 847 iteracjach 0,3263; mu (Frobenius) — 200 iteracji 0,3351, 2000 iteracji 0,3293, zbieżność po 3520 iteracjach 0,3291.
  • Stabilność: init="random", solver="cd", tol=1e-6, max_iter=2000, random_state 0–9. Błędy od 0,3247 do 0,3273. Wiersze H znormalizowane do długości 1, części z każdej z 45 par przebiegów dopasowane algorytmem węgierskim (scipy.optimize.linear_sum_assignment) na podobieństwie kosinusowym; 450 dopasowanych par: średnia 0,854, mediana 0,919, minimum 0,196, powyżej 0,9 — 0,547, poniżej 0,5 — 0,060.
  • Skrypty: nmf.py, nmf2.py, nmf3.py.

W praktyce

  • W scikit-learn: NMF(n_components=k, init="nndsvda", random_state=0); fit_transform zwraca W, a components_ to H. Dane muszą być nieujemne — nie standaryzuj ich do średniej zero.
  • Inicjalizacja nndsvd/nndsvda (z SVD) jest deterministyczna i zwykle zbiega szybciej niż losowa; przy interpretacji części i tak porównaj kilka losowych startów.
  • Dla tekstów i liczb zdarzeń rozważ beta_loss="kullback-leibler" z solver="mu"; do rzadkości dodaj regularyzację alpha_W, alpha_H, l1_ratio.
  • Liczbę składowych dobieraj krzywą błędu odtworzenia i stabilnością części, a gdy W idzie dalej do modelu — walidacją krzyżową.
  • Gdzie to się psuje: dane z wartościami ujemnymi (trzeba je przesunąć albo wybrać inną metodę), wymóg najmniejszego błędu (wtedy SVD/PCA), duże k z niestabilnymi częściami, wolna zbieżność reguł multiplikatywnych.
  • Wynik NMF to minimum lokalne; nie traktuj jednej rozkładowej „części” jako odkrytej prawdy o danych.

Najczęstsze pytania

Czym NMF różni się od PCA?
PCA szuka prostopadłych kierunków największej wariancji i dopuszcza wartości ujemne, więc składowe się znoszą. NMF wymaga nieujemności i składa dane z części, które się tylko dodają. PCA daje mniejszy błąd przy tej samej liczbie składowych, NMF — części łatwiejsze do nazwania.
Dlaczego wynik NMF zmienia się przy innym ziarnie losowym?
Bo zadanie nie jest wypukłe i ma wiele minimów lokalnych, a do tego rozkład nie jest jednoznaczny. Na cyfrach błąd prawie się nie zmienia (0,3247–0,3273), ale 6% dopasowanych części ma podobieństwo kosinusowe poniżej 0,5.
Czy NMF nadaje się do modelowania tematów w tekstach?
Tak, to jedno z klasycznych zastosowań: macierz dokument × słowo (np. TF-IDF) rozkłada się na tematy (H) i udziały tematów w dokumentach (W). Lee i Seung pokazali to już w 1999 roku na artykułach encyklopedii.
Który algorytm wybrać: multiplikatywny czy zejście po współrzędnych?
Przy błędzie Frobeniusa zwykle zejście po współrzędnych (domyślne `cd` w scikit-learn) — w przykładzie zbiegło w 847 iteracjach do błędu 0,3263, reguły multiplikatywne potrzebowały 3520 iteracji i skończyły na 0,3291. Przy dywergencji Kullbacka–Leiblera scikit-learn oferuje tylko reguły multiplikatywne (`solver="mu"`).

Źródła

Zobacz też

Analiza głównych składowych (PCA) InteraktywnePCA obraca osie tak, by pierwsze łapały najwięcej zmienności, i zastępuje wiele cech kilkoma. Na zbiorze Wine dwie pierwsze składowe wyjaśniają 55,4% wariancji.Rozkład według wartości osobliwych (SVD) InteraktywneSVD rozkłada macierz na obrót, skalowanie i obrót; obcięcie małych wartości osobliwych daje najlepsze przybliżenie. Na cyfrach 10 składowych to 73,8% wariancji.Pułapki PCA InteraktywnePCA łatwo zepsuć: brakiem standaryzacji, wyciekiem danych, nadinterpretacją. Na zbiorze Wine bez standaryzacji pierwsza składowa to 99,8% wariancji.Macierze jako przekształceniaMacierz to przepis na przekształcenie przestrzeni: obraca, rozciąga, rzutuje. Na irysach macierz PCA 2 × 4 rzutuje kwiaty na płaszczyznę z 97,8% rozrzutu.Cechy z tekstu: worek słów i TF-IDF InteraktywneTF-IDF waży słowo wysoko, gdy często pada w dokumencie, a rzadko w zbiorze. Na 25 polskich tekstach stawia odpowiedź na pierwszym miejscu w 2 z 5 pytań.Autoenkoder InteraktywneAutoenkoder to sieć, która uczy się odtwarzać własne wejście przez wąskie gardło. Kod w gardle to skompresowany opis danych, nieliniowe uogólnienie PCA.Uczenie nienadzorowane InteraktywneUczenie nienadzorowane szuka w danych grup, ukrytych kierunków i nietypowych punktów bez etykiet. Na pingwinach Palmer k-średnich po standaryzacji ma ARI 0,79.K-means InteraktywneK-means przypisuje punkty do najbliższych środków i je przesuwa; zwraca k grup, nawet gdy ich brak. Na pingwinach Palmer po standaryzacji ARI wynosi 0,79.