Vecteurs

2025-09-15 13:32:42 +02:00
parent 29a81d6e82
commit ef6d61504a
4 changed files with 1191 additions and 9 deletions

21
tp1.md

@@ -1,8 +1,14 @@
# Travaux pratiques 1
# Travaux pratiques de Cartographie
## Cartographie
1. Créer une table zone
1. Avec le logiciel QGIS
Ajouter les couches
- AJouter une couche xyz avec OpenStreetMap
- Zommer sur l'ile de Batz (En Bretagne, au nord de Morlaix)
2. Créer une table zone
```sql
create table zone (
@@ -13,11 +19,8 @@ create table zone (
);
```
Avec QGIS
2. Ajouter une zone
### Ajouter les couches
- AJouter une couche xyz avec OpenStreetMap
- Zommer sur l'ile de Batz (En Bretagne, au nord de Morlaix)
- Ajouter une couche postgreSQL sur la table zone
- Changer le style de remplissage pour avoir une semi transparence (opacité)
- Entrer en édition sur la couche avec l'icone crayon
@@ -28,7 +31,7 @@ Avec QGIS
- Enregistrer
- Avec DBeaver vérifier l'existence de l'entité et modifier son nom et sa catégorie
- Calculer l'aire du terrain et son périmètre
- Transformer
- Transformer la projection pour avoir le résultat en mètres
### Le marais Poullou
- Dessiner le marais Poullou Attention celui ci est en deux partie
@@ -49,7 +52,7 @@ Avec QGIS
### POI (Point of Interest)
- Ajouter une nouvelle table pour les points
- Ajouter un point depuis QGIS : menhir de Kreach ar Bolloch (A) un autre sur le menhir de Porz ar Roc'h
- Calculer la distance entre les 2 menhir
- Calculer la distance entre les 2 menhirs
- Importer le fichier point.csv

84
vecteurs.md Normal file

@@ -0,0 +1,84 @@
# Analyse de données vectorielles et recherche de similarité
> La multiplication des données numériques (textes, images, vidéos, données issues de capteurs ou dapplications métiers) pose un défi majeur : comment représenter ces données pour les comparer et les analyser efficacement ?
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 dutiliser les outils de lalgèbre linéaire, de la statistique et de linformatique pour :
- rechercher des objets similaires,
- regrouper ou classifier des individus,
- détecter des anomalies ou recommander des produits.
Aujourdhui, 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).
## Fondements mathématiques
### Vecteurs et espaces vectoriels
Un **vecteur** est une suite ordonnée de nombres réels :
$$
v = [x_1, x_2, \dots, x_n] \in \mathbb{R}^n
$$
Un **espace vectoriel** est un ensemble de vecteurs où sappliquent deux opérations :
* addition de vecteurs,
* multiplication par un scalaire.
Exemple :
* Un produit alimentaire décrit par (protéines, sucres, graisses, sel, fibres) est un vecteur à 5 dimensions.
* Une image de 28×28 pixels peut être représentée par un vecteur de dimension 784.
### Normes
En géométrie, la **norme** est une extension de la valeur absolue des nombres aux vecteurs. Elle permet de mesurer la longueur commune à toutes les représentations d'un vecteur dans un espace affine.
Elle définit aussi une distance entre deux vecteurs, invariante par translation et compatible avec la multiplication externe.
#### Norme $L_2$ (euclidienne)
Dans le plan, si le vecteur _u_ a pour coordonnées (x , y), sa norme s'écrit :
$$
||\vec{v}|| = \sqrt{x^2 + y^2}
$$
par extension à n dimensions
$$
||\vec{v}||_2 = \sqrt{\sum_{i=1}^n v_i^2}
$$
#### Norme $L_1$ (Manhattan)
$$
||\vec{v}||_1 = \sum_{i=1}^n |v_i|
$$
### Distances
À partir dune norme, on définit une **distance** entre vecteurs $u$ et $v$. Exemple :
* Distance euclidienne :
$$
d(u,v) = ||u-v||_2
$$
### Produit scalaire et similarité cosinus
Le **produit scalaire** est défini par :
$$
u \cdot v = \sum_{i=1}^n u_i v_i
$$
La **similarité cosinus** est donnée par :
$$
\cos(\theta) = \frac{u \cdot v}{||u|| \cdot ||v||}
$$
Utilisé pour comparer deux vecteurs indépendamment de leur taille (ex. documents textuels).

