Vecteurs
21
tp1.md
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
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 d’applications 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 d’utiliser les outils de l’algèbre linéaire, de la statistique et de l’informatique pour :
|
||||
- rechercher des objets similaires,
|
||||
- regrouper ou classifier des individus,
|
||||
- détecter des anomalies ou recommander des produits.
|
||||
|
||||
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).
|
||||
|
||||
## 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ù s’appliquent 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 d’une 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
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 d’images et de documents**
|
||||
|
||||
* Embeddings textuels (Word2Vec, BERT).
|
||||
* Embeddings visuels (ResNet, CLIP).
|
||||
|
||||
3. **Détection d’anomalies**
|
||||
|
||||
* Valeurs extrêmes (outliers).
|
||||
* Détection de fraude.
|
||||
|
||||
---
|
||||
|
||||
## **Chapitre 7 : Implémentation avec PostgreSQL et pgvector**
|
||||
|
||||
1. **Création d’un 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 d’unifier des données hétérogènes.
|
||||
* Les mesures de distance et la normalisation sont au cœur de l’analyse.
|
||||
* L’indexation vectorielle (HNSW, IVF) rend possible des recherches rapides sur des millions d’objets.
|
||||
* 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 d’applications 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 d’utiliser les outils de l’algèbre linéaire, de la statistique et de l’informatique pour :
|
||||
|
||||
* rechercher des objets similaires,
|
||||
* regrouper ou classifier des individus,
|
||||
* détecter des anomalies ou recommander des produits.
|
||||
|
||||
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).
|
||||
|
||||
---
|
||||
|
||||
## 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 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.
|
||||
|
||||
---
|
||||
|
||||
## Chapitre 6 : Applications
|
||||
|
||||
### 6.1 Recommandation
|
||||
|
||||
Comparer les profils nutritionnels pour recommander des produits proches.
|
||||
|
||||
### 6.2 Recherche multimédia
|
||||
|
||||
Comparer les vecteurs d’images ou de sons.
|
||||
|
||||
### 6.3 Détection d’anomalies
|
||||
|
||||
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
|
||||
|
||||
L’analyse 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 d’anomalies.
|
||||
|
||||
---
|
||||
|
||||
## 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 d’un espace vectoriel, graphe HNSW, courbe du z-score), pour en faire un véritable poly visuel ?
|
||||
648
vecteurs/distance.svg
Normal file
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 |
Reference in New Issue
Block a user