Files
sql/pgvector/classification.md
2025-09-14 22:12:09 +02:00

1.6 KiB
Raw Blame History

Parfait 👍 Alors, puisque vous avez vos vecteurs nutritionnels dans une colonne nutrition vector (normalisés avec un Z-score), vous pouvez utiliser lextension 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

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
É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