Tous les défis
Facile 0 résolus 0 % de réussite

Prédiction par régression logistique

Classez des exemples en 0 ou 1 en passant une somme pondérée dans la sigmoïde et en la comparant à un seuil.

Ce que vous allez apprendre

  • Transformer une somme pondérée en probabilité
  • Classer avec un seuil de décision
  • Comprendre les classifieurs binaires

Problème

La régression logistique est un modèle linéaire pour les questions oui/non. Pour chaque exemple, elle calcule une probabilité et la transforme en classe :

  1. z = x₁×w₁ + … + xₙ×wₙ + bias
  2. p = 1 / (1 + e^(-z))
  3. classe = 1 si p ≥ threshold, sinon 0

Implémentez logistic_predict(samples, weights, bias, threshold).

Entrée

samples : une ligne de n variables par exemple.

weights : n poids.

bias : le biais.

threshold : la probabilité nécessaire pour prédire la classe 1 (strictement entre 0 et 1).

Sortie

Renvoyez la classe prédite (0 ou 1) de chaque exemple, dans l'ordre.

Contraintes

1 ≤ exemples ≤ 1 000, 1 ≤ n ≤ 50

-100 ≤ chaque variable, poids et biais ≤ 100

0 < threshold < 1

Exemples

Exemple 1
Entrée :
bias = -1.0
samples = [
    [2.0, 1.0],
    [0.0, 0.0],
    [-1.0, -3.0]
]
weights = [1.5, -0.5]
threshold = 0.5

Sortie attendue :
expected = [1, 0, 0]
Entrée :
double bias = -1.0;
std::vector<std::vector<double>> samples = {
    {2.0, 1.0},
    {0.0, 0.0},
    {-1.0, -3.0}
};
std::vector<double> weights = {1.5, -0.5};
double threshold = 0.5;

Sortie attendue :
std::vector<long long> expected = {1, 0, 0};
Entrée :
double bias = -1.0;
double[][] samples = new double[][] {
    new double[] {2.0, 1.0},
    new double[] {0.0, 0.0},
    new double[] {-1.0, -3.0}
};
double[] weights = new double[] {1.5, -0.5};
double threshold = 0.5;

Sortie attendue :
long[] expected = new long[] {1, 0, 0};

Explication

Exemple 1 : z = 3 - 0.5 - 1 = 1.5, p ≈ 0.818 → 1. Exemple 2 : z = -1, p ≈ 0.269 → 0. Exemple 3 : z = -1.5 + 1.5 - 1 = -1, p ≈ 0.269 → 0. Résultat : [1, 0, 0].

Exemple 2
Entrée :
bias = -2.0
samples = [
    [1.0],
    [2.0],
    [3.0]
]
weights = [1.0]
threshold = 0.7

Sortie attendue :
expected = [0, 0, 1]
Entrée :
double bias = -2.0;
std::vector<std::vector<double>> samples = {
    {1.0},
    {2.0},
    {3.0}
};
std::vector<double> weights = {1.0};
double threshold = 0.7;

Sortie attendue :
std::vector<long long> expected = {0, 0, 1};
Entrée :
double bias = -2.0;
double[][] samples = new double[][] {
    new double[] {1.0},
    new double[] {2.0},
    new double[] {3.0}
};
double[] weights = new double[] {1.0};
double threshold = 0.7;

Sortie attendue :
long[] expected = new long[] {0, 0, 1};

Explication

Les probabilités sont σ(-1) ≈ 0.269, σ(0) = 0.5 et σ(1) ≈ 0.731. Seule la dernière atteint le seuil de 0.7, donc le résultat est [0, 0, 1].

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.