nmf

nmf

##set_nmf

Description

L'action nmf effectue une factorisation de matrice non négative (Nonnegative Matrix Factorization ). Elle décompose une matrice de donnéesStructure de données bidimensionnelle organisée en lignes (observations) et colonnes (variables), stockée en mémoire distribuée (CAS) pour permettre des traitements analytiques haute performance. d'entrée V (composée uniquement de valeurs positives ou nulles) en un produit de deux matrices de rang inférieur, W et H, telles que V ≈ W × H. C'est l'outil idéal pour la réduction de dimension, le clusteringLe clustering est une technique d'apprentissage non supervisé regroupant des données similaires en segments homogènes afin d'identifier des structures cachées sans étiquettes préalables. de variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. ou la complétion de données manquantes. Contrairement à l'ACPTechnique de réduction de dimension transformant des variables corrélées en nouvelles composantes principales décorrélées, tout en conservant le maximum de variance (information) des données originales. (PCA), la NMF produit des parties additives qui sont souvent plus faciles à interpréter : ici, on ne soustrait rien, on additionne des composants positifs pour reconstruire la réalité. C'est un peu comme une recette de cuisine : on ajoute des ingrédients, on n'en retire jamais ! 👩‍🍳

Syntaxe Officielle
nmf.nmf <result=results> <status=rc> /
attributes={{format="string", formattedLength=integer, label="string", *name="variable-name", nfd=integer, nfl=integer}, {...}},
display={caseSensitive=TRUE | FALSE, exclude=TRUE | FALSE, excludeAll=TRUE | FALSE, keyIsPath=TRUE | FALSE, names={"string-1" <, "string-2", ...>}, pathType="LABEL" | "NAME", traceNames=TRUE | FALSE},
groupByLimit=64-bit-integer,
impute="NONE" | {copyVars={"var1", ...}, imputedRowsOnly=TRUE | FALSE, *output={casouttable}, predOnly=TRUE | FALSE},
inputs={{casinvardesc}, {...}},
iterationDetail=TRUE | FALSE,
*method={delta=double, maxIter=integer, *name="APG" | "RANDOM", oversampling=integer, subIter=integer, tolerance=double, updates=integer},
missing="MEAN" | "NONE",
noScale=TRUE | FALSE,
output={*casOut={casouttable}, component="string", copyVars={"var1", ...}},
outputH={*casOut={casouttable}},
outputTables={groupByVarsRaw=TRUE | FALSE, includeAll=TRUE | FALSE, names={"string-1", ...}, repeated=TRUE | FALSE, replace=TRUE | FALSE},
prefix="string",
*rank=integer,
regularization={alpha=double, beta=double, lcurve=TRUE | FALSE, *name="L1" | "L2"},
seed=integer,
stopMeasure="OBJFUNC" | "PROJGRAD",
*table={castable};

Paramètres Clés

Nom du paramètre Description
table Spécifie la table CAS d'entrée contenant les données numériques non négatives à factoriser .
rank Définit le rang cible (le nombre de composants) pour la décomposition. Plus le rang est bas, plus la compression est forte (mais attention à ne pas perdre trop de saveur !) .
method Choisit l'algorithme : 'APG' (Alternating Proximal Gradient) pour la précision ou 'RANDOM' (Random Projections) pour la vitesse sur de très grandes matrices .
output Spécifie la table de sortie pour la matrice W (les scores des observations sur les nouveaux composants) .
outputH Spécifie la table de sortie pour la matrice H (les coefficients des variables originales sur les composants) .
impute Permet de remplir les valeurs manquantes dans la matrice originale en utilisant la structure de rang inférieur apprise .
regularization Ajoute des contraintes L1 (Lasso) ou L2 (Ridge) pour éviter le surapprentissage et encourager la parcimonie (matrices plus 'creuses') .

Préparation des données

Création de données de test non négatives

Génération d'un petit jeu de données de consommation factice (toujours positif) pour tester la factorisation.

1DATA casuser.consommation; INPUT client $ cafe pain chocolat fruit; DATALINES; C1 5 2 0 1 C2 0 1 5 4 C3 4 2 1 0 C4 1 0 4 5 C5 5 3 0 0 C6 0 1 4 6 ; RUN;

Exemples d'utilisation

Factorisation basique

Décomposition en 2 composants pour identifier deux profils types de consommation.

1PROC CAS; nmf.nmf TABLE={name='consommation'}, rank=2, method={name='APG'}, OUTPUT={casOut={name='matrice_W', replace=true}}, outputH={casOut={name='matrice_H', replace=true}}; RUN;
Résultat Attendu :
Génère deux tables : matrice_W (profils clients) et matrice_H (poids des produits dans chaque profil).
Complétion de données (Imputation) et Régularisation

Utilisation de la NMF pour boucher les trous (valeurs manquantes) avec une pénalité L1 pour la parcimonie.

1PROC CAS; DATA casuser.manquant; SET casuser.consommation; IF _n_ = 1 THEN cafe = .; IF _n_ = 2 THEN fruit = .; RUN; nmf.nmf TABLE={name='manquant'}, rank=2, method={name='APG', maxIter=1000}, regularization={name='L1', alpha=0.1, beta=0.1}, impute={OUTPUT={name='donnees_completees', replace=true}}, OUTPUT={casOut={name='scores_W', replace=true}}, outputH={casOut={name='coeffs_H', replace=true}}; RUN;
Résultat Attendu :
La table 'donnees_completees' contient les données originales avec les valeurs manquantes estimées par le modèle NMF.