Cursus
Heb je ooit geprobeerd nuttige patronen uit een dataset met duizenden features te halen?
Je weet dat er ergens een bruikbare structuur in zo’n enorme dataset moet zitten. Het probleem is dat ruwe datasets veel ruis, redundantie, ontbrekende waarden en veel meer dimensies bevatten dan je eigenlijk nodig hebt. De meeste machinelearning-algoritmen kunnen met dit soort data niet goed overweg, of in het beste geval vertraagt het de traintijd.
Singular Value Decomposition (SVD) splitst elke matrix (in dit geval een dataset) op in drie eenvoudigere matrices die de kernstructuur laten zien. Het is de wiskunde achter aanbevelingssystemen, beeldcompressie en dimensionaliteitsreductietechnieken zoals PCA – en als je het eenmaal begrijpt, zie je het overal terug in je dagelijkse werk.
In dit artikel neem ik je mee door wat SVD is, hoe het werkt, waar het in data science wordt gebruikt en wanneer je beter voor een alternatief kunt kiezen.
Vind je concepten als vectoren en determinanten verwarrend? Lees dan eerst onze Demystifying Mathematical Concepts for Deep Learning-post voordat je met deze verdergaat.
Wat is Singular Value Decomposition (SVD)?
SVD is een methode die elke matrix opdeelt in drie eenvoudigere matrices.
Stel het je zo voor. Je hebt een matrix A – dat kan een dataset of een afbeelding zijn. SVD splitst A in drie delen:

SVD-formule
-
Uis een orthogonalem x m-matrix. De kolommen heten linkersinguliere vectoren en beschrijven de relaties tussen de rijen vanA -
\Sigmais een diagonalem x n-matrix. De waarden op de diagonaal zijn de singuliere waarden – altijd niet-negatief en gesorteerd van groot naar klein -
V*is de geconjugeerd getransponeerde van een orthogonalen x n-matrix. De rijen heten rechtersinguliere vectoren, en ze beschrijven de relaties tussen de kolommen van A
Elk deel laat iets anders zien van de oorspronkelijke data. U bevat de patronen op rijniveau (hoe rijen zich tot elkaar verhouden), \Sigma bevat de belangrijkheidsgewichten (hoeveel elk patroon bijdraagt) en V* bevat de patronen op kolomniveau (hoe kolommen zich tot elkaar verhouden).
Hier is een analogie. Stel dat je een recept aan iemand uitlegt. Je kunt het opdelen in drie delen: de ingrediënten (wat erin gaat), de verhoudingen (hoeveel van elk) en de stappen (hoe je ze combineert). Geen van die delen vormt op zichzelf het gerecht, maar samen heb je alles wat je moet weten. SVD doet hetzelfde met matrices – het scheidt het “wat”, “hoeveel” en “hoe” in afzonderlijke componenten waar je los mee kunt werken.
Wat SVD uniek maakt in de lineaire algebra is dat het op elke matrix werkt. Hij hoeft niet vierkant te zijn en geen speciale eigenschappen te hebben. Elke m x n-matrix kan zo worden gedecomponeerd, en daarom komt SVD overal terug in data science.
Hoe SVD in de praktijk werkt
Laten we van begin tot eind bekijken hoe SVD werkt.
Uitleg van matrixdecompositie
Stel, je hebt een 3×2-matrix A:

Matrixdecompositie
SVD decomponeert deze in U (3×3), \Sigma (3×2) en V* (2×2). De kolommen van U komen voort uit de eigenvectoren van A x A^T, en de kolommen van V uit de eigenvectoren van A^T x A. De singuliere waarden in \Sigma zijn de vierkantswortels van de eigenwaarden van een van beide producten.
Het goede nieuws is dat je dit niet met de hand hoeft te berekenen. In Python heb je maar één regel code nodig:
import numpy as np
A = np.array([[1, 2], [3, 4], [5, 6]])
U, sigma, Vt = np.linalg.svd(A, full_matrices=True)