447
vecteurs.readme.md Normal file

@@ -0,0 +1,447 @@
## **Introduction générale**
* Contexte : explosion des données multidimensionnelles (texte, images, sons, données produits).
* Besoin : représenter ces objets dans un **espace vectoriel** pour les comparer, les regrouper, les classer.
* Outils modernes : PostgreSQL + `pgvector`,
FAISS (Facebook), Milvus, Pinecone, Weaviate.
1. ****
* Définitions (vecteur, dimension, norme).
* Produit scalaire, orthogonalité.
* Notions de norme $L_1, L_2, L_\infty$.
2. **Espaces métriques**
* Distance euclidienne.
* Similarité cosinus.
* Inégalités triangulaires et propriétés.
3. **Algèbre linéaire appliquée**
* Matrices, transformations, réduction de dimension.
* Application : analyse en composantes principales (ACP).
---
## **Chapitre 2 : Statistique multivariée**
1. **Descriptif**
* Moyenne, variance, covariance.
* Corrélations entre variables.
2. **Normalisation**
* Min-Max scaling.
* Standardisation (z-score).
* Normalisation par norme (unit vector).
3. **Réduction de dimension**
* ACP (PCA).
* T-SNE et UMAP (visualisation en 2D des données vectorielles).
---
## Théorie de la similarité
### Problème des plus proches voisins (k-NN)
* Définition.
* Algorithme naïf et complexité $O(N)$.
2. **Malédiction de la dimensionnalité**
* Définition.
* Impact sur les distances (concentration des mesures).
3. **Mesures adaptées aux données**
* Distances pour variables continues.
* Distances pour variables catégorielles (Hamming, Jaccard).
* Cas des vecteurs creux (sparse vectors).
---
## **Chapitre 4 : Classification et clustering**
1. **Classification supervisée**
* k-NN classique.
* Analyse discriminante linéaire.
2. **Clustering (non supervisé)**
* k-means.
* Hiérarchique.
* DBSCAN.
3. **Évaluation**
* Erreur de classification.
* Indice de silhouette.
* Entropie et pureté.
---
## **Chapitre 5 : Indexation pour la recherche vectorielle**
1. **Structures exactes**
* kd-tree, ball tree.
* Avantages / limites.
2. **Index approximatifs**
* LSH (Locality Sensitive Hashing).
* Graphes de proximité (HNSW).
* IVF (Inverted File).
3. **HNSW en détail**
* Construction hiérarchique.
* Navigation dans le graphe.
* Performances (précision vs vitesse).
---
## **Chapitre 6 : Applications modernes**
1. **Recommandation de produits**
* Profils nutritionnels (ex. yaourt vs confiture).
* Recommandation basée sur similarité.
2. **Recherche dimages et de documents**
* Embeddings textuels (Word2Vec, BERT).
* Embeddings visuels (ResNet, CLIP).
3. **Détection danomalies**
* Valeurs extrêmes (outliers).
* Détection de fraude.
---
## **Chapitre 7 : Implémentation avec PostgreSQL et pgvector**
1. **Création dun type vecteur**
* `vector(n)`.
* Conversion des données tabulaires en vecteurs.
2. **Normalisation dans SQL**
* Moyenne et écart-type avec `AVG` et `STDDEV`.
* Transformation en z-score.
3. **Indexation**
* `ivfflat` (batch, nécessite `ANALYZE`).
* `hnsw` (recherche dynamique).
4. **Requêtes**
* Recherche de similarité : `ORDER BY v1 <-> v2`.
* Classification par vote majoritaire (k-NN).
---
## **Chapitre 8 : Perspectives et limites**
1. **Curse of dimensionality** et solutions (réduction dimensionnelle, embeddings spécialisés).
2. **Précision vs performance** (exact vs approximatif).
3. **Perspectives** :
* Recherche multimodale (texte + image).
* Bases vectorielles distribuées.
* Applications IA générative.
---
## **Conclusion**
* Les vecteurs permettent dunifier des données hétérogènes.
* Les mesures de distance et la normalisation sont au cœur de lanalyse.
* Lindexation vectorielle (HNSW, IVF) rend possible des recherches rapides sur des millions dobjets.
* PostgreSQL, via `pgvector`, permet de relier ce monde au SQL traditionnel.
---
## **Exercices finaux**
1. Créer une base `produits` avec profils nutritionnels.
2. Normaliser les données par z-score.
3. Construire un vecteur par produit.
4. Créer un index HNSW.
5. Classer un nouveau produit (k-NN).
6. Détecter les produits atypiques (outliers).
---
📚 **Références utiles** :
* Hastie, Tibshirani, Friedman, *The Elements of Statistical Learning*.
* Bishop, *Pattern Recognition and Machine Learning*.
* Les notes de cours "Similarity Search" de Piotr Indyk (MIT).
* Documentation officielle de `pgvector` : [https://github.com/pgvector/pgvector](https://github.com/pgvector/pgvector).
---
👉 Souhaitez-vous que je développe ce plan en **poly de cours complet (texte rédigé, exemples détaillés, schémas)**, ou préférez-vous garder cette structure comme **plan directeur** pour construire vous-même le contenu ?
Parfait 👍 Je vais transformer le plan en un **cours rédigé complet**, structuré en chapitres, comme un polycopié universitaire.
On garde un style pédagogique, progressif, avec définitions, théories, exemples et applications.
---
# 📘 Cours complet : Analyse de données vectorielles et recherche de similarité
---
## Introduction générale
La multiplication des données numériques (textes, images, vidéos, données issues de capteurs ou dapplications métiers) pose un défi majeur : **comment représenter ces données pour les comparer et les analyser efficacement ?**
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 dutiliser les outils de lalgèbre linéaire, de la statistique et de linformatique pour :
* rechercher des objets similaires,
* regrouper ou classifier des individus,
* détecter des anomalies ou recommander des produits.
Aujourdhui, 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).
---
## Chapitre 1 : Fondements mathématiques
### 1.3
---
## Chapitre 2 : Statistique multivariée
### 2.1 Moyenne, variance, covariance
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)$).
---
### 3.2 Malédiction de la dimensionnalité
Quand la dimension $n$ augmente :
* les distances entre points tendent à se ressembler,
* les méthodes classiques deviennent inefficaces.
👉 Nécessite des méthodes adaptées (réduction dimensionnelle, index spécialisés).
---
### 3.3 Mesures adaptées
* Euclidienne → données continues.
* 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 derreur, 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.
---
## Chapitre 6 : Applications
### 6.1 Recommandation
Comparer les profils nutritionnels pour recommander des produits proches.
### 6.2 Recherche multimédia
Comparer les vecteurs dimages ou de sons.
### 6.3 Détection danomalies
Identifier des vecteurs très éloignés (fraude, défaut de fabrication).
---
## Chapitre 7 : Implémentation en PostgreSQL avec `pgvector`
### 7.1 Définir les vecteurs
```sql
ALTER TABLE produits ADD COLUMN nutrition_vector vector(5);
```
### 7.2 Normaliser
```sql
WITH stats AS (
SELECT AVG(proteines) AS mu, STDDEV(proteines) AS sigma FROM produits
)
UPDATE produits p
SET nutrition_vector = ARRAY[
(proteines - mu)/sigma,
(sucre - mu_sucre)/sigma_sucre,
(graisse - mu_graisse)/sigma_graisse,
(sel - mu_sel)/sigma_sel,
(fibres - mu_fibres)/sigma_fibres
]::vector
FROM stats;
```
### 7.3 Indexer avec HNSW
```sql
CREATE INDEX produits_hnsw
ON produits
USING hnsw (nutrition_vector vector_l2_ops);
```
### 7.4 Requêtes k-NN
```sql
SELECT p2.id, p2.nom
FROM produits p1, produits p2
WHERE p1.id = 42
ORDER BY p1.nutrition_vector <-> p2.nutrition_vector
LIMIT 5;
```
---
## Chapitre 8 : Perspectives
* Recherche multimodale (texte + image).
* Embeddings appris (Word2Vec, BERT, CLIP).
* Bases vectorielles distribuées (Milvus, Pinecone).
---
## Conclusion
Lanalyse vectorielle relie **mathématiques, statistiques et informatique**.
Grâce à des outils comme PostgreSQL + pgvector, on peut manipuler ces techniques directement dans une base relationnelle, ce qui ouvre la voie à des applications concrètes : recommandation, recherche par similarité, détection danomalies.
---
## 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.
---
📚 **Bibliographie conseillée** :
* Hastie, Tibshirani, Friedman *The Elements of Statistical Learning*.
* Bishop *Pattern Recognition and Machine Learning*.
* Indyk, Motwani *Approximate Nearest Neighbor: Towards Removing the Curse of Dimensionality*.
* Documentation [pgvector](https://github.com/pgvector/pgvector).
---
Voulez-vous que je complète ce cours avec **schémas explicatifs et illustrations** (par exemple représentation dun espace vectoriel, graphe HNSW, courbe du z-score), pour en faire un véritable poly visuel ?

648
vecteurs/distance.svg Normal file

@@ -0,0 +1,648 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
x="0.0000000"
y="0.0000000"
width="283.46457"
height="283.46457"
id="svg1629">
<defs
id="defs1631" />
<g
id="layer1">
<g
transform="matrix(8.160948e-2,0.000000,0.000000,8.160948e-2,-12.30490,-12.32124)"
style="fill:none;stroke:#000000;stroke-width:0.025000000in"
id="g4">
<defs
id="defs6">
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile1">
<path
id="path9"
d="M 0 -100 200 16" />
<path
id="path11"
d="M 0 -60 200 56" />
<path
id="path13"
d="M 0 -20 200 96" />
<path
id="path15"
d="M 0 20 200 136" />
<path
id="path17"
d="M 0 60 200 176" />
<path
id="path19"
d="M 0 100 200 216" />
<path
id="path21"
d="M 0 140 200 256" />
<path
id="path23"
d="M 0 180 200 296" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile2">
<path
id="path26"
d="M 200 -100 0 16" />
<path
id="path28"
d="M 200 -60 0 56" />
<path
id="path30"
d="M 200 -20 0 96" />
<path
id="path32"
d="M 200 20 0 136" />
<path
id="path34"
d="M 200 60 0 176" />
<path
id="path36"
d="M 200 100 0 216" />
<path
id="path38"
d="M 200 140 0 256" />
<path
id="path40"
d="M 200 180 0 296" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile3">
<path
id="path43"
d="M 0 -100 200 16" />
<path
id="path45"
d="M 200 -100 0 16" />
<path
id="path47"
d="M 0 -60 200 56" />
<path
id="path49"
d="M 200 -60 0 56" />
<path
id="path51"
d="M 0 -20 200 96" />
<path
id="path53"
d="M 200 -20 0 96" />
<path
id="path55"
d="M 0 20 200 136" />
<path
id="path57"
d="M 200 20 0 136" />
<path
id="path59"
d="M 0 60 200 176" />
<path
id="path61"
d="M 200 60 0 176" />
<path
id="path63"
d="M 0 100 200 216" />
<path
id="path65"
d="M 200 100 0 216" />
<path
id="path67"
d="M 0 140 200 256" />
<path
id="path69"
d="M 200 140 0 256" />
<path
id="path71"
d="M 0 180 200 296" />
<path
id="path73"
d="M 200 180 0 296" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile4">
<path
id="path76"
d="M 100 0 200 100" />
<path
id="path78"
d="M 0 0 200 200" />
<path
id="path80"
d="M 0 100 100 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile5">
<path
id="path83"
d="M 100 0 0 100" />
<path
id="path85"
d="M 200 0 0 200" />
<path
id="path87"
d="M 200 100 100 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile6">
<path
id="path90"
d="M 100 0 200 100" />
<path
id="path92"
d="M 0 0 200 200" />
<path
id="path94"
d="M 0 100 100 200" />
<path
id="path96"
d="M 100 0 0 100" />
<path
id="path98"
d="M 200 0 0 200" />
<path
id="path100"
d="M 200 100 100 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile7">
<path
id="path103"
d="M 0 0 0 50" />
<path
id="path105"
d="M 0 50 200 50" />
<path
id="path107"
d="M 100 50 100 150" />
<path
id="path109"
d="M 0 150 200 150" />
<path
id="path111"
d="M 0 150 0 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile8">
<path
id="path114"
d="M 0 0 50 0" />
<path
id="path116"
d="M 50 0 50 200" />
<path
id="path118"
d="M 50 100 150 100" />
<path
id="path120"
d="M 150 0 150 200" />
<path
id="path122"
d="M 150 0 200 0" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile9">
<path
id="path125"
d="M 0 50 200 50" />
<path
id="path127"
d="M 0 150 200 150" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile10">
<path
id="path130"
d="M 50 0 50 200" />
<path
id="path132"
d="M 150 0 150 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile11">
<path
id="path135"
d="M 0 50 200 50" />
<path
id="path137"
d="M 0 150 200 150" />
<path
id="path139"
d="M 50 0 50 200" />
<path
id="path141"
d="M 150 0 150 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile12">
<path
id="path144"
d="M 0 0 25 50" />
<path
id="path146"
d="M 0 50 200 50" />
<path
id="path148"
d="M 100 50 125 150" />
<path
id="path150"
d="M 0 150 200 150" />
<path
id="path152"
d="M 0 150 25 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile13">
<path
id="path155"
d="M 200 0 175 50" />
<path
id="path157"
d="M 0 50 200 50" />
<path
id="path159"
d="M 100 50 75 150" />
<path
id="path161"
d="M 0 150 200 150" />
<path
id="path163"
d="M 200 150 175 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile14">
<path
id="path166"
d="M 0 0 50 25" />
<path
id="path168"
d="M 50 0 50 200" />
<path
id="path170"
d="M 50 100 150 125" />
<path
id="path172"
d="M 150 0 150 200" />
<path
id="path174"
d="M 150 0 200 25" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile15">
<path
id="path177"
d="M 0 25 50 0" />
<path
id="path179"
d="M 50 0 50 200" />
<path
id="path181"
d="M 50 125 150 100" />
<path
id="path183"
d="M 150 0 150 200" />
<path
id="path185"
d="M 150 25 200 0" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile16">
<path
id="path188"
d="M 0 50 A 50 50 0 1 0 100 50" />
<path
id="path190"
d="M 100 50 A 50 50 0 1 0 200 50" />
<path
id="path192"
d="M 50 100 A 50 50 0 1 0 150 100" />
<path
id="path194"
d="M 0 150 A 50 50 0 0 0 50 100" />
<path
id="path196"
d="M 150 100 A 50 50 0 1 0 200 50" />
<path
id="path198"
d="M 50 0 A 50 50 0 1 0 150 0" />
<path
id="path200"
d="M 150 0 A 50 50 0 0 0 200 50" />
<path
id="path202"
d="M 0 50 A 50 50 0 0 0 50 0" />
<path
id="path204"
d="M 0 150 A 50 50 0 1 0 100 150" />
<path
id="path206"
d="M 100 150 A 50 50 0 1 0 200 150" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="100"
width="100"
y="0"
x="0"
id="tile17">
<g
id="g209"
transform="scale(0.5)">
<path
id="path211"
d="M 0 50 A 50 50 0 1 0 100 50" />
<path
id="path213"
d="M 100 50 A 50 50 0 1 0 200 50" />
<path
id="path215"
d="M 50 100 A 50 50 0 1 0 150 100" />
<path
id="path217"
d="M 0 150 A 50 50 0 0 0 50 100" />
<path
id="path219"
d="M 150 100 A 50 50 0 1 0 200 50" />
<path
id="path221"
d="M 50 0 A 50 50 0 1 0 150 0" />
<path
id="path223"
d="M 150 0 A 50 50 0 0 0 200 50" />
<path
id="path225"
d="M 0 50 A 50 50 0 0 0 50 0" />
<path
id="path227"
d="M 0 150 A 50 50 0 1 0 100 150" />
<path
id="path229"
d="M 100 150 A 50 50 0 1 0 200 150" />
</g>
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile18">
<circle
id="circle232"
r="100"
cy="100"
cx="100" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile19">
<path
id="path235"
d="M 0 50 45 0 105 0 140 50 200 50 " />
<path
id="path237"
d="M 0 50 45 100 105 100 140 50 200 50" />
<path
id="path239"
d="M 0 150 45 100 105 100 140 150 200 150" />
<path
id="path241"
d="M 0 150 45 200 105 200 140 150 200 150" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile20">
<path
id="path244"
d="M 0 70 65 0 140 0 200 70 " />
<path
id="path246"
d="M 0 70 0 130 65 200 140 200 200 130 200 70" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile21">
<path
id="path249"
d="M 50 0 75 25 100 0 M 150 0 175 25 200 0" />
<path
id="path251"
d="M 0 50 25 25 75 75 125 25 175 75 200 50" />
<path
id="path253"
d="M 0 100 25 75 75 125 125 75 175 125 200 100" />
<path
id="path255"
d="M 0 150 25 125 75 175 125 125 175 175 200 150" />
<path
id="path257"
d="M 0 200 25 175 75 225 125 175 175 225 200 200" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
height="200"
width="200"
y="0"
x="0"
id="tile22">
<path
id="path260"
d="M 0 50 25 75 0 100 M 0 150 25 175 0 200" />
<path
id="path262"
d="M 50 0 25 25 75 75 25 125 75 175 50 200" />
<path
id="path264"
d="M 100 0 75 25 125 75 75 125 125 175 100 200" />
<path
id="path266"
d="M 150 0 125 25 175 75 125 125 175 175 150 200" />
<path
id="path268"
d="M 200 0 175 25 225 75 175 125 225 175 200 200" />
</pattern>
</defs>
<path
d="M 472.00000,3543.0000 L 472.00000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path270" />
<path
d="M 944.00000,3543.0000 L 944.00000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path272" />
<path
d="M 1417.0000,3543.0000 L 1417.0000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path274" />
<path
d="M 1889.0000,3543.0000 L 1889.0000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path276" />
<path
d="M 2834.0000,3543.0000 L 2834.0000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path278" />
<path
d="M 3307.0000,3543.0000 L 3307.0000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path280" />
<path
d="M 2362.0000,3543.0000 L 2362.0000,236.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path282" />
<path
d="M 236.00000,472.00000 L 3543.0000,472.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path284" />
<path
d="M 236.00000,944.00000 L 3543.0000,944.00000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path286" />
<path
d="M 236.00000,1417.0000 L 3543.0000,1417.0000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path288" />
<path
d="M 236.00000,1889.0000 L 3543.0000,1889.0000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path290" />
<path
d="M 236.00000,2362.0000 L 3543.0000,2362.0000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path292" />
<path
d="M 236.00000,2834.0000 L 3543.0000,2834.0000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path294" />
<path
d="M 236.00000,3307.0000 L 3543.0000,3307.0000"
style="fill:#000000;stroke:#b2b2b2;stroke-width:158.00000"
id="path296" />
<circle
cx="3307.0000"
cy="472.00000"
r="94.000000"
style="fill:#000000;stroke:#000000;stroke-width:16.000000"
id="circle298" />
<circle
cx="472.00000"
cy="3307.0000"
r="94.000000"
style="fill:#000000;stroke:#000000;stroke-width:16.000000"
id="circle300" />
<path
d="M 448.00000,3307.0000 L 448.00000,448.00000 L 3307.0000,448.00000"
style="stroke:#ff0000;stroke-width:32.000000"
id="path302" />
<path
d="M 472.00000,3307.0000 L 472.00000,2834.0000 L 944.00000,2834.0000 L 944.00000,2362.0000 L 1417.0000,2362.0000 L 1417.0000,1889.0000 L 1889.0000,1889.0000 L 1889.0000,1417.0000 L 2362.0000,1417.0000 L 2362.0000,944.00000 L 2834.0000,944.00000 L 2834.0000,472.00000 L 3307.0000,472.00000"
style="stroke:#0000ff;stroke-width:32.000000"
id="path304" />
<path
d="M 472.00000,3307.0000 L 2834.0000,3307.0000 L 2834.0000,2362.0000 L 3307.0000,2362.0000 L 3307.0000,472.00000"
style="stroke:#ffd600;stroke-width:32.000000"
id="path306" />
<path
d="M 519.00000,3307.0000 L 3307.0000,519.00000"
style="stroke:#00d100;stroke-width:32.000000"
id="path308" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB