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
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)iTruncatedSVD(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ównaniaPCA(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_state0–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_transformzwraca W, acomponents_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"zsolver="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
- Lee, D. D., Seung, H. S. (1999). „Learning the parts of objects by non-negative matrix factorization”. Nature, 401(6755), 788–791. https://doi.org/10.1038/44565
- Lee, D. D., Seung, H. S. (2001). „Algorithms for non-negative matrix factorization”. Advances in Neural Information Processing Systems 13 (NIPS 2000), 556–562. https://papers.nips.cc/paper/2000/hash/f9d1152547c0bde01830b7e8bd60024c-Abstract.html
- Cichocki, A., Phan, A.-H. (2009). „Fast local algorithms for large scale nonnegative matrix and tensor factorizations”. IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences, E92-A(3), 708–721.
- Donoho, D., Stodden, V. (2004). „When does non-negative matrix factorization give a correct decomposition into parts?”. Advances in Neural Information Processing Systems 16 (NIPS 2003), 1141–1148. https://proceedings.neurips.cc/paper/2003/hash/1843e35d41ccf6e63273495ba42df3c1-Abstract.html
- scikit-learn: „Non-negative matrix factorization (NMF or NNMF)” (podręcznik użytkownika,
NMF). https://scikit-learn.org/stable/modules/decomposition.html#nmf
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.