Numpy-uitvoer
De drie matrices werken samen via vermenigvuldiging. U roteert de data in de ruimten van de rijen, \Sigma schaalt langs elke as, en V* roteert in de kolomruimte. Het resultaat is de oorspronkelijke matrix A.
Rol van singuliere waarden
De diagonale waarden in \Sigma vertellen je hoeveel elke component bijdraagt aan de totale matrix.
De eerste singuliere waarde is altijd de grootste – die vangt het meest dominante patroon in de data. Elke volgende waarde vangt minder. Als de eerste paar singuliere waarden groot zijn en de rest dicht bij nul, betekent dat dat de meeste informatie in de matrix geconcentreerd zit in slechts een paar componenten.
Dat is wat datacompressie mogelijk maakt.
Je kunt de kleine singuliere waarden (en hun bijbehorende kolommen in U en rijen in V*) weglaten zonder veel informatie te verliezen. Het resultaat is een benadering met lagere rang van de oorspronkelijke matrix die kleiner is en sneller werkt.
Het aantal niet-nul singuliere waarden vertelt je ook de rang van de matrix – het aantal lineair onafhankelijke rijen of kolommen. Als een 100×50-matrix maar 10 niet-nul singuliere waarden heeft, betekent dat dat de data slechts 10 onafhankelijke dimensies heeft. De andere 40 zijn redundant.
De matrix reconstrueren
Je kunt de oorspronkelijke matrix herbouwen door de drie componenten weer met elkaar te vermenigvuldigen:

Matrixreconstructie
Maar wat je meestal wilt, is gedeeltelijke reconstructie. In plaats van alle singuliere waarden te gebruiken, behoud je alleen de hoogste k waarden en de bijbehorende vectoren. Dat geeft je een rang-k-benadering van A:

