{"id":13391,"date":"2026-10-14T18:02:37","date_gmt":"2026-10-14T18:02:37","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-normaliser-une-matrice-numpy-exemples\/"},"modified":"2026-10-14T18:02:37","modified_gmt":"2026-10-14T18:02:37","slug":"comment-normaliser-une-matrice-numpy-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-normaliser-une-matrice-numpy-exemples","title":{"rendered":"Comment normaliser une matrice NumPy (avec exemples)"},"content":{"rendered":"<p>Dans le domaine du calcul scientifique, de l&rsquo;apprentissage automatique et du traitement du signal, la manipulation de structures matricielles constitue le socle op\u00e9rationnel de la quasi-totalit\u00e9 des algorithmes contemporains. Qu&rsquo;il s&rsquo;agisse de traiter des images num\u00e9riques repr\u00e9sent\u00e9es sous forme de grilles de pixels, de mod\u00e9liser des r\u00e9seaux complexes via des matrices d&rsquo;adjacence ou de manipuler des tableaux d&rsquo;observations statistiques au sein desquels les lignes d\u00e9crivent des individus et les colonnes des variables quantitatives, les donn\u00e9es brutes pr\u00e9sentent une h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 d&rsquo;\u00e9chelles intrins\u00e8que. Cette disparit\u00e9 d&rsquo;amplitudes num\u00e9riques alt\u00e8re la g\u00e9om\u00e9trie sous-jacente des espaces vectoriels consid\u00e9r\u00e9s, introduisant des distorsions pr\u00e9judiciables lors de l&rsquo;application de m\u00e9triques de distance ou d&rsquo;op\u00e9rateurs diff\u00e9rentiels. Face \u00e0 cette probl\u00e9matique, la normalisation matricielle s&rsquo;impose comme une transformation math\u00e9matique fondamentale visant \u00e0 ramener les composantes scalaires d&rsquo;un tenseur bidimensionnel vers une \u00e9chelle commune pr\u00e9d\u00e9termin\u00e9e, tout en pr\u00e9servant scrupuleusement les relations structurelles et les proportions relatives qui caract\u00e9risent le ph\u00e9nom\u00e8ne \u00e9tudi\u00e9.<\/p>\n<p>L&rsquo;\u00e9cosyst\u00e8me Python d\u00e9di\u00e9 \u00e0 l&rsquo;analyse computationnelle s&rsquo;articule autour de la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\">NumPy<\/a>, qui fournit une structure de donn\u00e9es optimis\u00e9e &mdash; le tableau multidimensionnel <code>ndarray<\/code> &mdash; coupl\u00e9e \u00e0 des routines d&rsquo;alg\u00e8bre lin\u00e9aire de bas niveau interfac\u00e9es avec des biblioth\u00e8ques hautement optimis\u00e9es telles que BLAS et LAPACK. En compl\u00e9ment, l&rsquo;environnement de mod\u00e9lisation statistique s&rsquo;appuie fr\u00e9quemment sur <a rel=\"noopener noreferrer\" href=\"https:\/\/scikit-learn.org\">Scikit-Learn<\/a> pour standardiser et automatiser les protocoles de pr\u00e9traitement des donn\u00e9es. Toutefois, l&rsquo;op\u00e9ration consistant \u00e0 normaliser une matrice NumPy ne se r\u00e9sume pas \u00e0 l&rsquo;ex\u00e9cution machinale d&rsquo;une fonction logicielle standard. Elle requiert une compr\u00e9hension fine de la topologie vectorielle, du choix d\u00e9lib\u00e9r\u00e9 de la norme math\u00e9matique mise en \u0153uvre (telle que la norme de Manhattan, la norme euclidienne ou la norme de Chebyshev), ainsi que de l&rsquo;orientation axiale selon laquelle l&rsquo;op\u00e9ration doit \u00eatre d\u00e9ploy\u00e9e. Une confusion entre une normalisation colonnaire et une normalisation par ligne peut d\u00e9naturer la signification statistique d&rsquo;un jeu de donn\u00e9es et invalider l&rsquo;int\u00e9gralit\u00e9 d&rsquo;un pipeline analytique.<\/p>\n<p>Le pr\u00e9sent article propose un examen exhaustif et rigoureux des m\u00e9thodologies th\u00e9oriques et appliqu\u00e9es permettant de normaliser une matrice NumPy. En explorant successivement les fondements alg\u00e9briques des normes d&rsquo;espaces vectoriels, les m\u00e9canismes internes de la biblioth\u00e8que Scikit-Learn, les impl\u00e9mentations vectoris\u00e9es natives en NumPy pur fond\u00e9es sur le paradigme de diffusion (<em>broadcasting<\/em>), ainsi que les enjeux de stabilit\u00e9 num\u00e9rique et d&rsquo;efficacit\u00e9 computationnelle sur des architectures mat\u00e9rielles modernes, ce guide fournit aux chercheurs, ing\u00e9nieurs et analystes quantitatifs le cadre conceptuel et technique n\u00e9cessaire pour ma\u00eetriser cette \u00e9tape cardinale du pr\u00e9traitement des donn\u00e9es num\u00e9riques.<\/p>\n<h2>1. Fondements math\u00e9matiques et conceptuels de la normalisation matricielle<\/h2>\n<h3>1.1 D\u00e9finition formelle de la normalisation matricielle<\/h3>\n<p>D&rsquo;un point de vue alg\u00e9brique, une matrice <span class=\"arabpsy-math-inline\" data-latex=\"A in \\mathbb{R}^{m \\times n}\">$A in \\mathbb{R}^{m \\times n}$<\/span> peut \u00eatre conceptualis\u00e9e soit comme un tenseur d&rsquo;ordre deux appartenant \u00e0 l&rsquo;espace vectoriel des matrices \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"m\">$m$<\/span> lignes et <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> colonnes, soit comme une collection ordonn\u00e9e de vecteurs de dimension finie. Lorsque l&rsquo;on envisage la matrice \u00e0 travers le prisme de ses vecteurs lignes <span class=\"arabpsy-math-inline\" data-latex=\"x_i in \\mathbb{R}^n\">$x_i in \\mathbb{R}^n$<\/span> (pour <span class=\"arabpsy-math-inline\" data-latex=\"i in {1, dots, m}\">$i in {1, dots, m}$<\/span>) ou de ses vecteurs colonnes <span class=\"arabpsy-math-inline\" data-latex=\"y_j in \\mathbb{R}^m\">$y_j in \\mathbb{R}^m$<\/span> (pour <span class=\"arabpsy-math-inline\" data-latex=\"j in {1, dots, n}\">$j in {1, dots, n}$<\/span>), la normalisation consiste en l&rsquo;application d&rsquo;une transformation fonctionnelle visant \u00e0 projeter ces vecteurs sur un sous-ensemble compact ou sur la sph\u00e8re unit\u00e9 induite par une m\u00e9trique donn\u00e9e. L&rsquo;objectif fondamental est d&rsquo;\u00e9tablir une \u00e9chelle commune pr\u00e9d\u00e9finie tout en veillant au maintien strict des proportions relatives entre les composantes scalaires individuelles de chaque vecteur transform\u00e9.<\/p>\n<p>La pr\u00e9servation de la g\u00e9om\u00e9trie vectorielle sous-jacente constitue un imp\u00e9ratif cat\u00e9gorique. Si l&rsquo;on applique une homoth\u00e9tie scalaire positive \u00e0 un vecteur donn\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"v in \\mathbb{R}^k\">$v in \\mathbb{R}^k$<\/span>, l&rsquo;orientation angulaire de ce vecteur dans l&rsquo;espace euclidien demeure invariante. En d&rsquo;autres termes, pour tout scalaire <span class=\"arabpsy-math-inline\" data-latex=\"lambda &gt; 0\">$lambda > 0$<\/span>, le vecteur transform\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{v} = \\lambda v\">$\\tilde{v} = \\lambda v$<\/span> conserve la direction initiale de <span class=\"arabpsy-math-inline\" data-latex=\"v\">$v$<\/span>, garantissant que les angles form\u00e9s avec d&rsquo;autres vecteurs &mdash; captur\u00e9s par le produit scalaire usuel &mdash; ne subissent aucune d\u00e9formation distordue. Dans le formalisme des <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Normed_vector_space\">espaces vectoriels norm\u00e9s<\/a>, une norme sur un espace vectoriel r\u00e9el <span class=\"arabpsy-math-inline\" data-latex=\"E\">$E$<\/span> est une application positive <span class=\"arabpsy-math-inline\" data-latex=\"p: E to \\mathbb{R}_+\">$p: E to \\mathbb{R}_+$<\/span> satisfaisant les axiomes de s\u00e9paration (<span class=\"arabpsy-math-inline\" data-latex=\"p(v) = 0 implies v = 0\">$p(v) = 0 implies v = 0$<\/span>), d&rsquo;homog\u00e9n\u00e9it\u00e9 absolue (<span class=\"arabpsy-math-inline\" data-latex=\"p(\\alpha v) = |alpha| p(v)\">$p(\\alpha v) = |alpha| p(v)$<\/span> pour tout <span class=\"arabpsy-math-inline\" data-latex=\"\\alpha in \\mathbb{R}\">$\\alpha in \\mathbb{R}$<\/span>) et de sous-additivit\u00e9 ou in\u00e9galit\u00e9 triangulaire (<span class=\"arabpsy-math-inline\" data-latex=\"p(u + v) le p(u) + p(v)\">$p(u + v) le p(u) + p(v)$<\/span>). Normaliser un vecteur <span class=\"arabpsy-math-inline\" data-latex=\"v\">$v$<\/span> consiste alors \u00e0 d\u00e9terminer l&rsquo;\u00e9l\u00e9ment unitaire <span class=\"arabpsy-math-inline\" data-latex=\"u = v \/ p(v)\">$u = v \/ p(v)$<\/span> situ\u00e9 sur la fronti\u00e8re de la boule unit\u00e9 associ\u00e9e \u00e0 la norme <span class=\"arabpsy-math-inline\" data-latex=\"p\">$p$<\/span>.<\/p>\n<p>Cette rigueur math\u00e9matique s&rsquo;\u00e9tend aux applications lin\u00e9aires repr\u00e9sent\u00e9es par ces matrices. Lorsqu&rsquo;une matrice op\u00e8re comme un op\u00e9rateur lin\u00e9aire entre deux espaces de Hilbert ou de Banach, la mise \u00e0 l&rsquo;\u00e9chelle de ses \u00e9l\u00e9ments module directement son spectre d&rsquo;op\u00e9rateur, son conditionnement et ses valeurs singuli\u00e8res. Comprendre la normalisation matricielle exige ainsi de distinguer si l&rsquo;op\u00e9ration cherche \u00e0 r\u00e9gulariser les propri\u00e9t\u00e9s de l&rsquo;op\u00e9rateur lin\u00e9aire dans son ensemble, ou si elle vise \u00e0 conditionner ind\u00e9pendamment les sous-espaces statistiques form\u00e9s par les lignes ou les colonnes de la structure tabulaire.<\/p>\n<h3>1.2 Diff\u00e9renciation critique : normalisation, standardisation et redimensionnement<\/h3>\n<p>Dans la litt\u00e9rature scientifique et les applications en science des donn\u00e9es, une confusion r\u00e9currente persiste entre les notions de normalisation, de standardisation et de redimensionnement (<em>scaling<\/em>). Bien que ces termes soient occasionnellement employ\u00e9s de mani\u00e8re interchangeable dans des contextes informels, ils recouvrent des r\u00e9alit\u00e9s analytiques radicalement distinctes qui engagent des hypoth\u00e8ses sous-jacentes divergentes concernant la distribution des observations. La standardisation, fr\u00e9quemment d\u00e9nomm\u00e9e centrage-r\u00e9duction ou transformation <span class=\"arabpsy-math-inline\" data-latex=\"z\">$z$<\/span>-score, s&rsquo;exprime pour une variable <span class=\"arabpsy-math-inline\" data-latex=\"X\">$X$<\/span> par la relation <span class=\"arabpsy-math-inline\" data-latex=\"z = (X - \\mu) \/ \\sigma\">$z = (X &#8211; \\mu) \/ \\sigma$<\/span>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mu\">$\\mu$<\/span> d\u00e9signe l&rsquo;esp\u00e9rance math\u00e9matique (ou la moyenne empirique) et <span class=\"arabpsy-math-inline\" data-latex=\"\\sigma\">$\\sigma$<\/span> repr\u00e9sente l&rsquo;\u00e9cart-type de la population. Cette transformation affine translate le centro\u00efde de la distribution vers l&rsquo;origine tout en contraignant la variance empirique \u00e0 l&rsquo;unit\u00e9, sans toutefois contraindre le domaine de d\u00e9finition de la variable transform\u00e9e, qui demeure potentiellement infini.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, la normalisation vectorielle &mdash; au sens g\u00e9om\u00e9trique &mdash; divise chaque vecteur par sa norme <span class=\"arabpsy-math-inline\" data-latex=\"L_p\">$L_p$<\/span>, contraignant sa longueur totale \u00e0 valoir exactement un sans op\u00e9rer de translation pr\u00e9liminaire de l&rsquo;origine. Le redimensionnement Min-Max, quant \u00e0 lui, op\u00e8re une transformation affine born\u00e9e de la forme <span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{X} = (X - X_{\\min}) \/ (X_{\\max} - X_{\\min})\">$\\tilde{X} = (X &#8211; X_{\\min}) \/ (X_{\\max} &#8211; X_{\\min})$<\/span>, projetant strictement l&rsquo;ensemble des donn\u00e9es num\u00e9riques au sein du compact ferm\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span>. Cette distinction th\u00e9orique entra\u00eene des cons\u00e9quences imm\u00e9diates : l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span> est id\u00e9al pour des algorithmes exigeant des variables born\u00e9es ou mod\u00e9lisant des probabilit\u00e9s, tandis que le centrage-r\u00e9duction s&rsquo;adapte naturellement aux distributions gaussiennes et aux mod\u00e8les lin\u00e9aires r\u00e9gularis\u00e9s o\u00f9 la notion de d\u00e9viation par rapport \u00e0 la moyenne centrale conditionne le comportement des estimateurs statistiques.<\/p>\n<p>De surcro\u00eet, la sensibilit\u00e9 diff\u00e9rentielle aux valeurs aberrantes (<em>outliers<\/em>) constitue un crit\u00e8re de s\u00e9lection m\u00e9thodologique d\u00e9cisif en analyse quantitative. La mise \u00e0 l&rsquo;\u00e9chelle Min-Max s&rsquo;av\u00e8re extr\u00eamement vuln\u00e9rable aux artefacts extr\u00eames, car une seule valeur aberrante suffit \u00e0 \u00e9craser la quasi-totalit\u00e9 des observations interm\u00e9diaires dans un sous-intervalle infinit\u00e9simal. La standardisation z-score, bien que moins vuln\u00e9rable, subit \u00e9galement l&rsquo;influence des valeurs extr\u00eames sur le calcul de la moyenne et de la variance. La normalisation vectorielle (particuli\u00e8rement via les normes <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> ou <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>), en revanche, dilue l&rsquo;impact des composantes extr\u00eames \u00e0 l&rsquo;\u00e9chelle d&rsquo;un vecteur donn\u00e9 tout en pr\u00e9servant le profil multidimensionnel de l&rsquo;observation. Le choix entre ces paradigmes repose donc sur la nature probabiliste du processus g\u00e9n\u00e9rateur de donn\u00e9es et sur les contraintes formelles impos\u00e9es par les mod\u00e8les math\u00e9matiques en aval.<\/p>\n<h3>1.3 R\u00f4le de la normalisation dans le traitement de donn\u00e9es computationnelles<\/h3>\n<p>L&rsquo;omnipr\u00e9sence de la normalisation au sein des pipelines de calcul scientifique d\u00e9coule d&rsquo;imp\u00e9ratifs tant g\u00e9om\u00e9triques que d&rsquo;optimisation num\u00e9rique. Dans le cadre de l&rsquo;apprentissage automatique, les algorithmes fond\u00e9s sur des calculs de proximit\u00e9 &mdash; tels que les <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>-plus proches voisins, le partitionnement par <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>-moyennes ou les machines \u00e0 vecteurs de support &mdash; reposent sur l&rsquo;\u00e9valuation de distances euclidiennes dans <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{R}^n\">$\\mathbb{R}^n$<\/span>. Si une caract\u00e9ristique poss\u00e8de une amplitude num\u00e9rique de l&rsquo;ordre de <span class=\"arabpsy-math-inline\" data-latex=\"10^5\">$10^5$<\/span> (par exemple des revenus annuels en unit\u00e9s mon\u00e9taires) tandis qu&rsquo;une autre caract\u00e9ristique varie sur une \u00e9chelle de <span class=\"arabpsy-math-inline\" data-latex=\"10^{-1}\">$10^{-1}$<\/span> (comme un taux de concentration biologique), la premi\u00e8re dominera \u00e9crasamment la m\u00e9trique de distance, rel\u00e9guant la seconde \u00e0 un r\u00f4le statistiquement n\u00e9gligeable en d\u00e9pit de son \u00e9ventuelle pertinence causale. La normalisation att\u00e9nue ce biais d&rsquo;\u00e9chelle et restaure l&rsquo;isotropie de l&rsquo;espace m\u00e9trique.<\/p>\n<p>Sur le plan de l&rsquo;optimisation non lin\u00e9aire, la normalisation matricielle joue un r\u00f4le d\u00e9terminant dans l&rsquo;acc\u00e9l\u00e9ration de la convergence des algorithmes de descente de gradient et de leurs variantes stochastiques (telles qu&rsquo;Adam ou RMSprop). Les surfaces de co\u00fbt associ\u00e9es \u00e0 des donn\u00e9es non normalis\u00e9es pr\u00e9sentent typiquement des formes d&rsquo;ellipso\u00efdes \u00e9tir\u00e9s, caract\u00e9ris\u00e9es par un nombre de conditionnement \u00e9lev\u00e9 de la <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Hessian_matrix\">matrice hessienne<\/a>. Dans une telle g\u00e9om\u00e9trie, le gradient oscille de mani\u00e8re orthogonale aux directions de plus forte pente, ralentissant dramatiquement la convergence vers l&rsquo;optimum global ou local. Une mise \u00e0 l&rsquo;\u00e9chelle rigoureuse transforme la topologie de la fonction de perte en cuvettes quasi-sph\u00e9riques, autorisant des taux d&rsquo;apprentissage plus \u00e9lev\u00e9s et assurant des trajectoires d&rsquo;optimisation directes et stables.<\/p>\n<p>Enfin, dans l&rsquo;architecture des r\u00e9seaux de neurones profonds, la normalisation &mdash; qu&rsquo;elle prenne la forme d&rsquo;un pr\u00e9traitement matriciel des entr\u00e9es ou de m\u00e9canismes dynamiques internes tels que la <em>Batch Normalization<\/em> ou la <em>Layer Normalization<\/em> &mdash; pr\u00e9vient l&rsquo;effondrement des signaux computationnels caus\u00e9 par l&rsquo;explosion ou la disparition du gradient. En maintenant la variance des activations et des flux r\u00e9tropropag\u00e9s dans des intervalles contr\u00f4l\u00e9s tout au long des couches du r\u00e9seau, la normalisation assure la pr\u00e9servation de l&rsquo;information informationnelle et stabilise le conditionnement dynamique des produits tensoriels successifs.<\/p>\n<h2>2. Typologie des normes vectorielles applicables aux matrices<\/h2>\n<h3>2.1 La norme de Manhattan (Norme L1)<\/h3>\n<p>La norme de Manhattan, canoniquement d\u00e9sign\u00e9e sous le symbole de la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> ou norme de taxicab, trouve sa formulation alg\u00e9brique fondamentale dans la sommation des valeurs absolues des composantes individuelles constituant le vecteur. Pour un vecteur arbitraire <span class=\"arabpsy-math-inline\" data-latex=\"x = (x_1, x_2, dots, x_k)^T in \\mathbb{R}^k\">$x = (x_1, x_2, dots, x_k)^T in \\mathbb{R}^k$<\/span>, cette m\u00e9trique se formalise rigoureusement par l&rsquo;expression :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"|x|_1 = \\sum_{i=1}^{k} |x_i|\">$$|x|_1 = \\sum_{i=1}^{k} |x_i|$$<\/span><\/p>\n<p>Lorsqu&rsquo;elle est mobilis\u00e9e dans une proc\u00e9dure de normalisation matricielle, la division \u00e9l\u00e9ment par \u00e9l\u00e9ment d&rsquo;un vecteur \u00e0 composantes strictement positives par sa norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> engendre une propri\u00e9t\u00e9 fondamentale : la somme des composantes scalaires du vecteur r\u00e9sultant \u00e9quivaut exactement \u00e0 l&rsquo;unit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\sum_{i=1}^k \\tilde{x}_i = 1\">$\\sum_{i=1}^k \\tilde{x}_i = 1$<\/span>). Sur le plan de l&rsquo;interpr\u00e9tation math\u00e9matique, cette op\u00e9ration correspond \u00e0 une transformation stochastique, projetant le vecteur d&rsquo;origine sur un simplexe de probabilit\u00e9. Les \u00e9l\u00e9ments normalis\u00e9s peuvent d\u00e8s lors \u00eatre formellement interpr\u00e9t\u00e9s comme une distribution discr\u00e8te de probabilit\u00e9s ou comme des pond\u00e9rations relatives, ce qui s&rsquo;av\u00e8re particuli\u00e8rement pr\u00e9pond\u00e9rant dans l&rsquo;analyse de corpus textuels (mod\u00e8les en sacs de mots ou allocations de Dirichlet latentes) et en bio-informatique (profils d&rsquo;abondance relative d&rsquo;esp\u00e8ces microbiennes ou d&rsquo;expression g\u00e9n\u00e9tique).<\/p>\n<p>D&rsquo;un point de vue g\u00e9om\u00e9trique, la boule unit\u00e9 associ\u00e9e \u00e0 la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> dans <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{R}^k\">$\\mathbb{R}^k$<\/span> dessine un polytope r\u00e9gulier crois\u00e9 (un losange dans <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{R}^2\">$\\mathbb{R}^2$<\/span>, un octa\u00e8dre r\u00e9gulier dans <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{R}^3\">$\\mathbb{R}^3$<\/span>). Cette g\u00e9om\u00e9trie polygonale dot\u00e9e de sommets situ\u00e9s pr\u00e9cis\u00e9ment sur les axes de coordonn\u00e9es explique les propri\u00e9t\u00e9s de parcimonie (<em>sparsity<\/em>) induites par la r\u00e9gularisation de type Lasso dans les probl\u00e8mes d&rsquo;estimation statistique : la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> favorise des solutions o\u00f9 de nombreuses coordonn\u00e9es s&rsquo;annulent de fa\u00e7on exacte. Face \u00e0 des distributions asym\u00e9triques ou fortement \u00e9tal\u00e9es, la norme de Manhattan offre une r\u00e9silience sup\u00e9rieure \u00e0 celle de la m\u00e9trique euclidienne, car elle ne proc\u00e8de pas \u00e0 une \u00e9l\u00e9vation au carr\u00e9 des \u00e9carts, limitant ainsi l&rsquo;amplification d\u00e9mesur\u00e9e des valeurs distantes du centro\u00efde.<\/p>\n<h3>2.2 La norme euclidienne (Norme L2)<\/h3>\n<p>La norme euclidienne, universellement d\u00e9sign\u00e9e sous l&rsquo;appellation de norme <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>, repr\u00e9sente la mesure g\u00e9om\u00e9trique intuitive de la longueur rectiligne d&rsquo;un vecteur dans l&rsquo;espace physique cart\u00e9sien \u00e0 trois dimensions, g\u00e9n\u00e9ralis\u00e9e \u00e0 un espace euclidien arbitraire de dimension <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>. Sa formulation alg\u00e9brique s&rsquo;exprime par la racine carr\u00e9e de la somme des carr\u00e9s des composantes scalaires du vecteur consid\u00e9r\u00e9 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"|x|_2 = \\sqrt{\\sum_{i=1}^{k} x_i^2} = \\sqrt{\\langle x, x \\rangle}\">$$|x|_2 = \\sqrt{\\sum_{i=1}^{k} x_i^2} = \\sqrt{\\langle x, x \\rangle}$$<\/span><\/p>\n<p>L&rsquo;op\u00e9ration de normalisation par la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>, d\u00e9finie formellement par la relation <span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = x \/ |x|_2\">$\\tilde{x} = x \/ |x|_2$<\/span> (pour tout <span class=\"arabpsy-math-inline\" data-latex=\"x \\neq 0\">$x \\neq 0$<\/span>), r\u00e9alise une projection orthogonale du vecteur sur l&rsquo;hypersph\u00e8re unit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{S}^{k-1} = {u in \\mathbb{R}^k mid |u|_2 = 1}\">$\\mathbb{S}^{k-1} = {u in \\mathbb{R}^k mid |u|_2 = 1}$<\/span>. Cette projection unitaire poss\u00e8de des vertus alg\u00e9briques remarquables, au premier rang desquelles figure la stabilit\u00e9 rotationnelle. En vertu des propri\u00e9t\u00e9s intrins\u00e8ques du produit scalaire euclidien, la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span> est invariante sous l&rsquo;action des transformations orthogonales appartenant au groupe <span class=\"arabpsy-math-inline\" data-latex=\"O(k)\">$O(k)$<\/span> (notamment les rotations et les r\u00e9flexions vectorielles). Ainsi, faire tourner l&rsquo;ensemble du syst\u00e8me d&rsquo;axes de r\u00e9f\u00e9rence n&rsquo;alt\u00e8re en rien la norme euclidienne calcul\u00e9e sur les vecteurs consid\u00e9r\u00e9s.<\/p>\n<p>Cette invariance explique l&rsquo;h\u00e9g\u00e9monie de la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span> dans le cadre des calculs de similarit\u00e9 directionnelle. En effet, lorsque deux vecteurs <span class=\"arabpsy-math-inline\" data-latex=\"u\">$u$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"v\">$v$<\/span> ont pr\u00e9alablement fait l&rsquo;objet d&rsquo;une normalisation unitaire euclidienne, leur produit scalaire direct devient math\u00e9matiquement identique \u00e0 leur <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cosine_similarity\">similarit\u00e9 cosinus<\/a> :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\langle \\tilde{u}, \\tilde{v} \\rangle = \\frac{\\langle u, v \\rangle}{|u|_2 |v|_2} = \\cos(\\theta)\">$$\\langle \\tilde{u}, \\tilde{v} \\rangle = \\frac{\\langle u, v \\rangle}{|u|_2 |v|_2} = \\cos(\\theta)$$<\/span><\/p>\n<p>o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"\\theta\">$\\theta$<\/span> formalise l&rsquo;angle g\u00e9om\u00e9trique sous-tendu par les deux vecteurs dans l&rsquo;espace vectoriel. Cette \u00e9quivalence analytique convertit des calculs complexes de distance angulaire en de simples multiplications matricielles vectoris\u00e9es, constituant le moteur computationnel des m\u00e9canismes d&rsquo;attention dans les architectures modernes de traitement du langage naturel (comme les Transformeurs) et des syst\u00e8mes de recherche d&rsquo;information \u00e0 haute dimensionnalit\u00e9.<\/p>\n<h3>2.3 La norme infinie (Norme de Chebyshev \/ Max)<\/h3>\n<p>La norme infinie, \u00e9galement appel\u00e9e norme de Chebyshev, norme du supremum ou norme uniforme, correspond au cas limite de la famille g\u00e9n\u00e9rale des normes de Lebesgue <span class=\"arabpsy-math-inline\" data-latex=\"L_p\">$L_p$<\/span> lorsque le param\u00e8tre d&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"p\">$p$<\/span> tend vers l&rsquo;infini formel (<span class=\"arabpsy-math-inline\" data-latex=\"\\lim_{p to \\infty} |x|_p\">$\\lim_{p to \\infty} |x|_p$<\/span>). Sa formulation alg\u00e9brique isole et \u00e9value la composante scalaire poss\u00e9dant la magnitude maximale en valeur absolue au sein du vecteur consid\u00e9r\u00e9 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"|x|_\\infty = \\max_{1 le i le k} |x_i|\">$$|x|_\\infty = \\max_{1 le i le k} |x_i|$$<\/span><\/p>\n<p>La normalisation d&rsquo;un vecteur sous l&rsquo;\u00e9gide de la norme infinie s&rsquo;accomplit par la division de chaque coordonn\u00e9e par ce maximum absolu : <span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = x \/ |x|_\\infty\">$\\tilde{x} = x \/ |x|_\\infty$<\/span>. La cons\u00e9quence topologique imm\u00e9diate de cette op\u00e9ration est l&rsquo;inscription stricte et rigoureuse de l&rsquo;ensemble des \u00e9l\u00e9ments scalaires r\u00e9sultants au sein du compact sym\u00e9trique <span class=\"arabpsy-math-inline\" data-latex=\"[-1, 1]\">$[-1, 1]$<\/span>, la coordonn\u00e9e qui dominait initialement le vecteur atteignant n\u00e9cessairement la valeur absolue de <span class=\"arabpsy-math-inline\" data-latex=\"+1\">$+1$<\/span> ou <span class=\"arabpsy-math-inline\" data-latex=\"-1\">$-1$<\/span>. La boule unit\u00e9 induite par la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_\\infty\">$L_\\infty$<\/span> pr\u00e9sente la morphologie g\u00e9om\u00e9trique d&rsquo;un hypercube r\u00e9gulier align\u00e9 sur les axes canoniques de coordonn\u00e9es.<\/p>\n<p>Cette forme de compression est particuli\u00e8rement utile dans les contextes o\u00f9 l&rsquo;amplitude maximale absolue d&rsquo;un signal ou d&rsquo;une observation constitue la contrainte physique critique. C&rsquo;est notamment le cas dans le traitement des signaux audionum\u00e9riques pour pr\u00e9venir le ph\u00e9nom\u00e8ne d&rsquo;\u00e9cr\u00eatage (<em>clipping<\/em>), ou dans les dispositifs m\u00e9catroniques soumis \u00e0 des seuils de saturation stricts pour leurs actionneurs. N\u00e9anmoins, la norme infinie pr\u00e9sente des limitations th\u00e9oriques notables face au risque de perte d&rsquo;information intra-vectorielle : en fondant la m\u00e9trique sur une seule composante extr\u00eame, elle occulte la dispersion interne et la structure des autres coordonn\u00e9es, se montrant par ailleurs particuli\u00e8rement sensible aux artefacts ou aux bruits de mesure isol\u00e9s.<\/p>\n<h2>3. Architecture et pr\u00e9paration de l&rsquo;environnement Python<\/h2>\n<h3>3.1 Installation et configuration des biblioth\u00e8ques fondamentales<\/h3>\n<p>La mise en \u0153uvre pratique et performante de la normalisation matricielle repose sur une configuration environnementale rigoureuse au sein de l&rsquo;\u00e9cosyst\u00e8me Python. La biblioth\u00e8que fondatrice demeure NumPy, compl\u00e9t\u00e9e par Scikit-Learn pour ses transformateurs statistiques et <a rel=\"noopener noreferrer\" href=\"https:\/\/scipy.org\">SciPy<\/a> pour la manipulation de structures lin\u00e9aires sp\u00e9cialis\u00e9es. Pour garantir l&rsquo;int\u00e9grit\u00e9 et la reproductibilit\u00e9 des exp\u00e9rimentations num\u00e9riques, l&rsquo;isolation des d\u00e9pendances logicielles au sein d&rsquo;un environnement virtuel d\u00e9di\u00e9 (via <code>venv<\/code> ou <code>conda<\/code>) constitue un pr\u00e9alable imp\u00e9ratif.<\/p>\n<p>L&rsquo;installation s&rsquo;op\u00e8re typiquement via les gestionnaires de paquets conventionnels en s&rsquo;assurant d&rsquo;obtenir les versions les plus r\u00e9centes supportant le typage statique et les extensions de compilation natives. Il convient d&rsquo;ex\u00e9cuter la s\u00e9quence de commandes suivante dans le terminal du syst\u00e8me d&rsquo;exploitation :<\/p>\n<p><code>python -m venv env_calcul<\/code><br \/>\n<code>source env_calcul\/bin\/activate<\/code><br \/>\n<code>pip install --upgrade pip<\/code><br \/>\n<code>pip install numpy scipy scikit-learn<\/code><\/p>\n<p>Au niveau de l&rsquo;interpr\u00e9teur Python, l&rsquo;importation canonique des modules s&rsquo;articule comme suit :<\/p>\n<p><code>import numpy as np<\/code><br \/>\n<code>import sklearn.preprocessing as skp<\/code><br \/>\n<code>import sys<\/code><\/p>\n<p>Une dimension technique souvent sous-estim\u00e9e concerne l&rsquo;infrastructure mat\u00e9rielle sous-jacente sur laquelle s&rsquo;appuie l&rsquo;ex\u00e9cutable NumPy. L&rsquo;efficacit\u00e9 des calculs matriciels d\u00e9pend directement de l&rsquo;interfa\u00e7age de NumPy avec des biblioth\u00e8ques de calcul vectoriel de bas niveau en C ou Fortran, \u00e0 l&rsquo;image d&rsquo;Intel MKL (<em>Math Kernel Library<\/em>) ou d&rsquo;OpenBLAS. Il est hautement recommand\u00e9 d&rsquo;inspecter cette liaison mat\u00e9rielle au moyen de l&rsquo;instruction <code>np.show_config()<\/code>, laquelle permet de certifier que les op\u00e9rations de r\u00e9duction et de produit matriciel b\u00e9n\u00e9ficieront des extensions vectorielles du processeur (telles que AVX-512 ou ARM Neon) et du parall\u00e9lisme multi-c\u0153urs transparent.<\/p>\n<h3>3.2 Instanciation et typage de matrices de test repr\u00e9sentatives<\/h3>\n<p>Pour illustrer de mani\u00e8re tangible les diff\u00e9rents m\u00e9canismes de normalisation, il est crucial d&rsquo;instancier des structures matricielles dont l&rsquo;agencement m\u00e9moire et la pr\u00e9cision num\u00e9rique soient rigoureusement ma\u00eetris\u00e9s. Les tableaux num\u00e9riques cr\u00e9\u00e9s par d\u00e9faut \u00e0 partir d&rsquo;entiers peuvent induire des comportements inattendus lors des op\u00e9rations de division, notamment des troncatures enti\u00e8res non sollicit\u00e9es si l&rsquo;on op\u00e8re dans des versions obsol\u00e8tes ou des conversions implicites d\u00e9gradant les performances.<\/p>\n<p>Consid\u00e9rons la cr\u00e9ation d&rsquo;une matrice d\u00e9terministe <span class=\"arabpsy-math-inline\" data-latex=\"3 \\times 3\">$3 \\times 3$<\/span> \u00e0 valeurs enti\u00e8res strictement incr\u00e9mentales, tout en sp\u00e9cifiant explicitement un encodage en virgule flottante double pr\u00e9cision (<code>float64<\/code>). Cette rigueur \u00e9vite les erreurs de transtypage lors des divisions vectorielles :<\/p>\n<p><code>matrice_base = np.arange(1, 10, dtype=np.float64).reshape(3, 3)<\/code><\/p>\n<p>Cette instruction g\u00e9n\u00e8re le tenseur bidimensionnel suivant :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\begin{\\pmatrix} 1.0 &amp; 2.0 &amp; 3.0 \\ 4.0 &amp; 5.0 &amp; 6.0 \\ 7.0 &amp; 8.0 &amp; 9.0 \\end{\\pmatrix}\">$$\\begin{\\pmatrix} 1.0 &#038; 2.0 &#038; 3.0 \\ 4.0 &#038; 5.0 &#038; 6.0 \\ 7.0 &#038; 8.0 &#038; 9.0 \\end{\\pmatrix}$$<\/span><\/p>\n<p>L&rsquo;inspection de la m\u00e9tadonn\u00e9e d&rsquo;agencement m\u00e9moire r\u00e9v\u00e8le que cette matrice est contigu\u00eb en m\u00e9moire selon l&rsquo;ordre standard du langage C (<em>C-contiguous<\/em>), ce qui implique que les \u00e9l\u00e9ments d&rsquo;une m\u00eame ligne sont allou\u00e9s de mani\u00e8re cons\u00e9cutive dans les blocs de la m\u00e9moire vive. Pour les simulations stochastiques ou les \u00e9valuations de robustesse (m\u00e9thodes de Monte-Carlo), il est pr\u00e9f\u00e9rable d&rsquo;initialiser des matrices pseudo-al\u00e9atoires contr\u00f4l\u00e9es via le g\u00e9n\u00e9rateur moderne de NumPy, en fixant une graine (<em>seed<\/em>) pour garantir une reproductibilit\u00e9 computationnelle absolue :<\/p>\n<p><code>rng = np.random.default_rng(seed=42)<\/code><br \/>\n<code>matrice_aleatoire = rng.uniform(low=10.0, high=100.0, size=(4, 5))<\/code><\/p>\n<p>L&rsquo;\u00e9valuation syst\u00e9matique du rang de la matrice, de sa dimensionnalit\u00e9 (<code>shape<\/code>) et de son type de donn\u00e9es sous-jacent (<code>dtype<\/code>) constitue le fondement d&rsquo;une pratique de codage rigoureuse pr\u00e9alable \u00e0 toute op\u00e9ration de normalisation d&rsquo;envergure.<\/p>\n<h2>4. Normalisation des lignes d&rsquo;une matrice avec Scikit-Learn<\/h2>\n<h3>4.1 Syntaxe fondamentale et s\u00e9mantique des param\u00e8tres<\/h3>\n<p>La biblioth\u00e8que Scikit-Learn met \u00e0 disposition des praticiens une fonction d\u00e9di\u00e9e au sein de son sous-module de pr\u00e9traitement : <code>sklearn.preprocessing.normalize<\/code>. Con\u00e7ue initialement pour harmoniser les repr\u00e9sentations vectorielles d&rsquo;\u00e9chantillons statistiques ind\u00e9pendants, cette fonction op\u00e8re par d\u00e9faut une transformation ligne par ligne d&rsquo;une matrice ou d&rsquo;un tableau bidimensionnel.<\/p>\n<p>La signature standard de cette fonction s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><code>sklearn.preprocessing.normalize(X, norm='l2', axis=1, copy=True, return_norm=False)<\/code><\/p>\n<p>L&rsquo;analyse s\u00e9mantique de ses param\u00e8tres r\u00e9v\u00e8le des choix d&rsquo;ing\u00e9nierie cruciaux :<\/p>\n<ul>\n<li><strong><code>X<\/code><\/strong> : La structure de donn\u00e9es d&rsquo;entr\u00e9e, qui peut consister en un tableau dense <code>numpy.ndarray<\/code> ou une matrice creuse de type <code>scipy.sparse<\/code>.<\/li>\n<li><strong><code>norm<\/code><\/strong> : La m\u00e9trique de r\u00e9duction s\u00e9lectionn\u00e9e, acceptant formellement les cha\u00eenes de caract\u00e8res <code>'l1'<\/code>, <code>'l2'<\/code> ou <code>'max'<\/code>. L&rsquo;option <code>'l2'<\/code> pr\u00e9vaut par d\u00e9faut dans l&rsquo;impl\u00e9mentation.<\/li>\n<li><strong><code>axis<\/code><\/strong> : L&rsquo;orientation dimensionnelle le long de laquelle s&rsquo;effectue la sommation de la norme. La valeur par d\u00e9faut <code>axis=1<\/code> stipule explicitement que chaque ligne de la matrice est normalis\u00e9e de fa\u00e7on totalement autonome et ind\u00e9pendante des autres lignes.<\/li>\n<li><strong><code>copy<\/code><\/strong> : Un bool\u00e9en d\u00e9terminant si la fonction doit allouer un nouveau tableau dense pour recueillir le r\u00e9sultat transform\u00e9 ou si la modification doit \u00eatre ex\u00e9cut\u00e9e directement \u00ab en place \u00bb dans le tampon m\u00e9moire pr\u00e9existant.<\/li>\n<li><strong><code>return_norm<\/code><\/strong> : Permet d&rsquo;extraire simultan\u00e9ment la matrice transform\u00e9e et le vecteur contenant les normes scalaires calcul\u00e9es le long de chaque axe.<\/li>\n<\/ul>\n<h3>4.2 \u00c9tude de cas d\u00e9taill\u00e9e : Normalisation L1 par ligne<\/h3>\n<p>Afin de concr\u00e9tiser l&rsquo;application de la norme de Manhattan sur l&rsquo;axe horizontal d&rsquo;un tenseur matriciel, appliquons la fonction <code>normalize<\/code> configur\u00e9e avec le param\u00e8tre <code>norm='l1'<\/code> sur notre matrice d&rsquo;exp\u00e9rimentation <span class=\"arabpsy-math-inline\" data-latex=\"3 \\times 3\">$3 \\times 3$<\/span> :<\/p>\n<p><code>matrice_l1_lignes = skp.normalize(matrice_base, norm='l1', axis=1)<\/code><\/p>\n<p>Pour appr\u00e9hender la m\u00e9canique interne de cette op\u00e9ration, d\u00e9composons analytiquement le traitement assign\u00e9 \u00e0 chaque vecteur ligne individuel :<\/p>\n<ul>\n<li>Pour la premi\u00e8re ligne <span class=\"arabpsy-math-inline\" data-latex=\"(1.0, 2.0, 3.0)\">$(1.0, 2.0, 3.0)$<\/span> : la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> correspond \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"1.0 + 2.0 + 3.0 = 6.0\">$1.0 + 2.0 + 3.0 = 6.0$<\/span>. Les composantes normalis\u00e9es deviennent respectivement <span class=\"arabpsy-math-inline\" data-latex=\"1\/6 \\approx 0.1667\">$1\/6 \\approx 0.1667$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"2\/6 \\approx 0.3333\">$2\/6 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"3\/6 = 0.5000\">$3\/6 = 0.5000$<\/span>.<\/li>\n<li>Pour la deuxi\u00e8me ligne <span class=\"arabpsy-math-inline\" data-latex=\"(4.0, 5.0, 6.0)\">$(4.0, 5.0, 6.0)$<\/span> : la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> correspond \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"4.0 + 5.0 + 6.0 = 15.0\">$4.0 + 5.0 + 6.0 = 15.0$<\/span>. Les composantes r\u00e9sultantes sont <span class=\"arabpsy-math-inline\" data-latex=\"4\/15 \\approx 0.2667\">$4\/15 \\approx 0.2667$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"5\/15 \\approx 0.3333\">$5\/15 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"6\/15 = 0.4000\">$6\/15 = 0.4000$<\/span>.<\/li>\n<li>Pour la troisi\u00e8me ligne <span class=\"arabpsy-math-inline\" data-latex=\"(7.0, 8.0, 9.0)\">$(7.0, 8.0, 9.0)$<\/span> : la somme absolue s&rsquo;\u00e9l\u00e8ve \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"7.0 + 8.0 + 9.0 = 24.0\">$7.0 + 8.0 + 9.0 = 24.0$<\/span>. Les composantes sont transform\u00e9es en <span class=\"arabpsy-math-inline\" data-latex=\"7\/24 \\approx 0.2917\">$7\/24 \\approx 0.2917$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"8\/24 \\approx 0.3333\">$8\/24 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"9\/24 = 0.3750\">$9\/24 = 0.3750$<\/span>.<\/li>\n<\/ul>\n<p>L&rsquo;\u00e9valuation empirique de la matrice obtenue s&rsquo;op\u00e8re en calculant la somme des composantes sur chaque ligne \u00e0 l&rsquo;aide de NumPy :<\/p>\n<p><code>sommes_lignes = np.sum(matrice_l1_lignes, axis=1)<\/code><\/p>\n<p>L&rsquo;instruction retourne un vecteur constitu\u00e9 de <code>array([1., 1., 1.])<\/code>, confirmant de mani\u00e8re indiscutable que chaque observation a \u00e9t\u00e9 projet\u00e9e sur le simplexe stochastique unitaire. Il convient de souligner que si une ligne initiale ne contenait exclusivement que des z\u00e9ros scalaires, la fonction de Scikit-Learn g\u00e8re \u00e9l\u00e9gamment cette singularit\u00e9 en retournant un vecteur nul sans d\u00e9clencher de crash par division par z\u00e9ro, pr\u00e9servant ainsi l&rsquo;int\u00e9grit\u00e9 de la structure.<\/p>\n<h3>4.3 Application de la norme L2 sur les lignes<\/h3>\n<p>L&rsquo;application de la norme euclidienne sur l&rsquo;orientation horizontale est le traitement de choix pour confiner chaque vecteur ligne sur l&rsquo;hypersph\u00e8re unit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{S}^{n-1}\">$\\mathbb{S}^{n-1}$<\/span>. La commande s&rsquo;ex\u00e9cute de mani\u00e8re analogue en sp\u00e9cifiant la norme appropri\u00e9e :<\/p>\n<p><code>matrice_l2_lignes = skp.normalize(matrice_base, norm='l2', axis=1)<\/code><\/p>\n<p>Sur le plan math\u00e9matique, les d\u00e9nominateurs scalaires appliqu\u00e9s \u00e0 chaque ligne s&rsquo;obtiennent par extraction de la racine carr\u00e9e de la somme quadratique :<\/p>\n<ul>\n<li>Ligne 1 : <span class=\"arabpsy-math-inline\" data-latex=\"|x_1|_2 = \\sqrt{1^2 + 2^2 + 3^2} = \\sqrt{1 + 4 + 9} = \\sqrt{14} \\approx 3.74166\">$|x_1|_2 = \\sqrt{1^2 + 2^2 + 3^2} = \\sqrt{1 + 4 + 9} = \\sqrt{14} \\approx 3.74166$<\/span><\/li>\n<li>Ligne 2 : <span class=\"arabpsy-math-inline\" data-latex=\"|x_2|_2 = \\sqrt{4^2 + 5^2 + 6^2} = \\sqrt{16 + 25 + 36} = \\sqrt{77} \\approx 8.77496\">$|x_2|_2 = \\sqrt{4^2 + 5^2 + 6^2} = \\sqrt{16 + 25 + 36} = \\sqrt{77} \\approx 8.77496$<\/span><\/li>\n<li>Ligne 3 : <span class=\"arabpsy-math-inline\" data-latex=\"|x_3|_2 = \\sqrt{7^2 + 8^2 + 9^2} = \\sqrt{49 + 64 + 81} = \\sqrt{194} \\approx 13.92839\">$|x_3|_2 = \\sqrt{7^2 + 8^2 + 9^2} = \\sqrt{49 + 64 + 81} = \\sqrt{194} \\approx 13.92839$<\/span><\/li>\n<\/ul>\n<p>Chaque \u00e9l\u00e9ment matriciel est par cons\u00e9quent divis\u00e9 par la norme euclidienne sp\u00e9cifique \u00e0 sa rang\u00e9e. Pour v\u00e9rifier la validit\u00e9 num\u00e9rique du traitement, \u00e9levons la matrice r\u00e9sultante au carr\u00e9 et sommons le long de l&rsquo;axe 1 :<\/p>\n<p><code>sommes_carres = np.sum(np.square(matrice_l2_lignes), axis=1)<\/code><\/p>\n<p>Le r\u00e9sultat obtenu converge vers <code>array([1., 1., 1.])<\/code> avec une tol\u00e9rance num\u00e9rique de l&rsquo;ordre de la pr\u00e9cision machine. Cette transformation est particuli\u00e8rement critique dans les sc\u00e9narios de fouille de textes ou d&rsquo;apprentissage de repr\u00e9sentations (<em>embeddings<\/em>). En contraignant la norme euclidienne des lignes \u00e0 valoir strictement l&rsquo;unit\u00e9, le calcul ult\u00e9rieur de la similarit\u00e9 cosinus entre deux observations quelconques <span class=\"arabpsy-math-inline\" data-latex=\"i\">$i$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"j\">$j$<\/span> se r\u00e9duit \u00e0 une simple multiplication matricielle scalaire <span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x}_i \\tilde{x}_j^T\">$\\tilde{x}_i \\tilde{x}_j^T$<\/span>, supprimant les calculs redondants de normes euclidiennes lors des phases d&rsquo;inf\u00e9rence en temps r\u00e9el.<\/p>\n<h2>5. Normalisation des colonnes d&rsquo;une matrice avec Scikit-Learn<\/h2>\n<h3>5.1 M\u00e9canisme de l&rsquo;orientation axiale (axis=0)<\/h3>\n<p>Bien que la normalisation par ligne soit la convention par d\u00e9faut dans les biblioth\u00e8ques d&rsquo;apprentissage automatique &mdash; chaque ligne repr\u00e9sentant traditionnellement un \u00e9chantillon statistique &mdash;, de multiples contextes analytiques requi\u00e8rent imp\u00e9rativement une normalisation orient\u00e9e selon les colonnes de la matrice. C&rsquo;est le cas typique o\u00f9 les colonnes incarnent des variables exp\u00e9rimentales ou des descripteurs physiques pr\u00e9sentant des unit\u00e9s de mesure incommensurables (par exemple des temp\u00e9ratures en degr\u00e9s Celsius associ\u00e9es \u00e0 des pressions en kilopascals).<\/p>\n<p>Pour transposer l&rsquo;op\u00e9ration g\u00e9om\u00e9trique vers cette orientation verticale, il suffit d&rsquo;assigner la valeur <code>0<\/code> au param\u00e8tre <code>axis<\/code> :<\/p>\n<p><code>matrice_colonnes = skp.normalize(matrice_base, norm='l2', axis=0)<\/code><\/p>\n<p>Ce basculement modifie en profondeur la dynamique de la r\u00e9duction alg\u00e9brique. Au lieu de consid\u00e9rer les rang\u00e9es horizontales comme des vecteurs autonomes, l&rsquo;algorithme partitionne la matrice en un ensemble de <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> vecteurs verticaux <span class=\"arabpsy-math-inline\" data-latex=\"y_j in \\mathbb{R}^m\">$y_j in \\mathbb{R}^m$<\/span>, pour <span class=\"arabpsy-math-inline\" data-latex=\"j in {1, dots, n}\">$j in {1, dots, n}$<\/span>. Chaque vecteur variable est ensuite mis \u00e0 l&rsquo;\u00e9chelle de fa\u00e7on totalement ind\u00e9pendante de ses colonnes voisines. Cette approche garantit que chaque caract\u00e9ristique statistique poss\u00e8de une contribution m\u00e9trique \u00e9quivalente au sein de l&rsquo;espace global, \u00e9liminant tout avantage disproportionn\u00e9 qu&rsquo;une variable pourrait acqu\u00e9rir du seul fait de son \u00e9chelle de mesure d&rsquo;origine.<\/p>\n<h3>5.2 Exemple pratique : Normalisation L1 par colonne<\/h3>\n<p>Mettons en pratique la normalisation de type Manhattan appliqu\u00e9e verticalement \u00e0 notre matrice d&rsquo;essai \u00e0 l&rsquo;aide de l&rsquo;instruction idoine :<\/p>\n<p><code>matrice_l1_colonnes = skp.normalize(matrice_base, norm='l1', axis=0)<\/code><\/p>\n<p>Ex\u00e9cutons l&rsquo;analyse analytique pour chaque colonne verticale de la matrice :<\/p>\n<ul>\n<li>Colonne 1 <span class=\"arabpsy-math-inline\" data-latex=\"(1.0, 4.0, 7.0)^T\">$(1.0, 4.0, 7.0)^T$<\/span> : La norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> vaut <span class=\"arabpsy-math-inline\" data-latex=\"1.0 + 4.0 + 7.0 = 12.0\">$1.0 + 4.0 + 7.0 = 12.0$<\/span>. Les \u00e9l\u00e9ments normalis\u00e9s r\u00e9sultants sont <span class=\"arabpsy-math-inline\" data-latex=\"1\/12 \\approx 0.0833\">$1\/12 \\approx 0.0833$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"4\/12 \\approx 0.3333\">$4\/12 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"7\/12 \\approx 0.5833\">$7\/12 \\approx 0.5833$<\/span>.<\/li>\n<li>Colonne 2 <span class=\"arabpsy-math-inline\" data-latex=\"(2.0, 5.0, 8.0)^T\">$(2.0, 5.0, 8.0)^T$<\/span> : La somme absolue est \u00e9gale \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"2.0 + 5.0 + 8.0 = 15.0\">$2.0 + 5.0 + 8.0 = 15.0$<\/span>. Les \u00e9l\u00e9ments deviennent <span class=\"arabpsy-math-inline\" data-latex=\"2\/15 \\approx 0.1333\">$2\/15 \\approx 0.1333$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"5\/15 \\approx 0.3333\">$5\/15 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"8\/15 \\approx 0.5333\">$8\/15 \\approx 0.5333$<\/span>.<\/li>\n<li>Colonne 3 <span class=\"arabpsy-math-inline\" data-latex=\"(3.0, 6.0, 9.0)^T\">$(3.0, 6.0, 9.0)^T$<\/span> : La norme totale vaut <span class=\"arabpsy-math-inline\" data-latex=\"3.0 + 6.0 + 9.0 = 18.0\">$3.0 + 6.0 + 9.0 = 18.0$<\/span>. Les composantes sont donc <span class=\"arabpsy-math-inline\" data-latex=\"3\/18 \\approx 0.1667\">$3\/18 \\approx 0.1667$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"6\/18 \\approx 0.3333\">$6\/18 \\approx 0.3333$<\/span>, et <span class=\"arabpsy-math-inline\" data-latex=\"9\/18 = 0.5000\">$9\/18 = 0.5000$<\/span>.<\/li>\n<\/ul>\n<p>La validation empirique de cette transformation verticale s&rsquo;obtient imm\u00e9diatement en calculant la somme vectoris\u00e9e selon l&rsquo;axe vertical (<code>axis=0<\/code>) :<\/p>\n<p><code>validation_colonnes = np.sum(matrice_l1_colonnes, axis=0)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation produit formellement <code>array([1., 1., 1.])<\/code>. Cette technique de normalisation colonnaire est r\u00e9guli\u00e8rement exploit\u00e9e dans le calcul de matrices de transition au sein des cha\u00eenes de Markov, ou pour concevoir des matrices d&rsquo;adjacence stochastiques \u00e0 colonnes unies dans l&rsquo;analyse de centralit\u00e9 de graphes de grande envergure (tel que l&rsquo;algorithme originel de PageRank).<\/p>\n<h3>5.3 Exemple pratique : Normalisation L2 par colonne<\/h3>\n<p>La mise \u00e0 l&rsquo;\u00e9chelle euclidienne selon l&rsquo;axe vertical intervient principalement lors de la pr\u00e9paration des descripteurs pour des techniques de r\u00e9duction dimensionnelle lin\u00e9aire, au premier rang desquelles figure l&rsquo;<a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Principal_component_analysis\">analyse en composantes principales<\/a> (ACP) et la d\u00e9composition en valeurs singuli\u00e8res (SVD) :<\/p>\n<p><code>matrice_l2_colonnes = skp.normalize(matrice_base, norm='l2', axis=0)<\/code><\/p>\n<p>Le calcul alg\u00e9brique isole les d\u00e9nominateurs quadratiques pour chaque axe vertical :<\/p>\n<ul>\n<li>Colonne 1 : <span class=\"arabpsy-math-inline\" data-latex=\"|y_1|_2 = \\sqrt{1^2 + 4^2 + 7^2} = \\sqrt{1 + 16 + 49} = \\sqrt{66} \\approx 8.12403\">$|y_1|_2 = \\sqrt{1^2 + 4^2 + 7^2} = \\sqrt{1 + 16 + 49} = \\sqrt{66} \\approx 8.12403$<\/span><\/li>\n<li>Colonne 2 : <span class=\"arabpsy-math-inline\" data-latex=\"|y_2|_2 = \\sqrt{2^2 + 5^2 + 8^2} = \\sqrt{4 + 25 + 64} = \\sqrt{93} \\approx 9.64365\">$|y_2|_2 = \\sqrt{2^2 + 5^2 + 8^2} = \\sqrt{4 + 25 + 64} = \\sqrt{93} \\approx 9.64365$<\/span><\/li>\n<li>Colonne 3 : <span class=\"arabpsy-math-inline\" data-latex=\"|y_3|_2 = \\sqrt{3^2 + 6^2 + 9^2} = \\sqrt{9 + 36 + 81} = \\sqrt{126} \\approx 11.22497\">$|y_3|_2 = \\sqrt{3^2 + 6^2 + 9^2} = \\sqrt{9 + 36 + 81} = \\sqrt{126} \\approx 11.22497$<\/span><\/li>\n<\/ul>\n<p>Chaque colonne de la matrice originale est alors divis\u00e9e par sa norme euclidienne respective. Nous v\u00e9rifions la conformit\u00e9 de l&rsquo;op\u00e9ration en \u00e9valuant la somme des carr\u00e9s selon l&rsquo;axe vertical :<\/p>\n<p><code>np.sum(np.square(matrice_l2_colonnes), axis=0)<\/code><\/p>\n<p>Le r\u00e9sultat obtenu confirme l&rsquo;alignement unitaire : <code>array([1., 1., 1.])<\/code>. En contraignant chaque variable descriptive \u00e0 poss\u00e9der une longueur euclidienne \u00e9quivalente \u00e0 l&rsquo;unit\u00e9, on neutralise l&rsquo;impact m\u00e9canique de la variance brute sur les premiers vecteurs propres de la matrice de covariance. Ainsi, la g\u00e9om\u00e9trie multidimensionnelle du nuage d&rsquo;observations est uniform\u00e9ment calibr\u00e9e, \u00e9vitant que la dispersion artificielle d&rsquo;un seul axe ne confisque la mod\u00e9lisation de la variance totale.<\/p>\n<h2>6. Normalisation matricielle native avec NumPy pur<\/h2>\n<h3>6.1 Impl\u00e9mentation vectoris\u00e9e de la norme L1<\/h3>\n<p>Bien que les routines de Scikit-Learn soient intuitives et \u00e9prouv\u00e9es, recourir \u00e0 des impl\u00e9mentations natives en NumPy pur s&rsquo;av\u00e8re fr\u00e9quemment n\u00e9cessaire pour \u00e9liminer le surco\u00fbt de d\u00e9pendance logicielle, maximiser les vitesses d&rsquo;ex\u00e9cution dans des boucles de calcul intensives ou int\u00e9grer la normalisation dans des structures de compilation \u00e0 la vol\u00e9e (comme JAX ou Numba). La vectorisation NumPy permet de concevoir des algorithmes ultra-performants en exploitant le m\u00e9canisme sophistiqu\u00e9 de diffusion (<em>broadcasting<\/em>).<\/p>\n<p>Pour ex\u00e9cuter manuellement une normalisation <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> le long des lignes (horizontalement), la s\u00e9quence d&rsquo;instructions vectoris\u00e9es s&rsquo;articule comme suit :<\/p>\n<p><code>normes_l1 = np.sum(np.abs(matrice_base), axis=1, keepdims=True)<\/code><br \/>\n<code>matrice_norm_l1 = matrice_base \/ normes_l1<\/code><\/p>\n<p>L&rsquo;\u00e9l\u00e9ment d\u00e9terminant de cette construction r\u00e9side dans le param\u00e8tre <code>keepdims=True<\/code>. Par d\u00e9faut, lorsqu&rsquo;une op\u00e9ration de r\u00e9duction telle que <code>np.sum<\/code> est appliqu\u00e9e le long de l&rsquo;axe 1 sur un tableau de dimensions <span class=\"arabpsy-math-inline\" data-latex=\"(3, 3)\">$(3, 3)$<\/span>, NumPy effondre la dimension sp\u00e9cifi\u00e9e et produit un vecteur unidimensionnel de forme <span class=\"arabpsy-math-inline\" data-latex=\"(3,)\">$(3,)$<\/span>. Or, tenter de diviser directement un tableau <span class=\"arabpsy-math-inline\" data-latex=\"(3, 3)\">$(3, 3)$<\/span> par un tableau <span class=\"arabpsy-math-inline\" data-latex=\"(3,)\">$(3,)$<\/span> selon les r\u00e8gles de diffusion d\u00e9clencherait un alignement sur le dernier axe &mdash; soit une division ind\u00e9sirable par colonne !<\/p>\n<p>Gr\u00e2ce \u00e0 <code>keepdims=True<\/code>, le tenseur r\u00e9sultant de la sommation conserve une structure bidimensionnelle de dimensions <span class=\"arabpsy-math-inline\" data-latex=\"(3, 1)\">$(3, 1)$<\/span>. En vertu des r\u00e8gles formelles de diffusion de NumPy, les dimensions sont compar\u00e9es de droite \u00e0 gauche : la dimension singuli\u00e8re de taille 1 est dupliqu\u00e9e virtuellement le long de l&rsquo;axe horizontal sans aucune copie m\u00e9moire sous-jacente, autorisant une division \u00e9l\u00e9ment par \u00e9l\u00e9ment rigoureusement align\u00e9e sur les lignes. Les r\u00e9sultats obtenus par cette voie sont rigoureusement identiques \u00e0 ceux g\u00e9n\u00e9r\u00e9s par <code>sklearn.preprocessing.normalize<\/code>, tout en s&rsquo;affranchissant du surco\u00fbt de v\u00e9rification des types et des structures inh\u00e9rent aux couches d&rsquo;abstraction de haut niveau.<\/p>\n<h3>6.2 Impl\u00e9mentation vectoris\u00e9e de la norme L2<\/h3>\n<p>L&rsquo;impl\u00e9mentation native de la normalisation euclidienne en NumPy s&rsquo;appuie sur le sous-module d&rsquo;alg\u00e8bre lin\u00e9aire hautement optimis\u00e9 <code>numpy.linalg<\/code>, qui met \u00e0 disposition la fonction <code>np.linalg.norm<\/code>. Cette routine est capable de calculer une large diversit\u00e9 de normes vectorielles et matricielles en tirant directement parti des primitives LAPACK sous-jacentes.<\/p>\n<p>Pour normaliser notre matrice selon ses lignes au moyen de la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>, nous mobilisons la syntaxe suivante :<\/p>\n<p><code>normes_l2 = np.linalg.norm(matrice_base, ord=2, axis=1, keepdims=True)<\/code><br \/>\n<code>matrice_norm_l2 = matrice_base \/ normes_l2<\/code><\/p>\n<p>Le param\u00e8tre <code>ord=2<\/code> stipule express\u00e9ment le calcul de la norme euclidienne vectorielle le long de l&rsquo;axe mentionn\u00e9 par <code>axis=1<\/code>. Tout comme pour la norme de Manhattan, l&rsquo;inclusion de <code>keepdims=True<\/code> assure la g\u00e9n\u00e9ration d&rsquo;un vecteur colonne de dimensions <span class=\"arabpsy-math-inline\" data-latex=\"(3, 1)\">$(3, 1)$<\/span>, garantissant une division par diffusion parfaitement align\u00e9e sur l&rsquo;ensemble des coordonn\u00e9es horizontales.<\/p>\n<p>Pour \u00e9valuer la conformit\u00e9 math\u00e9matique absolue de notre code natif par rapport \u00e0 l&rsquo;impl\u00e9mentation de Scikit-Learn, nous pouvons employer la fonction de v\u00e9rification num\u00e9rique de NumPy, qui int\u00e8gre les tol\u00e9rances relatives et absolues requises par les limites de l&rsquo;arithm\u00e9tique en virgule flottante :<\/p>\n<p><code>equivalence_stricte = np.allclose(matrice_norm_l2, matrice_l2_lignes, rtol=1e-14, atol=1e-14)<\/code><\/p>\n<p>Cette expression s&rsquo;\u00e9value \u00e0 <code>True<\/code>, attestant que l&rsquo;impl\u00e9mentation vectoris\u00e9e native produit une exactitude num\u00e9rique totale, \u00e9quivalente au standard de l&rsquo;\u00e9tat de l&rsquo;art, tout en conservant une expressivit\u00e9 algorithmique concise et transparente.<\/p>\n<h3>6.3 Normalisation globale sur l&rsquo;int\u00e9gralit\u00e9 du tenseur<\/h3>\n<p>Jusqu&rsquo;\u00e0 pr\u00e9sent, nous avons examin\u00e9 la normalisation matricielle sous l&rsquo;angle de ses composantes vectorielles directionnelles (lignes ou colonnes). Toutefois, de nombreux domaines &mdash; tels que le traitement d&rsquo;images num\u00e9riques, la physique computationnelle ou la reconnaissance de formes &mdash; requi\u00e8rent une normalisation globale op\u00e9rant indiff\u00e9remment sur l&rsquo;int\u00e9gralit\u00e9 de la structure matricielle appr\u00e9hend\u00e9e comme un tenseur unifi\u00e9.<\/p>\n<p>Dans ce contexte, on ne cherche pas \u00e0 rendre les lignes ou les colonnes individuellement unitaires, mais \u00e0 rapporter la matrice enti\u00e8re \u00e0 une \u00e9chelle scalaire unique. L&rsquo;une des m\u00e9triques les plus renomm\u00e9es pour accomplir cette op\u00e9ration est la <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Matrix_norm#Frobenius_norm\">norme de Frobenius<\/a>, qui correspond \u00e0 la g\u00e9n\u00e9ralisation directe de la norme euclidienne \u00e0 un espace matriciel complet :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"|A|_F = \\sqrt{\\sum_{i=1}^{m} \\sum_{j=1}^{n} |a_{ij}|^2} = \\sqrt{operatorname{Tr}(A^T A)}\">$$|A|_F = \\sqrt{\\sum_{i=1}^{m} \\sum_{j=1}^{n} |a_{ij}|^2} = \\sqrt{operatorname{Tr}(A^T A)}$$<\/span><\/p>\n<p>L&rsquo;impl\u00e9mentation en NumPy pur d&rsquo;une telle normalisation globale s&rsquo;ex\u00e9cute avec une remarquable \u00e9l\u00e9gance sans recourir au param\u00e8tre d&rsquo;axe :<\/p>\n<p><code>norme_frobenius = np.linalg.norm(matrice_base, ord='fro')<\/code><br \/>\n<code>matrice_globale = matrice_base \/ norme_frobenius<\/code><\/p>\n<p>Ici, <code>norme_frobenius<\/code> est une valeur scalaire unique (de dimension z\u00e9ro). L&rsquo;op\u00e9ration de division applique directement ce d\u00e9nominateur commun \u00e0 l&rsquo;int\u00e9gralit\u00e9 des <span class=\"arabpsy-math-inline\" data-latex=\"m \\times n\">$m \\times n$<\/span> cellules de la matrice par simple diffusion scalaire-matrice. La somme des carr\u00e9s de l&rsquo;ensemble des \u00e9l\u00e9ments de la matrice transform\u00e9e vaut alors rigoureusement $1.0$ :<\/p>\n<p><code>somme_totale_carres = np.sum(np.square(matrice_globale))<\/code><\/p>\n<p>Cette approche est primordiale lors du pr\u00e9traitement de trames matricielles repr\u00e9sentant des matrices de densit\u00e9 en m\u00e9canique quantique ou des filtres spatiaux de convolution, au sein desquels l&rsquo;\u00e9nergie totale du tenseur doit \u00eatre strictement unitaire pour garantir la conservation des grandeurs physiques sous-jacentes.<\/p>\n<h2>7. Mise \u00e0 l&rsquo;\u00e9chelle Min-Max d&rsquo;une matrice NumPy dans l&rsquo;intervalle [0, 1]<\/h2>\n<h3>7.1 Algorithme et formulation math\u00e9matique du Min-Max Scaling<\/h3>\n<p>La mise \u00e0 l&rsquo;\u00e9chelle Min-Max (couramment d\u00e9sign\u00e9e sous l&rsquo;appellation de <em>Min-Max Scaling<\/em> ou normalisation par l&rsquo;\u00e9tendue) constitue une transformation affine visant \u00e0 contraindre le support num\u00e9rique des donn\u00e9es \u00e0 un intervalle ferm\u00e9 et born\u00e9, tr\u00e8s fr\u00e9quemment l&rsquo;intervalle canonique <span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span>. Contrairement aux projections unitaires sur des sph\u00e8res de rayon 1, cette m\u00e9thodologie op\u00e8re en recalibrant l&rsquo;amplitude dynamique des composantes.<\/p>\n<p>Pour un ensemble de valeurs scalaires r\u00e9unies dans un vecteur <span class=\"arabpsy-math-inline\" data-latex=\"x\">$x$<\/span>, la formule de transformation s&rsquo;\u00e9nonce formellement par :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\tilde{x}_i = \\frac{x_i - \\min(x)}{\\max(x) - \\min(x)}\">$$\\tilde{x}_i = \\frac{x_i &#8211; \\min(x)}{\\max(x) &#8211; \\min(x)}$$<\/span><\/p>\n<p>Cette transformation se d\u00e9compose en deux phases math\u00e9matiques successives :<\/p>\n<ul>\n<li>Une translation lin\u00e9aire de l&rsquo;espace par soustraction de la borne inf\u00e9rieure globale <span class=\"arabpsy-math-inline\" data-latex=\"min(x)\">$min(x)$<\/span>, ce qui translate la plus petite valeur observ\u00e9e pr\u00e9cis\u00e9ment sur le point z\u00e9ro.<\/li>\n<li>Une contraction d&rsquo;\u00e9chelle par division par l&rsquo;\u00e9tendue totale de la distribution (<span class=\"arabpsy-math-inline\" data-latex=\"max(x) - min(x)\">$max(x) &#8211; min(x)$<\/span>), garantissant que l&rsquo;\u00e9l\u00e9ment le plus \u00e9lev\u00e9 co\u00efncide exactement avec la borne unitaire $1.0$.<\/li>\n<\/ul>\n<p>Cette m\u00e9thode pr\u00e9serve rigoureusement les rangs de classement relatifs ainsi que la lin\u00e9arit\u00e9 des intervalles entre les points de donn\u00e9es, tout en garantissant que l&rsquo;ensemble des observations se d\u00e9ploie sans exception dans la plage d\u00e9finie. N\u00e9anmoins, sa vuln\u00e9rabilit\u00e9 majeure r\u00e9side dans son extr\u00eame sensibilit\u00e9 aux valeurs aberrantes : si une matrice comporte un artefact accidentel excessivement grand, l&rsquo;\u00e9tendue se trouve d\u00e9mesur\u00e9ment \u00e9largie et la vaste majorit\u00e9 des donn\u00e9es utiles se retrouve compact\u00e9e dans une frange minuscule proche de z\u00e9ro.<\/p>\n<h3>7.2 Impl\u00e9mentation NumPy manuelle par diffusion (Broadcasting)<\/h3>\n<p>L&rsquo;impl\u00e9mentation du redimensionnement Min-Max en NumPy pur n\u00e9cessite une rigueur scrupuleuse dans l&rsquo;assignation des axes d&rsquo;extraction des extr\u00eames et dans le maintien des dimensions g\u00e9om\u00e9triques. Supposons que nous souhaitions redimensionner notre matrice ind\u00e9pendamment pour chaque colonne (le sc\u00e9nario canonique en fouille de donn\u00e9es) :<\/p>\n<p><code>min_cols = np.min(matrice_base, axis=0, keepdims=True)<\/code><br \/>\n<code>max_cols = np.max(matrice_base, axis=0, keepdims=True)<\/code><br \/>\n<code>etendue_cols = max_cols - min_cols<\/code><br \/>\n<code>matrice_minmax_np = (matrice_base - min_cols) \/ etendue_cols<\/code><\/p>\n<p>L&rsquo;utilisation explicite de <code>axis=0<\/code> coupl\u00e9e \u00e0 <code>keepdims=True<\/code> produit deux tenseurs de r\u00e9f\u00e9rence de dimensions <span class=\"arabpsy-math-inline\" data-latex=\"(1, 3)\">$(1, 3)$<\/span>. Lors de la soustraction matricielle, <code>min_cols<\/code> est projet\u00e9 par diffusion sur chaque ligne descendante de la matrice originale. De mani\u00e8re sym\u00e9trique, la division par <code>etendue_cols<\/code> est diffus\u00e9e sur toute la hauteur de la structure bidimensionnelle.<\/p>\n<p>V\u00e9rifions les valeurs extr\u00eames obtenues pour chacune des colonnes transform\u00e9es :<\/p>\n<p><code>print(np.min(matrice_minmax_np, axis=0))  # Affiche : [0., 0., 0.]<\/code><br \/>\n<code>print(np.max(matrice_minmax_np, axis=0))  # Affiche : [1., 1., 1.]<\/code><\/p>\n<p>Si la probl\u00e9matique m\u00e9tier requiert une transformation op\u00e9r\u00e9e non pas sur les colonnes mais le long des lignes (normalisation par profil d&rsquo;individu), il suffit d&rsquo;ajuster l&rsquo;orientation en configurant <code>axis=1<\/code>. L&rsquo;architecture vectoris\u00e9e de NumPy ex\u00e9cute ces transformations avec une efficacit\u00e9 optimale, \u00e9vitant tout recours aux boucles it\u00e9ratives <code>for<\/code> qui p\u00e9naliseraient s\u00e9v\u00e8rement les performances d&rsquo;ex\u00e9cution.<\/p>\n<h3>7.3 Utilisation de MinMaxScaler de Scikit-Learn<\/h3>\n<p>Pour industrialiser cette op\u00e9ration au sein de cha\u00eenes de traitement complexes, Scikit-Learn propose la classe d\u00e9di\u00e9e <code>sklearn.preprocessing.MinMaxScaler<\/code>. Contrairement \u00e0 la simple fonction <code>normalize<\/code>, <code>MinMaxScaler<\/code> est un estimateur dot\u00e9 d&rsquo;un \u00e9tat interne persistant, structur\u00e9 autour du paradigme orient\u00e9 objet comprenant les m\u00e9thodes <code>fit<\/code>, <code>transform<\/code> et <code>fit_transform<\/code>.<\/p>\n<p>L&rsquo;instanciation et l&rsquo;application s&rsquo;effectuent par le protocole standard :<\/p>\n<p><code>scaler = skp.MinMaxScaler(feature_range=(0, 1))<\/code><br \/>\n<code>matrice_minmax_sk = scaler.fit_transform(matrice_base)<\/code><\/p>\n<p>Par d\u00e9faut, <code>MinMaxScaler<\/code> op\u00e8re strictement sur les colonnes de la matrice (\u00e9quivalent \u00e0 <code>axis=0<\/code>). L&rsquo;avantage d\u00e9terminant de cette approche r\u00e9side dans la conservation p\u00e9renne des param\u00e8tres statistiques appris lors de la phase d&rsquo;ajustement (<code>fit<\/code>). En effet, l&rsquo;objet conserve en m\u00e9moire les grandeurs d\u00e9termin\u00e9es via les attributs <code>scaler.data_min_<\/code>, <code>scaler.data_max_<\/code> et <code>scaler.data_range_<\/code>.<\/p>\n<p>Cette persistance est capitale dans le cadre de l&rsquo;apprentissage supervis\u00e9 : elle permet d&rsquo;appliquer exactement la m\u00eame transformation affine aux matrices de test ult\u00e9rieures sans r\u00e9\u00e9valuer leurs propres extrema, pr\u00e9venant ainsi toute contamination informationnelle. De plus, <code>MinMaxScaler<\/code> propose la m\u00e9thode inverse <code>scaler.inverse_transform(matrice_transformee)<\/code>, permettant de restaurer instantan\u00e9ment la matrice dans son \u00e9chelle m\u00e9trique originelle sans perte de pr\u00e9cision arithm\u00e9tique.<\/p>\n<h2>8. Gestion des cas particuliers et stabilit\u00e9 num\u00e9rique<\/h2>\n<h3>8.1 Probl\u00e9matique de la division par z\u00e9ro et vecteurs nuls<\/h3>\n<p>L&rsquo;un des d\u00e9fis les plus pernicieux lors de la normalisation matricielle \u00e0 grande \u00e9chelle r\u00e9side dans l&rsquo;apparition de vecteurs nuls &mdash; c&rsquo;est-\u00e0-dire des lignes ou des colonnes dont l&rsquo;ensemble des composantes scalaires est strictement \u00e9gal \u00e0 z\u00e9ro. Cette configuration est courante dans les matrices creuses document-terme ou les grilles d&rsquo;expressions g\u00e9nomiques o\u00f9 de nombreuses caract\u00e9ristiques ne sont jamais activ\u00e9es pour certains \u00e9chantillons.<\/p>\n<p>D&rsquo;un point de vue analytique, la norme d&rsquo;un vecteur nul est strictement nulle (<span class=\"arabpsy-math-inline\" data-latex=\"|0| = 0\">$|0| = 0$<\/span>). Tenter de normaliser un tel vecteur engendre imm\u00e9diatement une ind\u00e9termination math\u00e9matique du type <span class=\"arabpsy-math-inline\" data-latex=\"0 \/ 0\">$0 \/ 0$<\/span>. Dans le standard arithm\u00e9tique de calcul en virgule flottante, cette division produit la valeur <code>NaN<\/code> (<em>Not a Number<\/em>) et \u00e9met un avertissement d&rsquo;ex\u00e9cution (<code>RuntimeWarning: invalid value encountered in divide<\/code>). La pr\u00e9sence de ces valeurs corrompt irr\u00e9versiblement les op\u00e9rations ult\u00e9rieures.<\/p>\n<p>Pour pr\u00e9venir cette d\u00e9g\u00e9n\u00e9rescence computationnelle, deux strat\u00e9gies robustes sont couramment d\u00e9ploy\u00e9es. La premi\u00e8re repose sur l&rsquo;introduction d&rsquo;un masque logique bool\u00e9en coupl\u00e9 \u00e0 la fonction conditionnelle <code>np.where<\/code> :<\/p>\n<p><code>normes = np.linalg.norm(matrice, axis=1, keepdims=True)<\/code><br \/>\n<code>masque_non_nul = (normes > 0)<\/code><br \/>\n<code>matrice_securisee = np.where(masque_non_nul, matrice \/ np.where(masque_non_nul, normes, 1.0), 0.0)<\/code><\/p>\n<p>La seconde approche, largement adopt\u00e9e au sein des architectures de r\u00e9seaux neuronaux sous le nom de lissage par epsilon (<em>epsilon smoothing<\/em>), consiste \u00e0 additionner une constante infinit\u00e9simale de r\u00e9gularisation <span class=\"arabpsy-math-inline\" data-latex=\"varepsilon\">$varepsilon$<\/span> au d\u00e9nominateur :<\/p>\n<p><code>epsilon = 1e-15<\/code><br \/>\n<code>matrice_securisee = matrice \/ (normes + epsilon)<\/code><\/p>\n<p>Cette technique garantit que le d\u00e9nominateur ne s&rsquo;annule jamais, maintenant la stabilit\u00e9 num\u00e9rique tout en introduisant un biais math\u00e9matique n\u00e9gligeable qui n&rsquo;alt\u00e8re pas l&rsquo;\u00e9valuation globale.<\/p>\n<h3>8.2 Traitement des valeurs manquantes et aberrantes<\/h3>\n<p>Dans les applications industrielles ou empiriques, les matrices de donn\u00e9es brutes contiennent fr\u00e9quemment des valeurs manquantes signal\u00e9es par des marqueurs <code>np.nan<\/code>, cons\u00e9cutives \u00e0 des d\u00e9faillances de capteurs ou \u00e0 des omissions d&rsquo;enregistrement. Les fonctions de r\u00e9duction arithm\u00e9tique standards de NumPy propagent inconditionnellement ces valeurs manquantes : si une seule valeur <code>NaN<\/code> existe dans une ligne, l&rsquo;\u00e9valuation de <code>np.sum<\/code> ou <code>np.linalg.norm<\/code> pour cette ligne retourne in\u00e9vitablement <code>NaN<\/code>, an\u00e9antissant la normalisation de l&rsquo;observation concern\u00e9e.<\/p>\n<p>Pour surmonter cette contrainte sans recourir imm\u00e9diatement \u00e0 des algorithmes lourds d&rsquo;imputation, NumPy propose des fonctions statistiques tol\u00e9rantes aux valeurs manquantes : <code>np.nansum<\/code>, <code>np.nanmin<\/code> et <code>np.nanmax<\/code>. Ces routines r\u00e9alisent les calculs d&rsquo;\u00e9chelle en ignorant purement et simplement les occurrences non d\u00e9finies :<\/p>\n<p><code>normes_robustes = np.sqrt(np.nansum(np.square(matrice_avec_nan), axis=1, keepdims=True))<\/code><br \/>\n<code>matrice_normalisee_nan = matrice_avec_nan \/ np.where(normes_robustes > 0, normes_robustes, 1.0)<\/code><\/p>\n<p>Une alternative \u00e9l\u00e9gante consiste \u00e0 recourir aux tableaux masqu\u00e9s fournis par le sous-module sp\u00e9cialis\u00e9 <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/maskedarray.html\"><code>numpy.ma<\/code><\/a>. En superposant un masque bool\u00e9en sur les cellules corrompues, les routines de calcul omettent les positions d\u00e9sign\u00e9es sans alt\u00e9rer l&rsquo;agencement m\u00e9moire du tenseur sous-jacent.<\/p>\n<p>N\u00e9anmoins, il est indispensable de souligner que la normalisation sur des donn\u00e9es lacunaires ne constitue qu&rsquo;un pis-aller. Dans un cadre de rigueur scientifique, un protocole d&rsquo;imputation m\u00e9thodique (par la moyenne, la m\u00e9diane ou via des algorithmes de factorisation matricielle) doit syst\u00e9matiquement pr\u00e9c\u00e9der toute phase de normalisation structurelle.<\/p>\n<h3>8.3 Pr\u00e9cision en virgule flottante et erreurs d&rsquo;arrondi<\/h3>\n<p>L&rsquo;\u00e9valuation des op\u00e9rations matricielles sur des calculateurs num\u00e9riques est intrins\u00e8quement contrainte par les sp\u00e9cifications de la norme internationale <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/IEEE_754\">IEEE 754<\/a> r\u00e9gissant l&rsquo;arithm\u00e9tique en virgule flottante. La repr\u00e9sentation des nombres r\u00e9els s&rsquo;effectue au moyen d&rsquo;un compromis entre la mantisse et l&rsquo;exposant, ce qui induit une pr\u00e9cision finie et la pr\u00e9sence in\u00e9vitable d&rsquo;erreurs d&rsquo;arrondi lors des op\u00e9rations successives.<\/p>\n<p>Cette r\u00e9alit\u00e9 physique se manifeste de fa\u00e7on tangible lors de l&rsquo;utilisation de diff\u00e9rents formats de stockage num\u00e9rique :<\/p>\n<ul>\n<li><strong><code>float32<\/code><\/strong> (simple pr\u00e9cision) : Offre une pr\u00e9cision d&rsquo;environ 7 chiffres d\u00e9cimaux significatifs. Fortement privil\u00e9gi\u00e9 pour l&rsquo;entra\u00eenement des mod\u00e8les de <em>Deep Learning<\/em> en raison de son empreinte m\u00e9moire r\u00e9duite et de sa vitesse d&rsquo;ex\u00e9cution sur processeurs graphiques (GPU).<\/li>\n<li><strong><code>float64<\/code><\/strong> (double pr\u00e9cision) : Fournit une pr\u00e9cision de 15 \u00e0 17 chiffres d\u00e9cimaux significatifs. Il s&rsquo;agit du format par d\u00e9faut de NumPy, indispensable pour les calculs d&rsquo;alg\u00e8bre lin\u00e9aire exigeants et l&rsquo;int\u00e9gration d&rsquo;\u00e9quations diff\u00e9rentielles.<\/li>\n<\/ul>\n<p>En cons\u00e9quence de ces limites arithm\u00e9tiques, il est formellement d\u00e9conseill\u00e9 d&rsquo;\u00e9valuer la validit\u00e9 d&rsquo;une normalisation au moyen d&rsquo;un op\u00e9rateur d&rsquo;\u00e9galit\u00e9 stricte (tel que <code>np.sum(ligne) == 1.0<\/code>). En raison des r\u00e9sidus d&rsquo;arrondi infinit\u00e9simaux, une somme th\u00e9orique \u00e9gale \u00e0 1 peut \u00eatre repr\u00e9sent\u00e9e en m\u00e9moire machine par $0.9999999999999998$ ou $1.0000000000000002$. D\u00e8s lors, l&rsquo;\u00e9valuation de conformit\u00e9 doit syst\u00e9matiquement recourir \u00e0 des comparaisons par tol\u00e9rance d&rsquo;erreur \u00e0 l&rsquo;aide de la primitive <code>np.isclose<\/code> ou de son agr\u00e9gation globale <code>np.allclose<\/code> :<\/p>\n<p><code>validation_conforme = np.allclose(sommes_calculees, 1.0, atol=1e-12)<\/code><\/p>\n<p>Cette pr\u00e9caution \u00e9vite les faux n\u00e9gatifs lors des phases de tests unitaires et garantit la robustesse des cha\u00eenes de calcul.<\/p>\n<h2>9. Optimisation des performances et efficacit\u00e9 algorithmique<\/h2>\n<h3>9.1 Op\u00e9rations en m\u00e9moire : copie explicite versus modification en place<\/h3>\n<p>Lorsque l&rsquo;on manipule des matrices massives occupant plusieurs gigaoctets au sein de la m\u00e9moire vive, la gestion de l&rsquo;allocation dynamique des tampons m\u00e9moire devient un facteur d\u00e9terminant pour la vitesse d&rsquo;ex\u00e9cution globale du syst\u00e8me. Par d\u00e9faut, la majorit\u00e9 des op\u00e9rations arithm\u00e9tiques en Python allouent de nouveaux tableaux pour stocker les r\u00e9sultats interm\u00e9diaires, ce qui peut saturer la m\u00e9moire et d\u00e9clencher des op\u00e9rations co\u00fbteuses d&rsquo;\u00e9viction sur le disque (<em>swapping<\/em>).<\/p>\n<p>Pour optimiser l&#8217;empreinte m\u00e9moire, NumPy permet d&rsquo;ex\u00e9cuter des modifications directement \u00ab en place \u00bb (<em>in-place<\/em>) sur le tampon m\u00e9moire initial de la matrice. Cette technique s&rsquo;appuie sur les op\u00e9rateurs d&rsquo;assignation augment\u00e9e, tels que <code>\/=<\/code>, ou sur le param\u00e8tre de sortie explicite <code>out=<\/code> disponible sur la quasi-totalit\u00e9 des fonctions universelles (<em>ufuncs<\/em>) :<\/p>\n<p><code>normes = np.linalg.norm(matrice, axis=1, keepdims=True)<\/code><br \/>\n<code>matrice \/= normes  # Modification directe sans allocation d'une nouvelle matrice dense<\/code><\/p>\n<p>De fa\u00e7on \u00e9quivalente, au sein de Scikit-Learn, la fonction <code>normalize<\/code> supporte l&rsquo;argument <code>copy=False<\/code>, lequel ordonne au transformateur d&rsquo;\u00e9craser directement les valeurs d&rsquo;origine au sein du tableau fourni :<\/p>\n<p><code>skp.normalize(matrice, norm='l2', axis=1, copy=False)<\/code><\/p>\n<p>Il importe toutefois de manipuler ces modifications en place avec une vigilance extr\u00eame. Si la matrice initiale est partag\u00e9e entre plusieurs processus ou sous-fonctions au moyen de vues m\u00e9moires (<em>views<\/em>), \u00e9craser ses composantes scalaires alt\u00e8re silencieusement l&rsquo;\u00e9tat global du programme, ce qui peut induire des effets de bord impr\u00e9visibles dans le reste de l&rsquo;application.<\/p>\n<h3>9.2 \u00c9valuation comparative des temps d&rsquo;ex\u00e9cution (Benchmarking)<\/h3>\n<p>L&rsquo;arbitrage technique entre les diff\u00e9rentes solutions logicielles doit s&rsquo;appuyer sur des mesures empiriques rigoureuses de temps d&rsquo;ex\u00e9cution. Pour quantifier les divergences de performance, nous pouvons d\u00e9ployer le module standard <code>timeit<\/code> sur une matrice de taille cons\u00e9quente comportant $5,000$ lignes et $1,000$ colonnes en double pr\u00e9cision (environ $40$ m\u00e9gaoctets de donn\u00e9es brutes).<\/p>\n<p>L&rsquo;\u00e9valuation comparative s&rsquo;articule autour de trois impl\u00e9mentations distinctes ex\u00e9cutant une normalisation euclidienne sur les lignes :<\/p>\n<ol>\n<li>L&rsquo;approche Scikit-Learn avec copie : <code>skp.normalize(X, norm='l2', axis=1, copy=True)<\/code><\/li>\n<li>L&rsquo;approche NumPy vectoris\u00e9e standard : <code>X \/ np.linalg.norm(X, axis=1, keepdims=True)<\/code><\/li>\n<li>L&rsquo;approche NumPy optimis\u00e9e en place :<br \/>\n        <code>normes = np.linalg.norm(X, axis=1, keepdims=True)<\/code><br \/>\n        <code>np.divide(X, normes, out=X)<\/code>\n    <\/li>\n<\/ol>\n<p>Sur des architectures processeur multi-c\u0153urs modernes, les mesures temporelles r\u00e9v\u00e8lent des enseignements cruciaux. L&rsquo;impl\u00e9mentation Scikit-Learn introduit un l\u00e9ger surco\u00fbt computationnel (<em>overhead<\/em>) &mdash; de l&rsquo;ordre de 5 \u00e0 15 % sur des matrices moyennes &mdash; induit par les v\u00e9rifications de validation des donn\u00e9es d&rsquo;entr\u00e9e (fonction <code>check_array<\/code>), l&rsquo;inspection des types et la compatibilit\u00e9 avec les formats creux. L&rsquo;approche NumPy native vectoris\u00e9e supprime ces couches de validation et s&rsquo;ex\u00e9cute avec une vitesse accrue.<\/p>\n<p>L&rsquo;impl\u00e9mentation en place avec <code>np.divide(..., out=X)<\/code> surpasse syst\u00e9matiquement les autres approches sur les structures volumineuses, car elle \u00e9limine enti\u00e8rement le temps d&rsquo;allocation d&rsquo;une matrice de sortie et optimise l&rsquo;exploitation des lignes de cache du processeur (caches L1, L2 et L3). Cependant, lorsque les dimensions matricielles deviennent colossales, l&rsquo;int\u00e9gration de compilateurs Just-In-Time tels que Numba ou l&rsquo;utilisation d&rsquo;acc\u00e9l\u00e9rateurs graphiques via CuPy permettent d&rsquo;abaisser encore d&rsquo;un ordre de grandeur les temps de latence en parall\u00e9lisant les calculs sur des milliers de c\u0153urs mat\u00e9riels.<\/p>\n<h3>9.3 Traitement de matrices creuses et volumineuses<\/h3>\n<p>Dans de nombreuses disciplines quantitatives, les matrices d&rsquo;observation pr\u00e9sentent un taux de dispersion (<em>sparsity<\/em>) particuli\u00e8rement prononc\u00e9, avec plus de 95 \u00e0 99 % de cellules strictement nulles. C&rsquo;est typiquement le cas des matrices de co-occurrence de termes dans le traitement automatique des langues ou des graphes d&rsquo;interaction sociale. Repr\u00e9senter ces structures sous la forme de tableaux denses <code>np.ndarray<\/code> saturerait rapidement la m\u00e9moire vive disponible.<\/p>\n<p>Pour contourner cette contrainte, la biblioth\u00e8que SciPy met \u00e0 disposition des structures de stockage compress\u00e9es hautement sp\u00e9cialis\u00e9es, au premier rang desquelles figurent les formats CSR (<em>Compressed Sparse Row<\/em>) et CSC (<em>Compressed Sparse Column<\/em>) au sein du module <a rel=\"noopener noreferrer\" href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/sparse.html\"><code>scipy.sparse<\/code><\/a>. La force de la fonction <code>sklearn.preprocessing.normalize<\/code> r\u00e9side dans sa capacit\u00e9 native \u00e0 op\u00e9rer directement sur ces formats creux sans jamais forcer une densification de la matrice :<\/p>\n<p><code>from scipy.sparse import csr_matrix<\/code><br \/>\n<code>matrice_creuse = csr_matrix(matrice_base)<\/code><br \/>\n<code>matrice_creuse_norm = skp.normalize(matrice_creuse, norm='l1', axis=1)<\/code><\/p>\n<p>L&rsquo;algorithme sous-jacent parcourt exclusivement les index des \u00e9l\u00e9ments non nuls (attribut <code>data<\/code> du format CSR) pour calculer les normes de r\u00e9duction, puis divise uniquement ces valeurs sans toucher aux cellules vides. Cette approche pr\u00e9serve la structure compacte de la matrice. Tenter d&rsquo;effectuer une op\u00e9ration analogue en NumPy pur sans discernement (par exemple en convertissant la matrice par <code>matrice_creuse.toarray()<\/code>) conduirait in\u00e9vitablement \u00e0 un effondrement m\u00e9moire imm\u00e9diat pour des jeux de donn\u00e9es d&rsquo;\u00e9chelle industrielle.<\/p>\n<p>Pour les volumes de donn\u00e9es surpassant la m\u00e9moire vive globale d&rsquo;une station de travail, l&rsquo;int\u00e9gration de biblioth\u00e8ques de calcul partitionn\u00e9 hors-m\u00e9moire comme Dask permet de segmenter la matrice en blocs et d&rsquo;ordonnancer les \u00e9tapes de normalisation le long d&rsquo;un graphe de calcul asynchrone distribu\u00e9.<\/p>\n<h2>10. Applications interdisciplinaires et contextes d&rsquo;analyse empirique<\/h2>\n<h3>10.1 Pr\u00e9traitement de matrices d&rsquo;observation en sciences comportementales<\/h3>\n<p>En sciences comportementales, en psychom\u00e9trie et en sociologie quantitative, les matrices de donn\u00e9es synth\u00e9tisent typiquement les profils de r\u00e9ponses d&rsquo;un ensemble de participants (les lignes) confront\u00e9s \u00e0 une batterie d&rsquo;items ou d&rsquo;\u00e9chelles d&rsquo;attitudes de type Likert (les colonnes). Une difficult\u00e9 m\u00e9thodologique majeure r\u00e9side dans l&rsquo;existence de biais de r\u00e9ponse individuels syst\u00e9matiques, tels que le biais d&rsquo;acquiescement ou la tendance stylistique \u00e0 s\u00e9lectionner syst\u00e9matiquement les bornes extr\u00eames de l&rsquo;\u00e9chelle d&rsquo;\u00e9valuation ind\u00e9pendamment du contenu s\u00e9mantique des propositions.<\/p>\n<p>La normalisation matricielle par ligne constitue une r\u00e9ponse m\u00e9thodologique \u00e9prouv\u00e9e pour neutraliser ces artefacts individuels, une op\u00e9ration d\u00e9sign\u00e9e sous le terme d&rsquo;ipsatisation des profils :<\/p>\n<ul>\n<li>En appliquant une normalisation euclidienne (<span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>) sur chaque vecteur d&rsquo;observation individuel, on contraint chaque sujet exp\u00e9rimental \u00e0 poss\u00e9der un vecteur de poids unitaire dans l&rsquo;espace psychom\u00e9trique global.<\/li>\n<li>Ce pr\u00e9traitement annule l&rsquo;effet d&rsquo;amplitude propre aux styles de r\u00e9ponse, recentrant l&rsquo;analyse sur la morphologie relative des pr\u00e9f\u00e9rences plut\u00f4t que sur leur intensit\u00e9 absolue d\u00e9clar\u00e9e.<\/li>\n<\/ul>\n<p>De surcro\u00eet, cette approche s&rsquo;av\u00e8re tout aussi d\u00e9terminante dans le traitement des matrices de confusion issues de protocoles de validation exp\u00e9rimentale. Pour comparer la performance d&rsquo;un mod\u00e8le de classification au travers de cat\u00e9gories pr\u00e9sentant des d\u00e9s\u00e9quilibres d&rsquo;effectifs marqu\u00e9s, la normalisation <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> par ligne de la matrice de confusion transforme les comptages bruts en taux d&rsquo;exactitude conditionnels (rappels par classe). Les sommes horizontales deviennent strictement unitaires, offrant ainsi une lecture probabiliste directe des pr\u00e9dictions du mod\u00e8le.<\/p>\n<h3>10.2 Matrices de corr\u00e9lation, de covariance et de connectivit\u00e9<\/h3>\n<p>Dans l&rsquo;analyse des r\u00e9seaux complexes, en neuro-imagerie fonctionnelle et en \u00e9conom\u00e9trie financi\u00e8re, les structures matricielles mod\u00e9lisent les interrelations existant entre de multiples composantes dynamiques. \u00c0 partir d&rsquo;une matrice empirique de covariance <span class=\"arabpsy-math-inline\" data-latex=\"\\Sigma in \\mathbb{R}^{n \\times n}\">$\\Sigma in \\mathbb{R}^{n \\times n}$<\/span>, l&rsquo;extraction formelle de la matrice de corr\u00e9lation lin\u00e9aire de Pearson <span class=\"arabpsy-math-inline\" data-latex=\"R\">$R$<\/span> s&rsquo;interpr\u00e8te pr\u00e9cis\u00e9ment comme une double normalisation orthogonale de rang\u00e9e et de colonne par la norme euclidienne des \u00e9carts-types marginaux :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"R = D^{-1} \\Sigma D^{-1} \\quad \\text{o\u00f9} \\quad D = operatorname{diag}(\\sqrt{\\Sigma_{11}}, \\sqrt{\\Sigma_{22}}, dots, \\sqrt{\\Sigma_{nn}})\">$$R = D^{-1} \\Sigma D^{-1} \\quad \\text{o\u00f9} \\quad D = operatorname{diag}(\\sqrt{\\Sigma_{11}}, \\sqrt{\\Sigma_{22}}, dots, \\sqrt{\\Sigma_{nn}})$$<\/span><\/p>\n<p>En NumPy pur, cette d\u00e9composition s&rsquo;ex\u00e9cute de fa\u00e7on \u00e9l\u00e9gante en extrayant la diagonale principale :<\/p>\n<p><code>d = np.sqrt(np.diag(sigma))<\/code><br \/>\n<code>r = sigma \/ np.outer(d, d)<\/code><\/p>\n<p>Dans le champ de la th\u00e9orie spectrale des graphes, la construction du <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Laplacian_matrix#Symmetric_normalized_Laplacian\">Laplacien normalis\u00e9 sym\u00e9trique<\/a> <span class=\"arabpsy-math-inline\" data-latex=\"L_{\\text{sym}}\">$L_{\\text{sym}}$<\/span> \u00e0 partir de la matrice d&rsquo;adjacence <span class=\"arabpsy-math-inline\" data-latex=\"A\">$A$<\/span> et de la matrice diagonale des degr\u00e9s <span class=\"arabpsy-math-inline\" data-latex=\"D\">$D$<\/span> illustre avec force la port\u00e9e th\u00e9orique de cette d\u00e9marche :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"L_{\\text{sym}} = D^{-1\/2} (D - A) D^{-1\/2} = I - D^{-1\/2} A D^{-1\/2}\">$$L_{\\text{sym}} = D^{-1\/2} (D &#8211; A) D^{-1\/2} = I &#8211; D^{-1\/2} A D^{-1\/2}$$<\/span><\/p>\n<p>Cette double normalisation matricielle conf\u00e8re au spectre du Laplacien des propri\u00e9t\u00e9s math\u00e9matiques fondamentales : l&rsquo;ensemble des valeurs propres est strictement confin\u00e9 au sein du segment r\u00e9el <span class=\"arabpsy-math-inline\" data-latex=\"[0, 2]\">$[0, 2]$<\/span>. Cette contrainte assure la convergence des algorithmes de diffusion spectrale, r\u00e9gularise le partitionnement par segmentation de graphe et garantit la stabilit\u00e9 des convolutions spatiales au sein des r\u00e9seaux de neurones sur graphes (<em>Graph Convolutional Networks<\/em>).<\/p>\n<h3>10.3 Ing\u00e9nierie des caract\u00e9ristiques pour les algorithmes non supervis\u00e9s<\/h3>\n<p>L&rsquo;efficacit\u00e9 des algorithmes d&rsquo;apprentissage non supervis\u00e9 &mdash; qu&rsquo;il s&rsquo;agisse de regroupement par partitionnement (clustering) ou de r\u00e9duction de dimension non lin\u00e9aire &mdash; est intimement li\u00e9e \u00e0 la structure g\u00e9om\u00e9trique de la matrice d&rsquo;observations fournie en entr\u00e9e. L&rsquo;algorithme des <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>-moyennes (<em>k-means<\/em>), par exemple, cherche \u00e0 minimiser l&rsquo;inertie intra-classe au moyen de la distance euclidienne canonique. Si les donn\u00e9es n&rsquo;ont pas subi une normalisation pr\u00e9alable rigoureuse, les descripteurs affichant des amplitudes volumineuses orientent arbitrairement la formation des centro\u00efdes au d\u00e9triment des variables de faible amplitude mais de haute valeur s\u00e9paratrice.<\/p>\n<p>Par ailleurs, dans les espaces s\u00e9mantiques \u00e0 haute dimensionnalit\u00e9 &mdash; tels que les plongements lexicaux issus de mod\u00e8les de traitement du langage &mdash;, la norme euclidienne brute d&rsquo;un vecteur refl\u00e8te fr\u00e9quemment la fr\u00e9quence d&rsquo;apparition du terme ou la longueur du document plut\u00f4t que son sens intrins\u00e8que. L&rsquo;application syst\u00e9matique d&rsquo;une normalisation unitaire par ligne (<span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>) projette l&rsquo;ensemble des descripteurs sur l&rsquo;hypersph\u00e8re unit\u00e9. Dans cette g\u00e9om\u00e9trie sph\u00e9rique, l&rsquo;\u00e9valuation de la distance euclidienne au carr\u00e9 entre deux points devient strictement proportionnelle \u00e0 leur distance cosinus :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"|\\tilde{u} - \\tilde{v}|_2^2 = |\\tilde{u}|_2^2 + |\\tilde{v}|_2^2 - 2 \\langle \\tilde{u}, \\tilde{v} \\rangle = 2 - 2 \\cos(\\theta)\">$$|\\tilde{u} &#8211; \\tilde{v}|_2^2 = |\\tilde{u}|_2^2 + |\\tilde{v}|_2^2 &#8211; 2 \\langle \\tilde{u}, \\tilde{v} \\rangle = 2 &#8211; 2 \\cos(\\theta)$$<\/span><\/p>\n<p>Cette propri\u00e9t\u00e9 simplifie consid\u00e9rablement le calcul des voisinages topologiques requis par des algorithmes d&rsquo;int\u00e9gration non lin\u00e9aire de dimensionnalit\u00e9 tels que le t-SNE ou UMAP. En garantissant l&rsquo;isotropie sph\u00e9rique des repr\u00e9sentations vectorielles, la normalisation pr\u00e9alable stabilise l&rsquo;agencement des vari\u00e9t\u00e9s de basse dimension et facilite l&rsquo;interpr\u00e9tation des regroupements obtenus.<\/p>\n<h2>11. Erreurs courantes, pi\u00e8ges m\u00e9thodologiques et diagnostics<\/h2>\n<h3>11.1 Confusion de l&rsquo;orientation axiale (Axe 0 vs Axe 1)<\/h3>\n<p>L&rsquo;inversion de l&rsquo;orientation axiale &mdash; c&rsquo;est-\u00e0-dire l&rsquo;assignation de <code>axis=0<\/code> en lieu et place de <code>axis=1<\/code> &mdash; repr\u00e9sente sans doute l&rsquo;erreur la plus fr\u00e9quente et la plus insidieuse lors de la manipulation de matrices NumPy. Cette m\u00e9prise engendre des r\u00e9percussions statistiques majeures : normaliser le long de l&rsquo;axe vertical revient \u00e0 traiter chaque variable ind\u00e9pendamment, tandis que normaliser le long de l&rsquo;axe horizontal modifie les proportions internes \u00e0 chaque observation.<\/p>\n<p>Pour bien appr\u00e9hender cette distinction dans NumPy :<\/p>\n<ul>\n<li><code>axis=0<\/code> d\u00e9signe l&rsquo;axe des lignes. L&rsquo;op\u00e9ration s&rsquo;ex\u00e9cute \u00ab le long des lignes \u00bb, ce qui signifie que l&rsquo;on s&rsquo;effondre verticalement pour produire une m\u00e9trique par <em>colonne<\/em>.<\/li>\n<li><code>axis=1<\/code> d\u00e9signe l&rsquo;axe des colonnes. L&rsquo;op\u00e9ration s&rsquo;ex\u00e9cute \u00ab le long des colonnes \u00bb, s&rsquo;effondrant horizontalement pour produire une m\u00e9trique par <em>ligne<\/em>.<\/li>\n<\/ul>\n<p>Une confusion d&rsquo;axe peut totalement d\u00e9naturer l&rsquo;interpr\u00e9tation d&rsquo;un jeu de donn\u00e9es. Par exemple, si l&rsquo;on cherche \u00e0 convertir des profils individuels en distributions de probabilit\u00e9s (somme unitaire par ligne via une norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span>) et que l&rsquo;on applique par m\u00e9garde <code>axis=0<\/code>, ce sont les colonnes qui deviendront unitaires. Les profils individuels ne sommeront plus \u00e0 un, compromettant imm\u00e9diatement la validit\u00e9 des mod\u00e8les statistiques appliqu\u00e9s en aval.<\/p>\n<p>Pour pr\u00e9munir son code contre ces erreurs d&rsquo;inversion, il est indispensable d&rsquo;int\u00e9grer des tests unitaires automatis\u00e9s utilisant des assertions dimensionnelles explicites :<\/p>\n<p><code># Assertion de v\u00e9rification d'une normalisation par ligne (axis=1)<\/code><br \/>\n<code>sommes_lignes = np.sum(matrice_normalisee, axis=1)<\/code><br \/>\n<code>assert np.allclose(sommes_lignes, 1.0), \"\u00c9chec de validation : la normalisation par ligne est incorrecte !\"<\/code><\/p>\n<p>L&rsquo;introduction syst\u00e9matique de ces gardes-fous logiques au sein du code permet de d\u00e9tecter imm\u00e9diatement toute d\u00e9rive d&rsquo;orientation axiale avant le d\u00e9ploiement en production.<\/p>\n<h3>11.2 Fuite d&rsquo;information (Data Leakage) lors de la mise \u00e0 l&rsquo;\u00e9chelle<\/h3>\n<p>Dans les pipelines d&rsquo;apprentissage automatique supervis\u00e9, la fuite d&rsquo;information statistique &mdash; commun\u00e9ment d\u00e9sign\u00e9e sous le terme anglophone de <em>data leakage<\/em> &mdash; constitue un pi\u00e8ge m\u00e9thodologique majeur qui invalide la fiabilit\u00e9 des m\u00e9triques d&rsquo;\u00e9valuation du mod\u00e8le. Ce ph\u00e9nom\u00e8ne survient lorsqu&rsquo;une transformation matricielle globale (comme un centrage-r\u00e9duction ou un redimensionnement Min-Max) est appliqu\u00e9e sur l&rsquo;ensemble de la matrice de donn\u00e9es <em>avant<\/em> de proc\u00e9der \u00e0 la partition entre le jeu d&rsquo;entra\u00eenement et le jeu de test.<\/p>\n<p>En proc\u00e9dant de la sorte, les valeurs statistiques d\u00e9termin\u00e9es lors de la normalisation (telles que le minimum absolu, le maximum ou la moyenne empirique) int\u00e8grent des informations issues directement des \u00e9chantillons de test. Le mod\u00e8le b\u00e9n\u00e9ficie alors d&rsquo;un aper\u00e7u ill\u00e9gitime de la distribution des donn\u00e9es futures lors de son entra\u00eenement, conduisant \u00e0 des estimations de performance artificiellement optimistes qui s&rsquo;effondrent lors du d\u00e9ploiement en conditions r\u00e9elles.<\/p>\n<p>Pour \u00e9liminer rigoureusement tout risque de fuite d&rsquo;information, il convient d&rsquo;appliquer la s\u00e9quence m\u00e9thodologique suivante :<\/p>\n<ol>\n<li>Partitionner la matrice de donn\u00e9es en sous-ensembles d&rsquo;entra\u00eenement et de test de mani\u00e8re strictement \u00e9tanche.<\/li>\n<li>Ajuster le transformateur exclusivement sur la matrice d&rsquo;entra\u00eenement via la m\u00e9thode <code>fit<\/code> ou <code>fit_transform<\/code>.<\/li>\n<li>Appliquer cette transformation sur la matrice de test \u00e0 l&rsquo;aide de la m\u00e9thode <code>transform<\/code>, en r\u00e9utilisant sans alt\u00e9ration les param\u00e8tres appris sur le jeu d&rsquo;entra\u00eenement.<\/li>\n<\/ol>\n<p>Cette s\u00e9quence s&rsquo;impl\u00e9mente de fa\u00e7on robuste gr\u00e2ce aux pipelines de Scikit-Learn (<code>sklearn.pipeline.Pipeline<\/code>), qui encapsulent le transformateur et le mod\u00e8le pour pr\u00e9venir toute contamination crois\u00e9e lors des validations crois\u00e9es.<\/p>\n<h3>11.3 Alt\u00e9ration involontaire de la parcimonie des donn\u00e9es<\/h3>\n<p>Un autre \u00e9cueil m\u00e9thodologique fr\u00e9quent concerne la rupture involontaire de la structure de parcimonie (<em>sparsity<\/em>) lors de transformations matricielles mal adapt\u00e9es. Lorsqu&rsquo;une matrice de donn\u00e9es comporte un grand nombre de z\u00e9ros structurels &mdash; comme c&rsquo;est le cas pour les matrices document-terme ou les graphes d&rsquo;interaction &mdash;, ces z\u00e9ros repr\u00e9sentent une absence d&rsquo;\u00e9v\u00e9nement qui ne requiert aucun co\u00fbt de stockage dans les formats compress\u00e9s adapt\u00e9s (tels que CSR ou CSC).<\/p>\n<p>L&rsquo;application d&rsquo;une transformation comportant un centrage (comme la standardisation <span class=\"arabpsy-math-inline\" data-latex=\"z\">$z$<\/span>-score, qui soustrait la moyenne empirique de chaque valeur) convertit instantan\u00e9ment l&rsquo;ensemble des z\u00e9ros structurels en valeurs non nulles (la n\u00e9gative de la moyenne). Cette rupture de parcimonie provoque une \u00ab densification \u00bb brutale de la matrice : une structure compress\u00e9e qui occupait initialement quelques m\u00e9gaoctets peut subitement exiger plusieurs dizaines de gigaoctets en m\u00e9moire, provoquant un arr\u00eat critique du programme par d\u00e9passement de m\u00e9moire (<code>MemoryError<\/code>).<\/p>\n<p>Pour pr\u00e9server l&rsquo;int\u00e9grit\u00e9 et la l\u00e9g\u00e8ret\u00e9 des structures creuses, il convient de privil\u00e9gier des transformations sans centrage :<\/p>\n<ul>\n<li>La normalisation vectorielle unitaire (via les normes <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span> ou <span class=\"arabpsy-math-inline\" data-latex=\"L_\\infty\">$L_\\infty$<\/span>), qui divise simplement les composantes non nulles par un facteur d&rsquo;\u00e9chelle, conservant strictement la valeur z\u00e9ro (<span class=\"arabpsy-math-inline\" data-latex=\"0 \/ lambda = 0\">$0 \/ lambda = 0$<\/span>).<\/li>\n<li>L&rsquo;utilisation de transformateurs sp\u00e9cialis\u00e9s capables de pr\u00e9server la parcimonie, tels que <code>sklearn.preprocessing.MaxAbsScaler<\/code>, qui met \u00e0 l&rsquo;\u00e9chelle les valeurs dans l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[-1, 1]\">$[-1, 1]$<\/span> sans soustraire la moyenne.<\/li>\n<\/ul>\n<p>Un contr\u00f4le r\u00e9gulier du taux de parcimonie de la matrice avant et apr\u00e8s normalisation (par exemple en \u00e9valuant <code>np.count_nonzero(matrice) \/ matrice.size<\/code>) permet d&rsquo;attester que la compacit\u00e9 structurelle des donn\u00e9es a bien \u00e9t\u00e9 pr\u00e9serv\u00e9e.<\/p>\n<h2>12. Synth\u00e8se comparative et arbre d\u00e9cisionnel pour le praticien<\/h2>\n<h3>12.1 Tableau synoptique des m\u00e9thodes de normalisation<\/h3>\n<p>Afin de fournir un panorama comparatif synth\u00e9tique des diff\u00e9rentes techniques abord\u00e9es, le tableau ci-dessous r\u00e9capitule les formulations analytiques, les fonctions logicielles associ\u00e9es, leurs complexit\u00e9s computationnelles respectives et leurs cas d&rsquo;usage pr\u00e9f\u00e9rentiels en analyse quantitative :<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; text-align: left;\">\n<thead>\n<tr style=\"background-color: #f2f2f2;\">\n<th>M\u00e9thode<\/th>\n<th>Formulation Math\u00e9matique<\/th>\n<th>Impl\u00e9mentation NumPy \/ Sklearn<\/th>\n<th>Plage Cible<\/th>\n<th>Sensibilit\u00e9 Outliers<\/th>\n<th>Contexte Recommand\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Norme L1 (Manhattan)<\/strong><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = x \/ \\sum |x_i|\">$\\tilde{x} = x \/ \\sum |x_i|$<\/span><\/td>\n<td><code>normalize(norm='l1')<\/code><br \/><code>x \/ np.sum(abs(x))<\/code><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span> (si <span class=\"arabpsy-math-inline\" data-latex=\"x ge 0\">$x ge 0$<\/span>) ; <span class=\"arabpsy-math-inline\" data-latex=\"\\sum \\tilde{x}_i = 1\">$\\sum \\tilde{x}_i = 1$<\/span><\/td>\n<td>Mod\u00e9r\u00e9e<\/td>\n<td>Distributions probabilistes, analyse de corpus textuels, abondance relative.<\/td>\n<\/tr>\n<tr>\n<td><strong>Norme L2 (Euclidienne)<\/strong><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = x \/ \\sqrt{\\sum x_i^2}\">$\\tilde{x} = x \/ \\sqrt{\\sum x_i^2}$<\/span><\/td>\n<td><code>normalize(norm='l2')<\/code><br \/><code>x \/ np.linalg.norm(x)<\/code><\/td>\n<td>Hypersph\u00e8re <span class=\"arabpsy-math-inline\" data-latex=\"\\mathbb{S}^{k-1}\">$\\mathbb{S}^{k-1}$<\/span> ; <span class=\"arabpsy-math-inline\" data-latex=\"|\\tilde{x}|_2 = 1\">$|\\tilde{x}|_2 = 1$<\/span><\/td>\n<td>Moyenne \u00e0 \u00e9lev\u00e9e<\/td>\n<td>Similarit\u00e9 cosinus, m\u00e9canismes d&rsquo;attention, plongements lexicaux, r\u00e9duction PCA.<\/td>\n<\/tr>\n<tr>\n<td><strong>Norme L-infini (Max)<\/strong><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = x \/ \\max |x_i|\">$\\tilde{x} = x \/ \\max |x_i|$<\/span><\/td>\n<td><code>normalize(norm='max')<\/code><br \/><code>x \/ np.max(abs(x))<\/code><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"[-1, 1]\">$[-1, 1]$<\/span><\/td>\n<td>Tr\u00e8s \u00e9lev\u00e9e<\/td>\n<td>Traitement du signal, contraintes mat\u00e9rielles de saturation, pr\u00e9servation des z\u00e9ros.<\/td>\n<\/tr>\n<tr>\n<td><strong>Min-Max Scaling<\/strong><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{x} = \\frac{x - \\min(x)}{\\max(x) - \\min(x)}\">$\\tilde{x} = \\frac{x &#8211; \\min(x)}{\\max(x) &#8211; \\min(x)}$<\/span><\/td>\n<td><code>MinMaxScaler()<\/code><br \/><code>(x - min) \/ (max - min)<\/code><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span><\/td>\n<td>Critique (tr\u00e8s forte)<\/td>\n<td>Traitement d&rsquo;images (niveaux de gris), r\u00e9seaux neuronaux \u00e0 fonctions d&rsquo;activation born\u00e9es.<\/td>\n<\/tr>\n<tr>\n<td><strong>Norme de Frobenius<\/strong><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"\\tilde{A} = A \/ \\sqrt{operatorname{Tr}(A^T A)}\">$\\tilde{A} = A \/ \\sqrt{operatorname{Tr}(A^T A)}$<\/span><\/td>\n<td><code>A \/ np.linalg.norm(A, 'fro')<\/code><\/td>\n<td><span class=\"arabpsy-math-inline\" data-latex=\"|\\tilde{A}|_F = 1\">$|\\tilde{A}|_F = 1$<\/span> (global)<\/td>\n<td>Moyenne<\/td>\n<td>Matrices de convolution, matrices de densit\u00e9, r\u00e9gularisation spectrale globale.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>12.2 Arbre d\u00e9cisionnel pour s\u00e9lectionner la transformation optimale<\/h3>\n<p>Pour guider le praticien face \u00e0 un jeu de donn\u00e9es matriciel concret, le processus de d\u00e9cision analytique peut \u00eatre structur\u00e9 sous la forme d&rsquo;un cheminement logique \u00e9tape par \u00e9tape :<\/p>\n<p><strong>\u00c9tape 1 : D\u00e9termination de la dimension d&rsquo;application<\/strong><\/p>\n<ul>\n<li>Si la transformation doit harmoniser les <em>profils individuels d&rsquo;observations<\/em> &rarr; S\u00e9lectionner <code>axis=1<\/code> (normalisation horizontale par ligne).<\/li>\n<li>Si la transformation doit \u00e9quilibrer les <em>\u00e9chelles de variables h\u00e9t\u00e9rog\u00e8nes<\/em> &rarr; S\u00e9lectionner <code>axis=0<\/code> (normalisation verticale par colonne).<\/li>\n<li>Si la transformation concerne l&rsquo;\u00e9nergie globale d&rsquo;un <em>tenseur bidimensionnel complet<\/em> (image, op\u00e9rateur lin\u00e9aire) &rarr; Proc\u00e9der \u00e0 une normalisation globale (norme de Frobenius sans axe sp\u00e9cifi\u00e9).<\/li>\n<\/ul>\n<p><strong>\u00c9tape 2 : Analyse de la structure distributionnelle et de la parcimonie<\/strong><\/p>\n<ul>\n<li>Si la matrice est <em>creuse (sparse)<\/em> et comprend une forte proportion de z\u00e9ros structurels &rarr; Exclure imp\u00e9rativement toute soustraction de la moyenne ou translation Min-Max. Privil\u00e9gier une normalisation vectorielle unitaire (<span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> ou <span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span>) qui pr\u00e9serve rigoureusement la parcimonie m\u00e9moire.<\/li>\n<li>Si les donn\u00e9es pr\u00e9sentent des <em>valeurs aberrantes notables<\/em> &rarr; \u00c9viter la mise \u00e0 l&rsquo;\u00e9chelle Min-Max. Pr\u00e9f\u00e9rer une normalisation par la norme <span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span> ou un recentrage robuste fond\u00e9 sur les quantiles (tel que <code>RobustScaler<\/code>).<\/li>\n<\/ul>\n<p><strong>\u00c9tape 3 : Alignement avec le mod\u00e8le math\u00e9matique aval<\/strong><\/p>\n<ul>\n<li>Pour des algorithmes reposant sur des m\u00e9triques de <em>similarit\u00e9 angulaire ou cosinus<\/em> (recherche s\u00e9mantique, classification de documents, mod\u00e8les de recommandation) &rarr; D\u00e9ployer la normalisation euclidienne <strong><span class=\"arabpsy-math-inline\" data-latex=\"L_2\">$L_2$<\/span><\/strong>.<\/li>\n<li>Pour des mod\u00e8les interpr\u00e9tant les composantes comme des <em>proportions relatives ou des probabilit\u00e9s<\/em> (mod\u00e8les g\u00e9n\u00e9ratifs, graphes de Markov, mod\u00e8les bay\u00e9siens) &rarr; D\u00e9ployer la normalisation de Manhattan <strong><span class=\"arabpsy-math-inline\" data-latex=\"L_1\">$L_1$<\/span><\/strong>.<\/li>\n<li>Pour des algorithmes n\u00e9cessitant un <em>bornage strict sur un intervalle compact<\/em> sans d\u00e9calage d&rsquo;origine (signaux audionum\u00e9riques, contr\u00f4le physique) &rarr; D\u00e9ployer la normalisation <strong><span class=\"arabpsy-math-inline\" data-latex=\"L_\\infty\">$L_\\infty$<\/span><\/strong> ou <code>MaxAbsScaler<\/code>.<\/li>\n<\/ul>\n<p>En observant ce cadre m\u00e9thodologique rigoureux, le praticien s&rsquo;assure de s\u00e9lectionner la strat\u00e9gie de normalisation la plus pertinente d&rsquo;un point de vue math\u00e9matique et la plus robuste computationnellement, garantissant la fiabilit\u00e9 et la reproductibilit\u00e9 de l&rsquo;ensemble de ses analyses quantitatives.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Bishop, C. M. (2006). <em>Pattern Recognition and Machine Learning<\/em>. Springer. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.springer.com\/gp\/book\/9780387310732\">https:\/\/www.springer.com\/gp\/book\/9780387310732<\/a><\/li>\n<li>Golub, G. H., &amp; Van Loan, C. F. (2013). <em>Matrix Computations<\/em> (4e \u00e9d.). Johns Hopkins University Press. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.press.jhu.edu\/books\/title\/10411\/matrix-computations\">https:\/\/www.press.jhu.edu\/books\/title\/10411\/matrix-computations<\/a><\/li>\n<li>Goodfellow, I., Bengio, Y., &amp; Courville, A. (2016). <em>Deep Learning<\/em>. MIT Press. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.deeplearningbook.org\">https:\/\/www.deeplearningbook.org<\/a><\/li>\n<li>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., &#8230; &amp; Oliphant, T. E. (2020). Array programming with NumPy. <em>Nature<\/em>, 585(7825), 357-362. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41586-020-2649-2\">https:\/\/doi.org\/10.1038\/s41586-020-2649-2<\/a><\/li>\n<li>Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., &#8230; &amp; Duchesnay, \u00c9. (2011). Scikit-learn: Machine learning in Python. <em>Journal of Machine Learning Research<\/em>, 12, 2825-2830. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.jmlr.org\/papers\/v12\/pedregosa11a.html\">https:\/\/www.jmlr.org\/papers\/v12\/pedregosa11a.html<\/a><\/li>\n<li>Strang, G. (2016). <em>Introduction to Linear Algebra<\/em> (5e \u00e9d.). Wellesley-Cambridge Press. <a rel=\"noopener noreferrer\" href=\"https:\/\/math.mit.edu\/~gs\/linearalgebra\/\">https:\/\/math.mit.edu\/~gs\/linearalgebra\/<\/a><\/li>\n<li>Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T., Cournapeau, D., &#8230; &amp; SciPy 1.0 Contributors. (2020). SciPy 1.0: Fundamental algorithms for scientific computing in Python. <em>Nature Methods<\/em>, 17(3), 261-272. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41592-019-0686-2\">https:\/\/doi.org\/10.1038\/s41592-019-0686-2<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour normaliser une matrice NumPy : normes L1, L2, Min-Max, syntaxe Scikit-Learn et calcul vectoriel en Python avec exemples.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2465,2464],"tags":[4178,2822,2960,3103,2904],"class_list":["post-13391","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-python","category-science-des-donnees","tag-algebre-lineaire","tag-normalisation","tag-numpy","tag-pretraitement-de-donnees","tag-scikit-learn"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/13391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13391"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/13391\/revisions"}],"predecessor-version":[{"id":16875,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/13391\/revisions\/16875"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}