From 8af9720ceac1038678e5f08f00d4b2e739135b69 Mon Sep 17 00:00:00 2001 From: medina5 Date: Tue, 16 Sep 2025 07:52:01 +0200 Subject: [PATCH] vecteurs --- vecteurs.classification.md | 73 +++++++++++ vecteurs.index.md | 60 +++++++++ vecteurs.md | 139 +++++++++++++++++++-- vecteurs.readme.md | 249 ++++++++++++++++++++++++------------- vecteurs/kd-tree.png | Bin 0 -> 19839 bytes vecteurs/kd-tree.svg | 121 ++++++++++++++++++ 6 files changed, 542 insertions(+), 100 deletions(-) create mode 100644 vecteurs.classification.md create mode 100644 vecteurs.index.md create mode 100644 vecteurs/kd-tree.png create mode 100644 vecteurs/kd-tree.svg diff --git a/vecteurs.classification.md b/vecteurs.classification.md new file mode 100644 index 0000000..b7e0b3f --- /dev/null +++ b/vecteurs.classification.md @@ -0,0 +1,73 @@ +# Classification et clustering + +Dans l’analyse de données, l’objectif est souvent de **catégoriser les individus** ou mieux encore de **découvrir des structures cachées**. + +Deux grandes approches existent : la **classification supervisée** et le **clustering non supervisé**. + +## Variables cibles et explicatives + +### Variable cible (ou variable dépendante, output, $Y$) + +C’est la variable que l’on cherche à prédire, expliquer ou classifier. + +Elle dépend des autres variables. + +Elle est connue dans l’apprentissage supervisé (ex. classification, régression). + +### Variable explicative (ou variable indépendante, feature, $X$) + +Ce sont les caractéristiques observées qui servent à expliquer ou prédire la variable cible. + +Elles sont indépendantes entre elles (en théorie) mais influencent la variable cible. + +## Classification supervisée + +La **classification** consiste à **attribuer une observation à une classe prédéfinie**. + +On dispose d’un ensemble de données d’apprentissage étiquetées (chaque observation appartient à une classe connue) et l’algorithme apprend une règle de décision. + +### Méthodologie + +1. **Constitution du jeu d’apprentissage** : données avec variables explicatives (âge, revenu, historique d’achat…) et une variable cible (classe : « fidèle », « risque »). +2. **Choix d’un algorithme de classification**. +3. **Apprentissage du modèle** : l’algorithme ajuste ses paramètres pour minimiser l’erreur de prédiction. +4. **Évaluation** : mesurer la précision sur de nouvelles données (validation croisée, matrice de confusion). +5. **Prédiction** : classer les nouvelles observations. + +### Algorithmes courants + +* **Arbres de décision (CART, C4.5, Random Forest)** : règles simples de type « si… alors… ». +* **k-Nearest Neighbors (k-NN)** : un individu est classé selon la majorité de ses plus proches voisins. +* **Naïve Bayes** : modèle probabiliste basé sur le théorème de Bayes. +* **Régression logistique** : adaptée aux classes binaires. +* **SVM (Support Vector Machines)** : séparateurs optimaux entre classes. +* **Réseaux de neurones** : pour des problèmes complexes et volumineux. + + +## Clustering (non supervisé) + +Le **clustering** (ou classification automatique) consiste à **regrouper des individus en classes (clusters) non connues à l’avance**, en fonction de leur similarité. + +Il n’y a pas de variable cible : l’algorithme cherche à découvrir des structures naturelles dans les données. + +### Méthodologie + +1. **Choisir une mesure de similarité** (distance euclidienne, Manhattan, cosinus…). +2. **Appliquer un algorithme de regroupement**. +3. **Évaluer la qualité des clusters** (compacité, séparation, indice de silhouette). +4. **Interpréter les groupes** : leur donner un sens métier (ex. « clients premium », « clients occasionnels »). + +L’indice de silhouette (Silhouette Coefficient) mesure à quel point un objet (une donnée) est bien placé dans son cluster par rapport aux autres clusters. + +Il évalue deux choses : + +Cohésion intra-cluster → à quel point l’objet est proche des autres membres de son cluster. + +Séparation inter-cluster → à quel point il est éloigné des membres des autres clusters. + +### Algorithmes courants + +* **k-Means** : partitionne en *k* clusters en minimisant la variance intra-classe. +* **Clustering hiérarchique** : construit un arbre (dendrogramme) de regroupement. +* **DBSCAN** : identifie des zones de densité et détecte les anomalies. +* **Gaussian Mixture Models (GMM)** : modèles probabilistes où chaque cluster suit une distribution normale. diff --git a/vecteurs.index.md b/vecteurs.index.md new file mode 100644 index 0000000..f4bcc51 --- /dev/null +++ b/vecteurs.index.md @@ -0,0 +1,60 @@ +# Indexation vectorielle + +## Structures exactes + +### Kd-Tree (k-dimensional tree) + +Un Kd-Tree est une structure d’arbre binaire qui permet d’organiser des points dans un espace de dimension k. + +- Chaque nœud de l’arbre représente un point (vecteur). +- À chaque niveau de l’arbre, on découpe l’espace selon une dimension spécifique. + +Ainsi, l’espace est récursivement partitionné en hyperplans (droites en 2D, plans en 3D, hyperplans en kD). + +- On choisit une dimension de séparation (ex. la dimension x). +- On prend le point médian selon cette dimension → il devient le nœud racine. +- Les points avec des coordonnées inférieures vont dans le sous-arbre gauche, les autres dans le sous-arbre droit. +- On recommence récursivement en changeant la dimension (ex. au niveau suivant on coupe selon y, puis z, ... puis de nouveau x). + +Chaque étape partitionne l’espace en rectangles de plus en plus petits. + +### Ball-Tree + +Au lieu de couper par des hyperplans, on coupe par des hypersphères → mieux adapté pour distances euclidiennes. + +Le Kd-Tree est une structure d’indexation exacte, très efficace pour la recherche de voisins proches en faible dimension. Mais il ne passe pas à l’échelle en haute dimension, ce qui a conduit au développement des méthodes approximatives. + +## Structures approximatives + +### Locality Sensitive Hashing (LSH) + +L’idée est de construire des fonctions de hachage probabilistes qui envoient : + +les vecteurs similaires → dans le même seau (bucket) avec forte probabilité, + +les vecteurs différents → dans des seaux distincts avec forte probabilité. + +Contrairement à un hachage classique (qui disperse les données), ici le hachage est conçu pour conserver la notion de proximité. + +### Inverted File (IVF) + +Appliquer k-means pour créer C clusters. + +Assigner chaque vecteur au centroïde le plus proche. + +Dans chaque cluster, stocker uniquement les résidus (différence vecteur – centroïde). + +Utiliser Product Quantization (PQ) pour encoder ces résidus en codes compacts (ex. 8 bits par sous-espace). + +### Hierarchical Navigable Small World (HNSW) + +Basé sur les graphes de proximité : chaque vecteur est un nœud relié à ses voisins proches. + +On construit un graphe navigable qui permet de trouver les plus proches voisins sans explorer toute la base. + +Inspiré des graphes "small-world" : on peut atteindre rapidement un point du graphe en peu de sauts. + + +> Le choix d'un index est un compromis +- Exact = lent mais précis. +- Approximatif = rapide mais avec une petite perte de précision. diff --git a/vecteurs.md b/vecteurs.md index 0661f2f..8a1c7a7 100644 --- a/vecteurs.md +++ b/vecteurs.md @@ -4,10 +4,10 @@ La solution la plus utilisée consiste à projeter ces données dans un **espace vectoriel** : chaque objet est représenté par un vecteur de nombres réels. -Cela permet d’utiliser les outils de l’algèbre linéaire, de la statistique et de l’informatique pour : +Cela permet d’utiliser les outils de l’algèbre linéaire et de la statistique pour : - rechercher des objets similaires, - regrouper ou classifier des individus, -- détecter des anomalies ou recommander des produits. +- identifier des anomalies, fraudes ou défauts de fabrication (vecteurs très éloignés). Aujourd’hui, ces méthodes sont utilisées partout : moteur de recherche, recommandation Netflix/Spotify, détection de fraude bancaire, IA générative (ChatGPT encode les phrases en vecteurs pour raisonner dessus). @@ -18,7 +18,7 @@ Aujourd’hui, ces méthodes sont utilisées partout : moteur de recherche, reco Un **vecteur** est une suite ordonnée de nombres réels : $$ -v = [x_1, x_2, \dots, x_n] \in \mathbb{R}^n +\vec{v} = [v_1, v_2, \dots, v_n] \in \mathbb{R}^n $$ Un **espace vectoriel** est un ensemble de vecteurs où s’appliquent deux opérations : @@ -39,7 +39,7 @@ Elle définit aussi une distance entre deux vecteurs, invariante par translation #### Norme $L_2$ (euclidienne) -Dans le plan, si le vecteur _u_ a pour coordonnées (x , y), sa norme s'écrit : +Dans le plan, si le vecteur $\vec{v}$ a pour coordonnées (x , y), sa norme s'écrit : $$ ||\vec{v}|| = \sqrt{x^2 + y^2} @@ -59,26 +59,143 @@ $$ ### Distances -À partir d’une norme, on définit une **distance** entre vecteurs $u$ et $v$. Exemple : +À partir d’une norme, on définit une **distance** entre vecteurs $\vec{u}$ et $\vec{v}$. -* Distance euclidienne : +La distance euclidienne : $$ -d(u,v) = ||u-v||_2 +d(\vec{u},\vec{v}) = ||\vec{u}-\vec{v}||_2 $$ ### Produit scalaire et similarité cosinus -Le **produit scalaire** est défini par : +Le **produit scalaire** (_inner product_ ou _dot product_ en anglais) est une opération qui prend deux vecteurs et donne un scalaire (nombre). $$ -u \cdot v = \sum_{i=1}^n u_i v_i +\vec{u} \cdot \vec{v} = \sum_{i=1}^n u_i v_i $$ +ou + +$$ +\vec{u} \cdot \vec{v} = ||\vec{u}|| \cdot ||\vec{v}|| \cdot cos(\theta) +$$ + +Le produit scalaire relie longueurs et angles. Il permet d'exploiter les notions de la géométrie euclidienne traditionnelle : longueurs, angles, orthogonalité en deux, trois ou plus de dimensions. + La **similarité cosinus** est donnée par : $$ -\cos(\theta) = \frac{u \cdot v}{||u|| \cdot ||v||} +\cos(\theta) = \frac{\vec{u} \cdot \vec{v}}{||\vec{u}|| \cdot ||\vec{v}||} $$ -Utilisé pour comparer deux vecteurs indépendamment de leur taille (ex. documents textuels). +Elle est utilisée pour comparer deux vecteurs indépendamment de leur taille (ex. documents textuels). + +Si = 0 soit θ = 90°, les vecteurs sont orthogonaux (perpendiculaires) Il n'y a aucune similarité. + +Si = 1 les vecteurs pointent exactement dans la même direction (très similaires). + +Si = -1 les vecteurs pointent dans des directions opposées (complètement dissemblables). + +## Statistique multivariée + +### Moyenne, variance et covariance + +Pour une variable $X$ : + +**Moyenne** : $\mu = \frac{1}{n}\sum x_i$ + +**Variance** : $\sigma^2 = \frac{1}{n}\sum (x_i - \mu)^2$ + +Pour deux variable $X$ et $Y$ + +**Covariance** : $\text{Cov}(X,Y) = E[(X-\mu_X)(Y-\mu_Y)]$ + +La covariance mesure comment deux variables X et Y varient ensemble. +$E$ est l'esperance (ou moyenne théorique). En statistique pratique, on remplace $E[X]$ par la moyenne empirique + +D'où de manière empirique + +$$ +\widehat{\mathrm{Cov}}(X,Y) = \frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y}) +$$ + +Si $X$ et $Y$ sont corrélés alors la covariance est positive. Si la covariance est nulle il n'y a pas de lien. Si la covariance est négative alors la probabilité est trés faible. + +**Corrélation** est la covariance normalisée sur une échelle de -1 à 1. + +$$ +\rho(X,Y) = \frac{\mathrm{Cov}(X,Y)}{\sigma_X \sigma_Y} +$$ + +Ces mesures servent à comprendre la dispersion et les corrélations. + + +### Normalisation des données + +Avant de comparer des vecteurs, il faut rendre les dimensions comparables en grandeur. + +**Min-Max scaling** : + +$$ +x' = \frac{x - \min}{\max - \min} +$$ + +**Standardisation (z-score)** : + +$$ +x' = \frac{x - \mu}{\sigma} +$$ + +### Réduction de dimension + +Lorsqu’une base de données contient de nombreuses variables (ou dimensions), il devient difficile d’analyser efficacement les données. On parle alors de malédiction de la dimensionnalité : plus il y a de dimensions, plus les calculs sont coûteux, et plus il est difficile de visualiser ou d’interpréter les résultats. + +La réduction des dimensions vise donc à simplifier l’espace de représentation en conservant l’information la plus pertinente. + +- Alléger les données : diminuer la taille et la complexité des tables. +- Améliorer les performances : réduire le temps de calcul dans les requêtes analytiques et les algorithmes. +- Faciliter la visualisation : rendre possible une représentation graphique (2D, 3D). +- Éliminer le bruit : supprimer les variables redondantes ou peu informatives. + +Il existe deux grandes familles d’approches + +**Sélection de variables** (feature selection) : On conserve uniquement les dimensions les plus pertinentes : + +- **Analyse de corrélation** : suppression d'une des variables fortement corrélées. +- **Méthodes statistiques** (tests d’hypothèses, chi², ANOVA) pour éliminer les variables peu discriminantes. +- **Méthodes incrémentales** : ajout ou retrait progressif de variables en fonction de critères de qualité (erreur de prédiction, pouvoir explicatif) + +**Extraction de nouvelles dimensions** (feature extraction) + +On crée de nouvelles variables synthétiques à partir des variables initiales : + +- **ACP (Analyse en Composantes Principales, PCA)** + - Transforme les données en un nouvel espace en combinant linéairement les variables. + - Les premières composantes expliquent la plus grande partie de la variance. + - Très utilisée en statistique et en apprentissage automatique. + +- **Analyse factorielle** : Identifie des facteurs latents expliquant les corrélations entre variables. +- **t-SNE, UMAP** (méthodes modernes) : Plus adaptées pour la visualisation et la détection de structures non linéaires dans des données complexes. + +## Théorie de la similarité + +### Problème des plus proches voisins + +Pour un vecteur $\vec{q}$, trouver les $k$ vecteurs les plus proches parmi une base de données. + +Méthode naïve : comparer $q$ avec tous les vecteurs un par un. + +Mais quand la dimension n augmente, les distances entre points tendent à se ressembler, + +- [Classification et clustering](vecteurs.classification) +- [Indexation vectorielle](vecteurs.index) + + +## Exercice + +1. Construire une base de produits avec vecteurs nutritionnels. +2. Normaliser les données par z-score. +3. Créer un index HNSW. +4. Classer un produit inconnu avec k-NN. +5. Détecter les produits extrêmes. diff --git a/vecteurs.readme.md b/vecteurs.readme.md index 4acd89a..ae00ff4 100644 --- a/vecteurs.readme.md +++ b/vecteurs.readme.md @@ -8,8 +8,6 @@ FAISS (Facebook), Milvus, Pinecone, Weaviate. - - 1. **** * Définitions (vecteur, dimension, norme). @@ -230,53 +228,23 @@ Aujourd’hui, ces méthodes sont utilisées partout : moteur de recherche, reco --- -## Chapitre 2 : Statistique multivariée +## Chapitre 2 : -### 2.1 Moyenne, variance, covariance +### 2.1 -Pour une variable $X$ : - -* Moyenne : $\mu = \frac{1}{n}\sum x_i$ -* Variance : $\sigma^2 = \frac{1}{n}\sum (x_i - \mu)^2$ -* Covariance entre $X$ et $Y$ : $\text{Cov}(X,Y) = E[(X-\mu_X)(Y-\mu_Y)]$ - -👉 Ces mesures servent à comprendre la dispersion et les corrélations. - ---- - -### 2.2 Normalisation des données - -Avant de comparer des vecteurs, il faut rendre les dimensions comparables : - -* **Min-Max scaling** : - - $$ - x' = \frac{x - \min}{\max - \min} - $$ -* **Standardisation (z-score)** : - - $$ - x' = \frac{x - \mu}{\sigma} - $$ 👉 Le z-score est très utilisé pour détecter les valeurs extrêmes. --- -### 2.3 Réduction de dimension + * **ACP (PCA)** : projette les données sur des axes qui maximisent la variance. * **T-SNE, UMAP** : techniques non linéaires pour visualiser des vecteurs en 2D ou 3D. --- -## Chapitre 3 : Théorie de la similarité -### 3.1 Problème des plus proches voisins - -Donné un vecteur $q$, trouver les $k$ vecteurs les plus proches parmi une base de données. - -* Méthode naïve : comparer $q$ avec tous les vecteurs ($O(N)$). --- @@ -297,55 +265,6 @@ Quand la dimension $n$ augmente : * Cosinus → données textuelles ou normalisées. * Jaccard/Hamming → données catégorielles. ---- - -## Chapitre 4 : Classification et clustering - -### 4.1 Classification supervisée - -* **k-NN** : attribue la classe majoritaire parmi les $k$ plus proches voisins. -* Analyse discriminante. - ---- - -### 4.2 Clustering (non supervisé) - -* **k-means** : partitionne les données en $k$ groupes. -* **Clustering hiérarchique**. -* **DBSCAN** : détecte des regroupements denses. - ---- - -### 4.3 Évaluation - -* Taux d’erreur, précision, rappel. -* Indice de silhouette. - ---- - -## Chapitre 5 : Indexation vectorielle - -### 5.1 Structures exactes - -* **kd-tree**, **ball-tree** : efficaces en basse dimension (< 30). - ---- - -### 5.2 Structures approximatives - -* **LSH (Locality Sensitive Hashing)**. -* **IVF (Inverted File)**. -* **HNSW (Hierarchical Navigable Small World)** : - - * Graphe de proximité hiérarchique. - * Recherche rapide et précise. - ---- - -### 5.3 Compromis - -* Exact = lent mais précis. -* Approximatif = rapide mais avec une petite perte de précision. --- @@ -427,11 +346,7 @@ Grâce à des outils comme PostgreSQL + pgvector, on peut manipuler ces techniqu ## Exercices finaux -1. Construire une base de produits avec vecteurs nutritionnels. -2. Normaliser les données par z-score. -3. Créer un index HNSW. -4. Classer un produit inconnu avec k-NN. -5. Détecter les produits extrêmes. + --- @@ -445,3 +360,159 @@ Grâce à des outils comme PostgreSQL + pgvector, on peut manipuler ces techniqu --- Voulez-vous que je complète ce cours avec **schémas explicatifs et illustrations** (par exemple représentation d’un espace vectoriel, graphe HNSW, courbe du z-score), pour en faire un véritable poly visuel ? + + +Très bonne question 👍, car la **covariance** est une des notions centrales de la statistique et elle fait intervenir l’opérateur $E$, qui est l’**espérance mathématique**. + +--- + +# 📘 La covariance et l’espérance + +## 1. L’espérance $E[X]$ + +L’**espérance** (ou **moyenne théorique**) d’une variable aléatoire $X$ est une mesure de sa valeur moyenne à long terme. + +* **Variable discrète** : + +$$ +E[X] = \sum_i x_i \, P(X = x_i) +$$ + +* **Variable continue** : + +$$ +E[X] = \int_{-\infty}^{+\infty} x \, f(x)\, dx +$$ + +où $f(x)$ est la densité de probabilité. + +👉 Intuitivement, $E[X]$ = **moyenne pondérée** par les probabilités. +👉 En statistique pratique, on remplace $E[X]$ par la **moyenne empirique** : + +$$ +\bar{x} = \frac{1}{n} \sum_{i=1}^n x_i +$$ + +--- + +## 2. Définition de la covariance + +La **covariance** mesure comment deux variables $X$ et $Y$ **varient ensemble**. + +$$ +\mathrm{Cov}(X,Y) = E\big[(X - E[X])(Y - E[Y])\big] +$$ + +Autrement dit : + +* Si $X$ est grand quand $Y$ est grand → covariance **positive**. +* Si $X$ est grand quand $Y$ est petit → covariance **négative**. +* Si aucun lien → covariance proche de **0**. + +--- + +## 3. Formule pratique + +On peut développer la définition : + +$$ +\mathrm{Cov}(X,Y) = E[XY] - E[X]E[Y] +$$ + +En version empirique (données observées $(x_i,y_i)$) : + + + +--- + +## 4. Exemple simple + +Données : +$X = (1, 2, 3)$, $Y = (2, 4, 6)$. + +* Moyennes : $\bar{x} = 2$, $\bar{y} = 4$. +* Produits centrés : + $(1-2)(2-4) = (+2)$, + $(2-2)(4-4) = (0)$, + $(3-2)(6-4) = (+2)$. +* Moyenne : $(2 + 0 + 2)/3 = 1.33$. + +👉 Covariance positive : $X$ et $Y$ croissent ensemble. + +--- + +## 5. Interprétation + +* **Unité** : la covariance s’exprime dans les unités combinées de $X$ et $Y$ (ex. kg·cm). +* **Problème** : sa valeur dépend des échelles de mesure → difficile à comparer. +* **Solution** : on utilise la **corrélation** (covariance normalisée) : + +$$ +\rho(X,Y) = \frac{\mathrm{Cov}(X,Y)}{\sigma_X \sigma_Y} +$$ + +où $\sigma_X, \sigma_Y$ sont les écarts-types. + +--- + +## 6. Application à vos vecteurs nutritionnels + +Si $X =$ teneur en sucre et $Y =$ teneur en énergie (kcal) sur une base de produits : + +* $\mathrm{Cov}(X,Y) > 0$ : les produits sucrés apportent plus d’énergie (logique). +* $\mathrm{Cov}(X,Y) \approx 0$ : pas de lien. +* $\mathrm{Cov}(X,Y) < 0$ : plus de sucre = moins d’énergie (peu probable). + +--- + +📌 **Résumé** + +* $E[\cdot]$ = espérance = moyenne théorique. +* $\mathrm{Cov}(X,Y)$ mesure la tendance de deux variables à varier ensemble. +* Corrélation = covariance **normalisée** pour comparer entre variables. + +--- + +Voulez-vous que je montre un **exemple SQL avec PostgreSQL** pour calculer la covariance (et corrélation) entre sucre et énergie dans votre table `produits` ? + + +Parfait 👍 Développons maintenant la partie **classification et clustering**, qui est un volet essentiel de l’analyse multidimensionnelle. + +--- + + +### Applications + +* Segmentation client sans étiquette. +* Analyse de comportements sur un site web. +* Regroupement de documents ou d’images. +* Détection d’anomalies (points isolés). + +--- + +## 3. Comparaison Classification vs Clustering + +| Critère | Classification (supervisée) | Clustering (non supervisée) | +| ----------------------- | --------------------------- | ----------------------------- | +| Données d’apprentissage | Avec classes connues | Sans classes connues | +| Objectif | Prédire une classe | Découvrir des regroupements | +| Exemple | Spam / Non Spam | Segmenter des clients | +| Méthodes | SVM, arbres, k-NN, Bayes | k-Means, DBSCAN, hiérarchique | + +--- + +## 4. Liens avec l’analyse multidimensionnelle + +* **En Data Warehouse** : on peut utiliser la classification pour prédire une variable clé (ex. prédire si une campagne marketing réussira). +* **Dans un cube OLAP** : le clustering peut permettre de **réduire les dimensions** en regroupant des modalités similaires (ex. fusionner des catégories de produits qui se vendent de manière identique). + +--- + +✅ En résumé : + +* La **classification** s’appuie sur des classes connues et cherche à **prédire**. +* Le **clustering** ne connaît pas les classes à l’avance et cherche à **découvrir** des structures cachées. + +--- + +Voulez-vous que je développe un **exemple pratique illustré** (par ex. segmentation de clients avec un tableau de variables, appliquant à la fois classification supervisée et clustering) pour rendre cette partie plus concrète ? diff --git a/vecteurs/kd-tree.png b/vecteurs/kd-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cd1fdc849ff9aea9753a00a703a5138862906a GIT binary patch literal 19839 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 + + + + + + + + + + + + + + Plan 2D — Zones partitionnées + + + + + + + + Level 0 (x) + + + + Level 1 (y) + + + + + + Level 2 (x) + + + + + + + + + + + 1 + + + 4 + + + 7 + + + + + + 2 + + + 5 + + + + + + 3 + + + 6 + + + 8 + + + + + + Kd-Tree (structure) + + + + + + Root (split x) + + + + + + L (split y) + + + + + + R (split y) + + + + + + + + + LL (split x) + + + LR (split y) + + + RR (split x) + + + + + + + Légende : + • Couleur rouge = coupe selon x (verticale). • Couleur bleue = coupe selon y (horizontale). + + +