Rang-k matrixbenadering
De stelling van Eckart-Young garandeert dat deze rang-k-benadering de dichtst mogelijke matrix van rang k is bij de oorspronkelijke A (gemeten met de Frobeniusnorm). Met andere woorden: als je een matrix terugbrengt naar k dimensies, levert SVD het best mogelijke resultaat.
Toepassingen van SVD in data science
Als je erop gaat letten, kom je SVD op meer plekken tegen dan je zou verwachten.
Het idee is steeds om een grote matrix te nemen, de stukken die ertoe doen te behouden en de rest te verwijderen. Wat er verandert, is wat “ertoe doet”, afhankelijk van het probleem.
Dimensionaliteitsreductie
Hoog-dimensionale datasets zijn lastig om mee te werken en te interpreteren. Meer features betekenen langere traintijden en een grotere kans op overfitting. SVD voorkomt dit door het aantal dimensies te verkleinen.
Globaal werkt het zo. Je decomponeert je datamatrix, bekijkt de singuliere waarden en behoudt alleen de hoogste k componenten. De kleine singuliere waarden vertegenwoordigen ruis en kleine variatie, dus het verwijderen ervan heeft nauwelijks effect op de kwaliteit van je data. Wat overblijft is een compacte representatie die het grootste deel van de oorspronkelijke structuur behoudt.
Dit is precies hoe Principal Component Analysis (PCA) werkt. PCA centreert de data en voert daarna SVD uit op het resultaat. De hoofcomponenten zijn de rechtersinguliere vectoren en de singuliere waarden vertellen je hoeveel variantie elke component verklaart.
Aanbevelingssystemen
Bedrijven als Netflix en Amazon hebben enorme gebruiker-itemmatrices waarin de meeste entries leeg zijn. Een gebruiker beoordeelt een paar films uit duizenden, dus de matrix is schaars. SVD helpt om de gaten op te vullen.
Het idee is om de beoordelingsmatrix te ontbinden in gebruikersvoorkeuren en itemkenmerken. De U-matrix representeert waar elke gebruiker om geeft (genre, tempo, toon), en V* representeert wat elk item biedt. De singuliere waarden in \Sigma schalen deze factoren op belangrijkheid. Als je ze weer met elkaar vermenigvuldigt, krijg je voorspelde ratings voor films die een gebruiker nog niet heeft gezien.
In de praktijk werkt standaard SVD niet direct op schaarse matrices omdat het ontbrekende waarden als nullen behandelt. Daarom gebruiken systemen varianten zoals truncated SVD of matrixfactorisatie die alleen op geobserveerde entries werken.
Beeldcompressie
Een grijswaardenafbeelding is gewoon een matrix van pixelwaarden. SVD kan die comprimeren door alleen de belangrijkste singuliere waarden te behouden.
Stel dat je een 1000×1000-afbeelding hebt. Volledige SVD levert 1000 singuliere waarden op. Maar als je alleen de bovenste 50 behoudt, reconstrueer je de afbeelding met slechts 50 componenten in plaats van 1000. De afbeelding wordt iets waziger, maar blijft herkenbaar – en de opslag daalt van 1.000.000 waarden naar ongeveer 100.500 (50 kolommen van U + 50 singuliere waarden + 50 rijen van V*).
Meer singuliere waarden betekent betere beeldkwaliteit maar minder compressie. Minder waarden betekent kleinere bestanden maar meer verlies. Jij bepaalt waar die balans ligt voor jouw usecase.
Prestatieoverwegingen en beperkingen
Hoe groter je matrix, hoe hoger de rekenkosten.
Rekenkosten
Volledige SVD op een m x n-matrix heeft een tijdscomplexiteit van O(mn²) (aangenomen dat m >= n). Voor kleine matrices is dat prima. Voor een matrix met miljoenen rijen en duizenden kolommen is het duur.
Geheugen is de andere bottleneck. Volledige SVD produceert drie dichte matrices en die allemaal tegelijk opslaan kan je beschikbare RAM overschrijden.
De oplossing is om volledige SVD te vermijden wanneer het niet nodig is. Truncated SVD berekent alleen de bovenste k singuliere waarden en hun vectoren, wat veel sneller is. In Python doen scipy.sparse.linalg.svds en sklearn.decomposition.TruncatedSVD dit allebei. Randomized SVD gaat nog verder door willekeurige sampling te gebruiken om de decompositie te benaderen, en werkt goed wanneer je alleen de dominante componenten nodig hebt.
Stabiliteit en nauwkeurigheid
SVD is in de meeste gevallen numeriek stabiel, maar kan moeite hebben met bepaalde patronen in data.
Sterk rumoerige data is één voorbeeld. Als de signaal-ruisverhouding laag is, scheiden de hoogste singuliere waarden zich niet van de ruis. Je houdt dan ruis in je benadering of je vermindert signaal wanneer je afkapt.
Slecht geconditioneerde matrices zijn een ander probleem. Wanneer de verhouding tussen de grootste en kleinste singuliere waarde enorm is (een hoge conditiegetal), worden kleine numerieke fouten tijdens de berekening uitvergroot. Dat kan onbetrouwbare resultaten opleveren, vooral met beperkingen in drijvende-kommanauwkeurigheid.
De oplossing is om je singuliere waarden te inspecteren voordat je afkapt. Plot ze en zoek naar een duidelijke knik tussen signaal en ruis. Als het verval geleidelijk is zonder duidelijke “elleboog”, is SVD mogelijk niet het beste hulpmiddel voor die dataset.
Alternatieven voor SVD
SVD is niet de enige matrixdecompositie en ook niet altijd de beste keuze voor elke klus.
Elk alternatief hieronder lost een specifiek soort probleem op. Het zijn geen vervangers voor SVD, omdat ze onder andere aannames en beperkingen werken. De juiste keuze hangt, zoals altijd, af van de taak die je wilt uitvoeren.
Eigendecompositie
Eigendecompositie is het nauwst verwant aan SVD. Het splitst een vierkante matrix op in eigenwaarden en eigenvectoren:

