Probabilidade e inferência: evidência, base e incerteza
Seu desafio é substituir um painel que confunde detecção e confiabilidade por um pequeno relatório reproduzível. Você implementará Bayes com validação, um intervalo aproximado com condições explícitas e uma simulação que produz resultados repetíveis. As taxas do exercício são hipóteses sintéticas; não representam um produto ou uma avaliação executada com um provedor.
Antes de copiar a solução, escreva duas previsões: a posterior deve aumentar se a taxa de base aumentar, e a largura do intervalo deve cair pela metade quando n quadruplicar com proporção constante. Vamos usar essas relações como testes e tratar a simulação como uma ferramenta para observar variação, sem exigir um percentual mágico de cobertura.
JavaScriptIA & MLMatemáticaAo terminar esta aula
- Preserve contagens e denominadores no contrato.
- Validação numérica não detecta viés de coleta.
- Simulação mostra variabilidade sem criar benchmark operacional.
Antes de continuar: Leitura: Probabilidade e inferência: evidência, base e incerteza
Reproduzir o alerta por dois caminhos
FundamentosAbra probability.mjs e calcule primeiro as contagens esperadas para mil pedidos. Guarde nove verdadeiros e 49.5 falsos, depois divida nove pelo total 58.5. Implemente posterior com probabilidades entre zero e um. Ela calcula a probabilidade total do alerta e só então divide a contribuição verdadeira por esse total. O caso prior=0 e falsePositive=0 torna o evento alerta impossível: não existe conjunto de alertas para condicionar. A solução deve lançar erro, em vez de retornar zero e sugerir uma posterior bem definida.
Confira a função por uma conta independente e acrescente o caso de taxa de base 0.1, cuja resposta é dois terços. Agora introduza o erro intencional de retornar sensitivity diretamente. Os dois testes devem quebrar. Se somente um teste fosse usado e a taxa de base escolhida produzisse por acaso resultado próximo da sensibilidade, o erro poderia passar. A variação controlada das entradas mostra se o componente respeita a estrutura de condicionamento que a leitura apresentou.
↗ 18.05 Introduction to Probability and Statistics — syllabus
Construir um intervalo que admite seus limites
FundamentosA função interval recebe contagens inteiras, não uma proporção pronta. Essa decisão mantém visível o denominador da avaliação. Ela rejeita n menor ou igual a zero, sucessos negativos e sucessos maiores que n. Adicionamos uma condição didática: ao menos dez sucessos e dez fracassos. Não é uma garantia universal da aproximação, mas impede aplicá-la justamente em casos de fronteira evidentes. Se todos os cem resultados forem aceitos, estimar erro padrão zero pela fórmula normal daria uma certeza enganosa; o programa interrompe e exige outro método.
Calcule à mão o caso oitenta de cem: raiz de 0.8×0.2/100 igual a 0.04. A margem é 1.96×0.04=0.0784. O código devolve estimativa, erro padrão e dois limites separados, permitindo rastrear a conta. Não limite artificialmente os resultados para esconder uma aproximação inadequada. Nesta atividade, os casos permitidos ficam dentro da faixa de probabilidade. Para uma aplicação geral, escolha e documente um método apropriado ao desenho e às contagens; não transforme nossa guarda em uma certificação automática de validade estatística.
Simular sem confundir repetibilidade e evidência
FundamentosUma variável Bernoulli sintética será gerada comparando um número uniforme entre zero e um com p. Para cada amostra, repetimos a operação cem vezes e contamos aceitações. O gerador usa uma semente e uma recorrência inteira simples. Ele foi escolhido para transparência e execução offline, não para estudos estatísticos exigentes ou criptografia. Duas execuções com a mesma semente devem devolver a mesma contagem. Esse teste protege o procedimento de depuração; não precisa exigir que a contagem coincida exatamente com oitenta, pois oitenta é a média esperada, não o resultado obrigatório de toda amostra.
Teste também p=0 e p=1. Esses extremos devem gerar nenhuma aceitação e cem aceitações, respectivamente. Eles ajudam a detectar uma comparação invertida entre sorteio e probabilidade. Em seguida produza duzentas amostras com sementes diferentes, calcule os intervalos permitidos pela guarda e conte quantos contêm 0.8, que conhecemos por construção. Exiba tanto o número de intervalos usados quanto os cobertos. O experimento ilustra o procedimento de cobertura sob um modelo sintético; não estabelece taxa real de aceitação para respostas de IA.
Diagnosticar viés fora do alcance da função
FundamentosImagine que os cem registros vieram de dez clientes, com dez respostas parecidas de cada um. Nosso código não conhece essa estrutura e usará n=100. Uma dependência positiva dentro de cliente pode fazer a incerteza calculada parecer menor do que deveria. Escreva esse contraexemplo no relatório, identificando cliente como possível unidade de agrupamento. Outro caso é selecionar só perguntas que o sistema respondeu rapidamente: o conjunto exclui falhas lentas e altera a pergunta estimada. Ambos passam na validação numérica, mostrando por que um contrato de tipos não substitui um desenho de avaliação.
A rubrica tem quatro dimensões: posterior por contagens, intervalo por fórmula, comportamento negativo e interpretação do experimento. Para cada uma, apresente uma evidência observável e uma limitação. Uma entrega que apenas imprime covered/usable não explica inferência. Retome a álgebra da unidade anterior: a média é uma combinação linear dos resultados, mas a hipótese de independência é uma afirmação sobre como foram obtidos. Uma transformação matemática correta pode operar sobre uma amostra inadequada; separar essas camadas será essencial quando avaliarmos modelos treinados.
import assert from 'node:assert/strict';
const validP=p=>{if(!Number.isFinite(p)||p<0||p>1)throw Error('probabilidade inválida');};
function posterior(prior,sensitivity,falsePositive){
[prior,sensitivity,falsePositive].forEach(validP);
const positive=prior*sensitivity+(1-prior)*falsePositive;
if(positive===0)throw Error('evento impossível');
return prior*sensitivity/positive;
}
function interval(successes,n){
if(!Number.isInteger(n)||n<=0||!Number.isInteger(successes)||successes<0||successes>n)
throw Error('contagens inválidas');
// Aproximação normal: não usamos quando sucessos/falhas são escassos.
if(successes<10||n-successes<10)throw Error('aproximação inadequada');
const estimate=successes/n, se=Math.sqrt(estimate*(1-estimate)/n);
return {estimate,se,low:estimate-1.96*se,high:estimate+1.96*se};
}
function random(seed){
let state=seed>>>0;
return ()=>{state=(1664525*state+1013904223)>>>0;return state/4294967296;};
}
function sample(n,p,seed){
validP(p);
if(!Number.isInteger(n)||n<=0)throw Error('tamanho inválido');
const rng=random(seed);let successes=0;
for(let i=0;i<n;i++)if(rng()<p)successes++;
return successes;
}
const near=(a,b)=>assert.ok(Math.abs(a-b)<1e-12);
near(posterior(0.01,0.9,0.05),9/58.5);
near(posterior(0.1,0.9,0.05),2/3);
const measured=interval(80,100);
near(measured.estimate,0.8);near(measured.se,0.04);
near(measured.low,0.7216);near(measured.high,0.8784);
const larger=interval(320,400);
near(larger.high-larger.low,(measured.high-measured.low)/2);
assert.throws(()=>interval(0,100),/inadequada/);
assert.throws(()=>interval(101,100),/contagens/);
assert.throws(()=>posterior(1.1,0.9,0.05),/inválida/);
assert.throws(()=>posterior(0,0.9,0),/impossível/);
const first=sample(100,0.8,42);
assert.equal(sample(100,0.8,42),first); // Reproduzibilidade, não qualidade estatística.
assert.equal(sample(100,0,42),0);assert.equal(sample(100,1,42),100);
let covered=0,usable=0;
for(let seed=1;seed<=200;seed++){
const k=sample(100,0.8,seed);
if(k<10||100-k<10)continue;
const band=interval(k,100);usable++;
if(band.low<=0.8&&band.high>=0.8)covered++;
}
console.log({posterior:posterior(0.01,0.9,0.05),measured,first,covered,usable});
// Não há assert de cobertura 95%: amostra finita e gerador didático não garantem isso.Exercício aplicado
Produza um relatório de detector e de avaliação amostral que preserve os denominadores e as hipóteses.
- Implemente posterior e compare dois casos com contagens calculadas no papel.
- Implemente intervalo para contagens, rejeitando dados impossíveis e aproximação de fronteira.
- Demonstre a redução de largura ao quadruplicar n com a mesma proporção.
- Implemente amostragem reproduzível e conte a cobertura ilustrativa sem impor 95% como assert.
- Registre um caso de dependência e um de seleção que o código não detecta.
Abrir resolução comentada
A solução acima cobre os casos válidos e negativos. O teste 9/58.5 verifica Bayes por uma representação diferente da fórmula, e o caso 2/3 verifica a influência da taxa de base. As contagens 80/100 e 320/400 verificam numericamente a relação da largura com a raiz do tamanho. Dados fora do domínio e eventos impossíveis produzem erros identificáveis.
O gerador de amostras permite repetir exatamente o experimento. Testes dos extremos verificam a lógica de Bernoulli, enquanto a cobertura é exibida, sem asserção de igualdade a 95%. Uma exigência desse tipo recompensaria a escolha conveniente de sementes e confundiria frequência finita com propriedade nominal do procedimento. A guarda pode excluir alguns intervalos, por isso mostramos usable junto com covered.
O relatório final deve acrescentar os dois diagnósticos de desenho: várias observações do mesmo cliente podem compartilhar erro, e uma fila escolhida por rapidez pode omitir perguntas difíceis. O código não resolve essas limitações porque só recebe contagens. Para estimar uma taxa operacional, precisaríamos definir a unidade amostral, preservar a procedência dos casos e escolher um método de inferência compatível. Essa conclusão demonstra compreensão além de acertar a conta.
import assert from 'node:assert/strict';
const validP=p=>{if(!Number.isFinite(p)||p<0||p>1)throw Error('probabilidade inválida');};
function posterior(prior,sensitivity,falsePositive){
[prior,sensitivity,falsePositive].forEach(validP);
const positive=prior*sensitivity+(1-prior)*falsePositive;
if(positive===0)throw Error('evento impossível');
return prior*sensitivity/positive;
}
function interval(successes,n){
if(!Number.isInteger(n)||n<=0||!Number.isInteger(successes)||successes<0||successes>n)
throw Error('contagens inválidas');
// Aproximação normal: não usamos quando sucessos/falhas são escassos.
if(successes<10||n-successes<10)throw Error('aproximação inadequada');
const estimate=successes/n, se=Math.sqrt(estimate*(1-estimate)/n);
return {estimate,se,low:estimate-1.96*se,high:estimate+1.96*se};
}
function random(seed){
let state=seed>>>0;
return ()=>{state=(1664525*state+1013904223)>>>0;return state/4294967296;};
}
function sample(n,p,seed){
validP(p);
if(!Number.isInteger(n)||n<=0)throw Error('tamanho inválido');
const rng=random(seed);let successes=0;
for(let i=0;i<n;i++)if(rng()<p)successes++;
return successes;
}
const near=(a,b)=>assert.ok(Math.abs(a-b)<1e-12);
near(posterior(0.01,0.9,0.05),9/58.5);
near(posterior(0.1,0.9,0.05),2/3);
const measured=interval(80,100);
near(measured.estimate,0.8);near(measured.se,0.04);
near(measured.low,0.7216);near(measured.high,0.8784);
const larger=interval(320,400);
near(larger.high-larger.low,(measured.high-measured.low)/2);
assert.throws(()=>interval(0,100),/inadequada/);
assert.throws(()=>interval(101,100),/contagens/);
assert.throws(()=>posterior(1.1,0.9,0.05),/inválida/);
assert.throws(()=>posterior(0,0.9,0),/impossível/);
const first=sample(100,0.8,42);
assert.equal(sample(100,0.8,42),first); // Reproduzibilidade, não qualidade estatística.
assert.equal(sample(100,0,42),0);assert.equal(sample(100,1,42),100);
let covered=0,usable=0;
for(let seed=1;seed<=200;seed++){
const k=sample(100,0.8,seed);
if(k<10||100-k<10)continue;
const band=interval(k,100);usable++;
if(band.low<=0.8&&band.high>=0.8)covered++;
}
console.log({posterior:posterior(0.01,0.9,0.05),measured,first,covered,usable});
// Não há assert de cobertura 95%: amostra finita e gerador didático não garantem isso.Como conferir seu resultado
- Posteriores conferidas nos dois cenários.
- Intervalo de 80/100 é [0.7216,0.8784].
- Largura em 320/400 é metade da anterior.
- Contagens inválidas e fronteira rejeitadas.
- Mesma semente reproduz contagem; cobertura não é promessa.
- Dependência e seleção documentadas com exemplos.
Teste sua compreensão
Responda com suas palavras antes de abrir o comentário. Saber explicar uma decisão é parte do domínio.
1. Por que a função rejeita um evento de probabilidade total zero?
Não há evento observado sobre o qual condicionar.
Dividir por zero produziria resultado indefinido, não evidência de ausência de falha.
↗ 18.05 Introduction to Probability and Statistics — syllabus
2. O que prova repetir o resultado com a mesma semente?
Reprodutibilidade da execução.
Não prova independência de dados reais nem qualidade do gerador para qualquer finalidade.
↗ 18.05 Introduction to Probability and Statistics — syllabus
3. Por que não há assert covered/usable===0.95?
Uma simulação finita varia e usa um gerador didático.
Cobertura nominal descreve o procedimento sob hipóteses, não uma frequência exata obrigatória nesta execução.
↗ 18.05 Introduction to Probability and Statistics — syllabus
Seu progresso fica salvo neste navegador. Concluir a leitura não substitui demonstrar o domínio nos exercícios.
Referências e aprofundamento
Documentação oficial e trabalhos originais. As referências registram o escopo e as limitações para você conferir o que sustentam.
- 18.05 Introduction to Probability and Statistics — syllabus
MIT OpenCourseWare • consulta: 2026-10-06
FundamentosProbabilidade condicional, Bayes, variáveis aleatórias, distribuições, amostragem e intervalos de confiança.
Limites: Programa de 2022; o intervalo normal da aula é uma aproximação didática sujeita a condições, não uma recomendação universal.