Estoy tratando de aplicar el marco de la martingala de poder por [ Vovk et al., 2003 ] para la detección de cambios en flujos de datos no etiquetados, al igual que en [ Ho y Wechsler, 2007 ]. La idea básica consiste en utilizar una martingala de potencia de la forma $$M_n^{(\epsilon)} := \prod_{i=1}^n\left(\epsilon p_i^{\epsilon-1}\right) = \epsilon p_n^{\epsilon-1} M_{n-1}^{(\epsilon)}.$$ Si he entendido bien el método, se supone que funciona de la siguiente manera:
- $p_i$ son valores p de alguna secuencia de entrada que se distribuyen uniformemente en $[0,1]$ cuando la secuencia es intercambiable;
- cuando se viola la intercambiabilidad, $p_i$ se hacen más pequeños, y $M_n$ comienza a crecer;
- cuando $M_n$ ha crecido hasta algún umbral o la diferencia entre los vecinos $M_n$ ha superado algún umbral, hacemos sonar la alarma de que se ha producido algún cambio y volvemos a empezar.
Parece muy sencillo, pero no he conseguido que funcione: en mis datos, los valores de $M_n$ osciló aleatoriamente durante un tiempo, pero muy pronto bajó a cero (a valores como 1e-100) y se quedó ahí; hubo algunos factores grandes cuando se produjo un cambio real en los datos, pero se necesitarían muchos factores para volver de 1e-100...
Intenté una prueba simple: generé una distribución uniforme $p_i$ y calculado $M_n$ para ellos. Aquí está el código python completo de mi prueba ( $\epsilon=0.92$ es un valor sugerido por los documentos, pero he probado otros $\epsilon$ con resultados similares):
epsilon = 0.92
pv_test = [random.random() for _ in xrange(5000)]
test_mult = [epsilon * (x ** (epsilon - 1)) for x in pv_test]
Mtest = [1]
for i in xrange(len(test_mult)):
Mtest.append(Mtest[i] * test_mult[i])
Y observé el mismo comportamiento: $M_n$ ¡siempre bajaba a cero! A veces más rápido, a veces más lento, pero siempre. Aquí hay algunos gráficos de muestra de $M_n$ :
Parece un paseo aleatorio, pero siempre acaba cayendo a cero incluso para valores p perfectamente uniformes. Obviamente, esto no funcionará para la detección de cambios porque incluso una secuencia relativamente larga de valores p pequeños no puede resucitar $M_n$ de 1e-100.
Así que mi pregunta es: ¿qué estoy haciendo mal?