Formule voor eigendecompositie
Waar Q de eigenvectoren bevat en \Lambda een diagonale matrix met eigenwaarden is.
Het nadeel is dat het alleen werkt op vierkante matrices. Als je datamatrix m x n is waarbij m != n, kan eigendecompositie er niet direct mee overweg. SVD werkt op elke matrixvorm, en is daarom het algemenere hulpmiddel.
Voor vierkante, symmetrische matrices (zoals covariantiematrices) leveren eigendecompositie en SVD nauw verwante resultaten op. De singuliere waarden van een symmetrische positieve semidefinitieve matrix zijn de eigenwaarden. Dus als je met covariantiematrices in PCA werkt, leveren beide methoden dezelfde resultaten op. SVD is gewoon de variant die generaliseert naar niet-vierkante gevallen.
QR-decompositie
QR-decompositie splitst een matrix in een orthogonale matrix Q en een boventriangulaire matrix R:

Formule voor QR-decompositie
Het is sneller dan SVD voor bepaalde taken, vooral voor het oplossen van stelsels van lineaire vergelijkingen en kleinste-kwadratenproblemen.
De keerzijde is informatie. QR geeft je geen singuliere waarden, dus kan het je niets vertellen over de rang van je matrix of welke componenten het meeste gewicht dragen. Als je Ax = b wilt oplossen en de onderliggende structuur je niet interesseert, is QR een goede optie. Maar als je de data wilt begrijpen of comprimeren, is SVD de betere keuze.
Niet-negatieve matrixfactorisatie (NMF)
NMF decomponeert een matrix in twee matrices waarbij alle waarden niet-negatief zijn:

NMF-formule
Deze beperking maakt NMF heel geschikt voor data die van nature niet-negatief is (denk aan pixelintensiteiten of woordfrequenties). SVD dwingt dat niet af. De gedecomponeerde matrices kunnen negatieve waarden hebben, wat soms componenten oplevert die lastig te interpreteren zijn.
NMF is vooral populair in tekstanalyse en topicmodellen. Elke kolom van W kan een topic voorstellen, en elke rij van H laat zien hoeveel van dat topic in elk document voorkomt. De niet-negatieve beperking betekent dat topics worden opgebouwd uit additieve combinaties van woorden, wat ze leesbaarder maakt dan de gemengde-tekentekencomponenten van SVD.
Het nadeel is dat NMF geen unieke oplossing garandeert, en de uitkomst hangt af van de initialisatie. SVD levert voor dezelfde input altijd dezelfde output.
Randomized SVD
Als je matrix te groot is voor volledige SVD maar je toch singuliere waarden wilt, is randomized SVD het bekijken waard. Het gebruikt willekeurige projecties om de bovenste k singuliere waarden en vectoren te benaderen zonder de volledige decompositie te berekenen. Bibliotheken zoals scikit-learn (TruncatedSVD) en Facebook’s fbpca implementeren deze aanpak, en het schaalt goed naar matrices met miljoenen rijen.
De onderstaande tabel vat samen wanneer je welke methode kiest.

