4 votos

Calcular el momento y los cuantiles de un flujo de datos.

Me gustaría para calcular los momentos y de cuantiles de una variable aleatoria que es la salida de un sensor.

No tengo la intención de almacenar todos los valores de las salidas de los sensores (digamos que genera un valor cada 15 minutos), sino más bien mantener los lotes de estos valores (por ejemplo, de dos semanas de lote) que voy a descartar de vez en cuando.

Yo estaba considerando la estimación de la función de densidad de probabilidad de un lote de productos con scikit del KernelDensity. Yo entonces desechar el lote y cuando puedo conseguir el asimiento de un nuevo lote de los valores de la actualización de la estimación de la densidad de probabilidad con estos nuevos valores.

Sé que la función de densidad de probabilidad de que me estimar, para cada lote por separado converge casi seguramente a la densidad real, pero no sé si este resultado aún se mantiene si puedo calcular la densidad de forma incremental como se define en el párrafo anterior.

Es el camino que debo hacer ?

3voto

Erik Madsen Puntos 161

Como empezar, me quería referir a un artículo de revista, se llama Un Algoritmo Rápido para Aproximado de Cuantiles en Alta Velocidad de los Flujos de Datos. Este es un papel que tengo que hace referencia a mí mismo antes y utilizado en la práctica, cuando la construcción de software de análisis de flujo de datos. Además, este método también fue discutido y aplicado aquí en Intel sitio.

A continuación es una instantánea de la más simple fragmento de código que se utiliza para calcular las instantáneas de cuantiles para la transmisión de datos desde el procesador Intel sitio que muestra cómo el algoritmo fue implementado.

#include "mkl_vsl.h"
#include <stdio.h>
#define DIM 3      /* dimension of the task */
#define N   1000   /* number of observations */
#define M   100    /* number of quantiles to compute */
#define EPS 0.01   /* accuracy of quantile computation */

int main()
{
   int i, status;
   VSLSSTaskPtr task;
   float x[DIM][N];  /* matrix of observations */
   float q_order[M], quants[M];
   float params;
   MKL_INT q_order_n;
   MKL_INT p, n, nparams, xstorage;
   int indices[DIM]={1,0,0}; /* the first vector component is processed */

   /* Parameters of the task and initialization */
   p = DIM;
   n = N;

   q_order_n = M;
   xstorage  = VSL_SS_MATRIX_STORAGE_ROWS;
   params    = EPS;
   nparams   = VSL_SS_SQUANTS_ZW_PARAMS_N;

   /* Calculate percentiles */
   for ( i = 0; i < M; i++ ) q_order[i] = (float)i / (float)M;

   /* Create a task */
   status = vslsSSNewTask( &task, &p, &n, &xstorage, x, 0, indices );

   /* Initialize the task parameters */
   status = vslsSSEditStreamQuantiles( task, &q_order_n, q_order,
                                       quants, &nparams, &params );

   /* Compute the percentiles with accuracy eps */
   status = vslsSSCompute( task, VSL_SS_STREAM_QUANTS,
                                 VSL_SS_METHOD_SQUANTS_ZW );

   /* Deallocate the task resources */
   status = vslSSDeleteTask( &task );

   return 0;
}

Como Zhang dice en su artículo, "Streaming cuantil de cálculo tiene varias limitaciones. Los flujos de datos son transitorios y se puede llegar a una alta velocidad. Además, el tamaño del flujo no puede ser conocido apriori. Transmisión de los cálculos por lo que requieren de una sola pasada de los algoritmos con espacios reducidos y que son capaces de manejar arbitrario del tamaño de los arroyos. Con el fin de garantizar la precisión de los resultados, el algoritmo debe garantizar aleatorio o determinista de error obligado para el cálculo de los cuantiles."

Me gustaría empezar por leer el periódico y luego ir desde allí. Aquí hay un enlace al PDF de la ponencia. Varios métodos se discuten antes de su algoritmo rápido es introducido.

1voto

David Plumpton Puntos 1345

Yo no tengo de fondo con respecto a su tarea. Sin embargo, que me recordó una idea que tengo para adaptar un clasificador (no Bayesiano, pero clasificador estático) a los cambios en el tiempo (en concreto yo estaba tratando de adaptarse a un bosque aleatorio).

Por lo tanto, mi idea es recoger una muestra para un período de tiempo: en el caso de 2 semanas si usted puede permitirse el lujo de que. Que para cada nueva hora (podría ser cualquier otro período de tiempo), añadir a la muestra de los nuevos puntos de datos, y eliminar puntos de datos de las más antiguas de hora.

Puede tener algunos problemas, debido a que depende mucho de cómo elegir aquellos períodos de tiempo. Grandes períodos de menor efectos para la nueva entrada. Pequeños períodos podría significar que los nuevos datos que podrían perturbar la antigua distribución demasiado. Depende de lo que usted realmente necesita.

[Después de editar] Después de algunas búsquedas en google he encontrado que este es un antiguo procedimiento conocido como "ventana deslizante", y hay un montón de papeles para la "ventana deslizante de cuantiles".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X