Entiendo que la distribución normal no está definida si la desviación estándar es cero, pero necesito manejar el caso donde todos los valores son iguales en un algoritmo de computadora. El siguiente método debe devolver un valor válido, incluso si la desviación estándar es cero. ¿Cómo puedo arreglar este método para que no se divida entre cero?
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; }
Mi idea era insertar esto al principio del método:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
¿Sería correcto?
Comentarios
Respuesta
Cuando la desviación estándar es cero, su PDF gaussiano (normal) se convierte en Función delta de Dirac . No puede simplemente insertar una desviación estándar cero en la expresión convencional. Por ejemplo, si el PDF está conectado a algún tipo de integración numérica, esto no funcionará. Tienes que modificar las integrales. En el siguiente ejemplo, calculamos el valor medio de la función $ g (x) $ usando la densidad gaussiana $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
cuando conecta la varianza cero, esto se vuelve funcional delta: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Tu código tiene que poder reconocer esto, de lo contrario fallará.
Una forma de solucionar esto es sorprendentemente simple: ingrese un valor muy pequeño de $ \ sigma $ en gaussiano en lugar de cero. Tendrá que elegir el $ \ sigma $ correcto para su situación. Si es demasiado pequeño, aumentará su exponente y las integrales no funcionarán o la precisión será baja. Esto va a una aproximación gaussiana conocida de la función delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Comentarios
- Si " falla " tiene que depender de su especificación funcional. Si la intención es simplemente devolver una versión continua de la densidad de probabilidad, entonces la función que siempre devuelve cero es correcta, porque el delta de Dirac tiene una densidad definida en todas partes menos en la media. Si, por otro lado, se llama a esta función como parte de un cálculo de probabilidad para calcular una estimación de ML, entonces no hay implementación alguna que haga que tenga éxito: todo lo que puede hacer es generar una condición de error.
- @whuber, formato de punto flotante admite infinito positivo. Entonces, podría configurar el PDF al infinito. El problema ' es que incluso entonces su rutina de optimización de probabilidad no funcionará debido a la discontinuidad. Por lo tanto, ' digo que tiene que modificar el código que usa PDF. Él no puede ' salirse con la suya jugando solo con PDF
- Publiqué un comentario adicional arriba con más información. Yo ' estoy pensando que Aksakal es correcto. Tengo que modificar el código que usa el método.
NormalDist
en su algoritmo?