DEV Community

loading...

Proceso de Poisson

pablinme profile image Pablo Miranda ・5 min read

En estadística y simulación, un proceso de Poisson se conoce también como ley de los sucesos raros. Es un proceso estocástico de tiempo continuo que consiste en “contar” eventos raros que ocurren a lo largo del tiempo.

Si hay eventos homogeneos ocurriendo en un determinado momento dentro de un espacio contínuo de tiempo (son homogeneos asumiendo que tienen el mismo origen y probabilidades no difieran a menos de que sea especificado por el modelo). Este proceso se denomina “Point Process” basicamente un flujo homogeneo de eventos.

El crear un modelo de este flujo es reducido a modelar los momentos en el tiempo en que los eventos ocurren, o en otras palabras, modelar intervalos de tiempo ocurridos entre eventos cercanos.

Del proceso de poisson el más popular es el estacionarío que tiene las siguientes propiedades:

  • Independencía: los eventos ocurren de manera independiente.
  • Ordinariedad: sólo un evento puede ocurrir en un momento en el tiempo.
  • Estacionario: el número de ocurrencias de los eventos en un intervalo, no depende del punto e inicio de dicho intervalo.

La probabilidad p(n, T) de que n eventos ocurren en un periodo de tiempo de longitud T es determinado por la expresión

donde λ es la intensidad del proceso (porcentaje de eventos en cada unidad de tiempo). La probabilidad de que un evento ocurra durante un intervalo de tiempo con longitud ∆t es igual a λ ∙ ∆t + o(∆t), y una duración t de intervalo de tiempo entre la ocurrencia de dos eventos cercanos es una variable aleatoria exponencial con un parámetro λ.

La duración entre dos eventos de tiempo se denota como t1 - t0 = t0 , t2 - t1 = t1, ... , de esta manera se puede simular como variables aleatorias exponenciales independientes con un parámetro λ: ti = - ln α / λ

Procesos de Poisson no estacionaríos

La probabilidad de la ocurrencia de un evento en un intervalo [t; t + ∆t] tiene la forma λ(t) ∙ ∆t + o(∆t) (λ depende del momento en el tiempo t), entonces el número de eventos dentro de intervalos con la misma longitud dependerá no solo de la longitud del intervalo, sino también de la ubicación de este intervalo en la axisa del tiempo.

Cadenas de Markov

Teniendo varios procesos estacionarios de poisson e intercalando entre ellos. Este proceso de cambio de flujo es una cadena de Markov con tiempo continuo, así es necesario especificar una matriz que determinará los cambios de flujo y denotará las intensidades de cada flujo

λ1, λ2, λ3, ... , λn

Esta cadena de Markov se denomina una cadena de control con las siguientes características:

La evolución de la cadena en azul y la implementación de los eventos (cruz) cómo se muestra a continuación.

Algoritmo

Procesamiento estadístico

Para estos procesos una característica importante es la distribución de la longitud de los intervalos entre eventos que ocurren de manera sucesiva y la distribución del número de eventos que han ocurrido en ese periodo de tiempo. Este análisis solo es posible realizarlo en flujos estacionarios (cuando la intensidad del flujo no cambia en el tiempo) de manera que describimos el procesamiento estadístico en flujos estacionarios.

La longitud de los intervalos ti entre la ocurrencia de estos eventos son variables aleatorias continuas, para analizar estos eventos que ocurren en un espacio de tiempo determinado se necesita seleccionar la longitud de este intervalo de tiempo T. Después hay que realizar la simulación de este flujo un número N -suficientemente largo- de veces para simular este flujo en el tiempo, contando cada vez el número de eventos que han ocurrido en el flujo:

O en el caso de que se haya finalizado la simulación, o no exista la posibilidad de repetirla, se puede fijar un intervalo de longitud T en un lugar arbitrarío de la simulación del intervalo u observar el flujo y calcular el número de eventos en este intervalo. El número resultante será la realización de una variable aleatoría del número de eventos que han ocurrido en el flujo durante ese tiempo T. Así se repite este procedimiento N veces durante intervalos de longitud T ubicados -al azar- en distintos espacios:

