ean13
This commit is contained in:
55
pgvector/classification.md
Normal file
55
pgvector/classification.md
Normal file
@@ -0,0 +1,55 @@
|
||||
Parfait 👍 Alors, puisque vous avez vos vecteurs nutritionnels dans une colonne nutrition vector (normalisés avec un Z-score), vous pouvez utiliser l’extension pgvector pour faire une classification KNN directement dans PostgreSQL.
|
||||
|
||||
Voici un exemple de requête complète en k-nearest neighbors (kNN) :
|
||||
|
||||
-- Supposons que vous avez :
|
||||
-- table produit(id serial, nom text, famille text, nutrition vector)
|
||||
|
||||
-- Exemple : on veut classifier un produit inconnu
|
||||
|
||||
```sql
|
||||
WITH nouveau AS (
|
||||
SELECT
|
||||
ARRAY[
|
||||
80, -- énergie (kcal/100g)
|
||||
3.5, -- protéines
|
||||
12, -- glucides
|
||||
11, -- sucres
|
||||
2.0, -- graisses
|
||||
0.8, -- graisses_saturées
|
||||
0.1, -- sel
|
||||
1.2, -- fibres
|
||||
5, -- nutriscore numérique
|
||||
0 -- nombre d'additifs
|
||||
]::vector AS nutrition
|
||||
)
|
||||
SELECT p.famille,
|
||||
COUNT(*) AS voisins,
|
||||
ROUND(AVG(p.nutrition <-> n.nutrition)::numeric, 3) AS distance_moyenne
|
||||
FROM produit p
|
||||
JOIN nouveau n ON true
|
||||
ORDER BY p.nutrition <-> n.nutrition -- tri par distance euclidienne
|
||||
LIMIT 5; -- on récupère les 5 plus proches voisins
|
||||
```
|
||||
|
||||
```sql
|
||||
Étape suivante : classification majoritaire
|
||||
|
||||
Pour prédire la famille (yaourt ou confiture), on peut compter la famille majoritaire parmi les k plus proches voisins :
|
||||
|
||||
WITH nouveau AS (
|
||||
SELECT ARRAY[80, 3.5, 12, 11, 2.0, 0.8, 0.1, 1.2, 5, 0]::vector AS nutrition
|
||||
),
|
||||
voisins AS (
|
||||
SELECT p.famille
|
||||
FROM produit p
|
||||
JOIN nouveau n ON true
|
||||
ORDER BY p.nutrition <-> n.nutrition
|
||||
LIMIT 5 -- k=5
|
||||
)
|
||||
SELECT famille, COUNT(*) AS occurrences
|
||||
FROM voisins
|
||||
GROUP BY famille
|
||||
ORDER BY occurrences DESC
|
||||
LIMIT 1; -- famille prédite
|
||||
```
|
||||
Reference in New Issue
Block a user