Eu entendo que a distribuição normal é indefinida se o desvio padrão for zero, mas preciso lidar com o caso em que todos os valores são iguais em um algoritmo de computador. O método a seguir deve retornar um valor válido, mesmo se o desvio padrão for zero. Como posso corrigir esse método para não dividir por zero?
public static double NormalDist(double x, double mean, double standard_dev) { double fact = standard_dev * Math.Sqrt(2.0 * Math.PI); double expo = (x - mean) * (x - mean) / (2.0 * standard_dev * standard_dev); return Math.Exp(-expo) / fact; }
Minha ideia era inserir isso no início do método:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Isso seria correto?
Comentários
Resposta
Quando o desvio padrão é zero, seu PDF gaussiano (normal) se transforma em função delta de Dirac . Você não pode simplesmente inserir o desvio padrão zero na expressão convencional. Por exemplo, se o PDF estiver conectado a algum tipo de integração numérica, isso não funcionará. Você tem que modificar as integrais. No exemplo abaixo, calculamos o valor médio da função $ g (x) $ usando a densidade gaussiana $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
quando você conecta a variância zero, isso se torna funcional delta: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Seu código deve ser capaz de reconhecer isso, caso contrário, ele falhará.
Uma maneira de corrigir isso é surpreendentemente simples: conecte um valor muito pequeno de $ \ sigma $ em gaussiano em vez de zero. Você terá que escolher o $ \ sigma $ certo para sua situação. Se for muito pequeno, seu expoente explodirá e as integrais não funcionarão ou a precisão será baixa. Isso vai para uma aproximação Gaussiana conhecida da função delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Comentários
- Se " falha " depende de sua especificação funcional. Se a intenção é meramente retornar uma versão contínua da densidade de probabilidade, então a função que sempre retorna zero está correta, porque o delta de Dirac tem uma densidade definida em todos os lugares, exceto na média. Se, por outro lado, essa função está sendo chamada como parte de um cálculo de probabilidade para calcular uma estimativa de ML, então não há nenhuma implementação que fará com que ela seja bem-sucedida: tudo que ela pode fazer é gerar uma condição de erro.
- @whuber, floating formato de ponto suporta infinito positivo. Então, ele pode definir o PDF para o infinito. O problema ' é que mesmo assim sua rotina de otimização de probabilidade não funcionará, por causa da descontinuidade. Portanto, ' estou dizendo que ele deve modificar o código que usa PDF. Ele não pode ' se safar apenas mexendo com o PDF
- Publiquei um comentário adicional acima com mais informações. Eu ' estou pensando que Aksakal está correto. Tenho que modificar o código que usa o método.
NormalDist
em seu algoritmo?