Todos os desafios
Fácil 0 resolvidos 0% de aceitação

Previsão com regressão logística

Classifique exemplos como 0 ou 1 passando uma soma ponderada pela sigmoide e comparando com um limiar.

O que você vai aprender

  • Transformar uma soma ponderada em probabilidade
  • Classificar com um limiar de decisão
  • Entender classificadores binários

Problema

Ver original (inglês)

A regressão logística é um modelo linear para perguntas de sim ou não. Para cada exemplo, ela calcula uma probabilidade e a transforma em uma classe:

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

Implemente logistic_predict(samples, weights, bias, threshold).

Entrada

samples: Uma linha de n variáveis por exemplo.

weights: n pesos.

bias: O viés.

threshold: A probabilidade necessária para prever a classe 1 (estritamente entre 0 e 1).

Saída

Retorne a classe prevista (0 ou 1) de cada exemplo, em ordem.

Restrições

1 ≤ exemplos ≤ 1.000, 1 ≤ n ≤ 50

-100 ≤ cada variável, peso e viés ≤ 100

0 < threshold < 1

Exemplos

Exemplo 1
Entrada:
bias = -1.0
samples = [
    [2.0, 1.0],
    [0.0, 0.0],
    [-1.0, -3.0]
]
weights = [1.5, -0.5]
threshold = 0.5

Saída esperada:
expected = [1, 0, 0]
Entrada:
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;

Saída esperada:
std::vector<long long> expected = {1, 0, 0};
Entrada:
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;

Saída esperada:
long[] expected = new long[] {1, 0, 0};

Explicação

Exemplo 1: z = 3 - 0.5 - 1 = 1.5, p ≈ 0.818 → 1. Exemplo 2: z = -1, p ≈ 0.269 → 0. Exemplo 3: z = -1.5 + 1.5 - 1 = -1, p ≈ 0.269 → 0. Resultado: [1, 0, 0].

Exemplo 2
Entrada:
bias = -2.0
samples = [
    [1.0],
    [2.0],
    [3.0]
]
weights = [1.0]
threshold = 0.7

Saída esperada:
expected = [0, 0, 1]
Entrada:
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;

Saída esperada:
std::vector<long long> expected = {0, 0, 1};
Entrada:
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;

Saída esperada:
long[] expected = new long[] {0, 0, 1};

Explicação

As probabilidades são σ(-1) ≈ 0.269, σ(0) = 0.5 e σ(1) ≈ 0.731. Só a última alcança o limiar de 0.7, então o resultado é [0, 0, 1].

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.