Alternatieven voor SVD
Andere overwegingen bij SVD
Een paar veelvoorkomende zaken zorgen voor verwarring bij veel beginnende data scientists.
Singuliere waarden verkeerd lezen is de eerste. Een grote singuliere waarde betekent dat die component veel variantie in de data verklaart – het betekent niet dat die component “belangrijk” is in een domeinspecifieke zin. De dominante singuliere waarde in een gebruikersbeoordelingsmatrix kan bijvoorbeeld vangen dat de meeste mensen populaire films beoordelen, niet een betekenisvol voorkeurspatroon. Interpreteer singuliere waarden altijd in de context van je data, niet alleen op basis van hun grootte.
Naar SVD grijpen wanneer het niet nodig is is de tweede. Bij kleine datasets (een paar honderd rijen en een handvol kolommen) voegt SVD alleen onnodige complexiteit toe. Eenvoudige methoden zoals correlatieanalyse of basale featureselectie doen het werk vaak sneller en met minder code. SVD is geweldig bij hoog-dimensionale data met redundante structuur – als je dataset daar niet onder valt, kies dan simpelere methoden.
Conclusie
SVD splitst elke matrix op in drie componenten die de structuur laten zien. De singuliere waarden vertellen je welke delen van de data het meest relevant zijn, en de linker- en rechtersinguliere vectoren laten de rij- en kolompatronen erachter zien.
Die decompositie ligt ten grondslag aan veel praktische tools die je dagelijks gebruikt. Aanbevelingssystemen gebruiken het om ontbrekende ratings te voorspellen. Beeldcompressie gebruikt het om bestandsgroottes te verkleinen met behoud van visuele kwaliteit. De wiskunde erachter is bijna identiek, ook al zijn de domeinen totaal verschillend.
Maar SVD is niet altijd het juiste hulpmiddel. Het is kostbaar op grote matrices en kan signaal met ruis vermengen als singuliere waarden niet goed scheiden. Ook is het overkill voor kleine datasets. Alternatieven zoals QR-decompositie, eigendecompositie en NMF behandelen elk specifieke gevallen beter.
De sleutel is weten wanneer je SVD moet gebruiken en wanneer iets eenvoudigere het beter doet. En om die kennis op te doen, schrijf je je in voor onze Machine Learning Scientist in Python-track en word job-ready in 2026.
SVD FAQ's
Wat is Singular Value Decomposition (SVD)?
SVD is een matrixdecompositiemethode die elke matrix opsplitst in drie componenten: linkersinguliere vectoren (U), singuliere waarden (Σ) en rechtersinguliere vectoren (V*). Het werkt op elke matrix, ongeacht vorm of grootte. SVD laat de onderliggende structuur van data zien door die op te splitsen in patronen en hun relatieve belangrijkheid.
Waarom wordt SVD gebruikt in data science en machine learning?
SVD helpt het aantal dimensies in hoog-dimensionale datasets te verkleinen terwijl de belangrijkste patronen behouden blijven. Het is de wiskunde achter PCA en aanbevelingssystemen. Deze toepassingen steunen allemaal op hetzelfde idee: de dominante componenten behouden en de rest verwijderen.
Wat is het verschil tussen SVD en eigendecompositie?
Eigendecompositie werkt alleen op vierkante matrices, terwijl SVD op elke matrixvorm werkt. Voor vierkante, symmetrische matrices zoals covariantiematrices leveren beide methoden nauw verwante resultaten op – de singuliere waarden van een positieve semidefinitieve matrix zijn de eigenwaarden. SVD is het algemenere hulpmiddel en daarom de standaard in de meeste data science-workflows.
Hoe verhouden singuliere waarden zich tot datacompressie?
Singuliere waarden zijn gesorteerd van groot naar klein, en elk geeft aan hoeveel variantie een bepaalde component verklaart. Door de kleine singuliere waarden (en hun bijbehorende vectoren) te verwijderen, haal je kleine patronen en ruis weg terwijl je de dominante structuur behoudt. Je ruilt een klein verlies aan nauwkeurigheid in voor een grote reductie in omvang.
Wanneer moet ik SVD vermijden?
SVD is duur voor grote matrices, met een tijdscomplexiteit van O(mn^2) voor volledige decompositie. Voor kleine datasets met een paar features doen eenvoudigere methoden zoals correlatieanalyse of basale featureselectie het werk sneller. Als je matrix erg groot is en je alleen de topcomponenten nodig hebt, is truncated of randomized SVD geschikter dan volledige SVD.