El resultado será una muestra de N enteros positivos para los que se puede aplicar los métodos de procesamiento estadístico de los resultados de una simulación de una variable aleatoria discreta, este procedimiento se debería repetir para diferentes valores de T.

Ejemplo

Simular dos procesos de poisson con intensidades λ1 y λ2. Capturar los eventos de ambos procesos a la vez, analizar los datos de este proceso agregado con el proceso estacionario con intensidad (λ1 + λ2).

Resultado

Implementación

Variable de Poisson, dado 'lambda'

int poissonVariable;
double randomVariable;
double randomVariableProduct;

double precision = Math.Exp(-lambda);

poissonVariable = -1;
randomVariableProduct = 1;

do
{
    randomVariable = random.NextDouble();
    randomVariableProduct *= randomVariable;
    poissonVariable++;
} while (randomVariableProduct > precision);

return poissonVariable;
Enter fullscreen mode Exit fullscreen mode
double n = double.Parse(textBoxNumSim.Text); //N
double[] lambdas = new double[3];

lambdas[0] = double.Parse(textBoxInten1.Text); //Lambda 1
lambdas[1] = double.Parse(textBoxInten2.Text); //Lambda 2
lambdas[2] = lambdas[0] + lambdas[1];

textBoxInten3.Text = lambdas[2].ToString(); //Lambda 3

int temp1, temp2, temp3;

double sumPoisson1 = 0;
double sumPoisson2 = 0;
double sumPoisson3 = 0;

double sumPoissonSquared1 = 0;
double sumPoissonSquared2 = 0;
double sumPoissonSquared3 = 0;

for (int i = 0; i < n; i++)
{
    temp1 = generateSinglePoissonVariable(lambdas[0]);
    temp2 = generateSinglePoissonVariable(lambdas[1]);
    temp3 = generateSinglePoissonVariable(lambdas[2]);

    sumPoisson1 += temp1;
    sumPoisson2 += temp2;
    sumPoisson3 += temp3;

    sumPoissonSquared1 += (temp1 * temp1);
    sumPoissonSquared2 += (temp2 * temp2);
    sumPoissonSquared3 += (temp3 * temp3);
}

double meanL1 = sumPoisson1 / ((double) n);
double meanL2 = sumPoisson2 / ((double) n);
double meanL3 = sumPoisson3 / ((double) n);

double varianceL1 = sumPoissonSquared1 / ((double) n) - (meanL1 * meanL1);
double varianceL2 = sumPoissonSquared2 / ((double) n) - (meanL2 * meanL2);
double varianceL3 = sumPoissonSquared3 / ((double) n) - (meanL3 * meanL3);

double averageError = Math.Abs(meanL3 - (meanL1 + meanL2)) / Math.Abs((meanL1 + meanL2));
double varianceError = Math.Abs(varianceL3 - (varianceL1 + varianceL2)) / Math.Abs((varianceL1 + varianceL2));

textBoxL1Mean.Text = "Average: " + meanL1.ToString("0.0000");
textBoxL2Mean.Text = "Average: " + meanL2.ToString("0.0000");
textBoxL3Mean.Text = "Average: " + meanL3.ToString("0.0000") +
                     " (error = " + Math.Round((averageError * 100)).ToString() + "%)";

textBoxL1Variance.Text = "Variance: " + varianceL1.ToString("0.0000");
textBoxL2Variance.Text = "Variance: " + varianceL2.ToString("0.0000");
textBoxL3Variance.Text = "Variance: " + varianceL3.ToString("0.0000") +
                         " (error = " + Math.Round((varianceError * 100)).ToString() + "%)";
Enter fullscreen mode Exit fullscreen mode

Descargar Proyecto

Discussion (0)

pic
Editor guide