Files
sql/pgvector/classification.md

56 lines
1.6 KiB
Markdown
Raw Permalink Normal View History

2025-09-16 16:17:02 +02:00
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.
2025-09-14 22:12:09 +02:00
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
```