Media móvil iterada


13

Si tenemos una lista, digamos la lista [9, 2, 4, 4, 5, 5, 7], podemos hacer un promedio móvil a través de ella.

Tomando una ventana de, digamos, 3 elementos, cada elemento es reemplazado por una ventana como esta:, [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]y luego tomando promedios, obtenemos [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667].

Bastante simple hasta ahora. Pero una cosa que puede notar sobre esto es que tomar un promedio móvil "suaviza" la lista. Entonces esto plantea la pregunta: ¿cuántas veces se tiene que tomar un promedio móvil para hacer que la lista sea "lo suficientemente suave"?

Tu tarea

Dada una lista de flotantes, un tamaño de ventana entero y un flotante, genera cuántas veces se tiene que tomar el promedio móvil para obtener la desviación estándar menor que ese flotante. Para aquellos que no saben, la desviación estándar mide cuán poco uniforme es un conjunto de datos y puede calcularse mediante la siguiente fórmula:

stddev

Por ejemplo, usando nuestra lista anterior y un stddev máximo de .5, obtenemos 8iteraciones que se ven así:

[9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
[9.0, 7.25, 6.5, 4.6111111111111116, 4.2222222222222223, 4.1111111111111107, 4.8888888888888893]
[9.0, 8.125, 7.583333333333333, 6.1203703703703702, 5.1111111111111107, 4.3148148148148149, 4.4074074074074074]
[9.0, 8.5625, 8.2361111111111107, 7.2762345679012341, 6.2716049382716044, 5.1820987654320989, 4.6111111111111107]
[9.0, 8.78125, 8.5995370370370363, 8.024948559670781, 7.2613168724279831, 6.2433127572016458, 5.3549382716049374]
[9.0, 8.890625, 8.7935956790123466, 8.4685785322359397, 7.9619341563786001, 7.1765260631001366, 6.2865226337448554]
[9.0, 8.9453125, 8.8947402263374489, 8.7175997370827627, 8.4080361225422955, 7.8690129172382264, 7.141660951074531]
[9.0, 8.97265625, 8.9466842421124824, 8.8525508211400705, 8.6734586953208357, 8.3315495922877609, 7.8062366636183507]

y terminar con un stdev de 0.40872556490459366. Acabas de salir 8.

Pero hay una trampa:

¡La respuesta no tiene que ser no negativa! Si la lista inicial ya satisface el stddev máximo, debe ver cuántas iteraciones puede "retroceder" y deshacer el promedio móvil y aún así la lista satisface el stddev máximo. Como estamos truncando las ventanas para los npuntos de datos iniciales y no los descartamos, hay suficientes datos para revertir un promedio móvil.

Por ejemplo, si comenzamos con la lista [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](tomada de nuestro ejemplo anterior con 3 promedios móviles más hechos) y el mismo tamaño de ventana y el máximo estándar, obtendrá la salida -3porque puede invertir el promedio móvil en la mayoría de las 3veces.

Cualquier formato de E / S razonable está bien.

Este es el código más corto en bytes gana!

Casos de prueba

[9, 2,  4,  4,  5,  5,  7], 3, .5 -> 8
[9, 2,  4,  4,  5,  5,  7], 3, .25 -> 9
[9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627], 3, .5 -> -3
[1000, 2,  4,  4,  5,  5,  7], 7, .25 -> 13
[1000.0, 999.98477172851563, 999.96956668760447, 999.95438464397, 999.90890377378616, 999.83353739825293, 999.69923168916694], 4, 7 -> -6


Respuestas:


1

Wolfram - 236

Bastante torpe en este momento, pero al menos funciona.

f[x_,w_,c_]:=Module[{l=Length,d=Sqrt@CentralMoment[#,2]&,n,a,b,t,r},n=Length@x;a=Normalize/@LowerTriangularize@Array[Boole[Abs[#1-#2]<w]&,{n,n}]^2;{b,t,r}=If[d@x>c,{a,d@#>c&,l@#-1&},{Inverse@a,d@#<c&,-l@#+2&}];r@NestWhileList[b.#&,x,t]]

236 bytes,f[x_,w_,c_]:=Module[{l=Length,d=Sqrt@CentralMoment[#,2]&,n,a,b,t,r},n=Length@x;a=Normalize/@LowerTriangularize@Array[Boole[Abs[#1-#2]<w]&,{n,n}]^2;{b,t,r}=If[d@x>c,{a,d@#>c&,l@#-1&},{Inverse@a,d@#<c&,-l@#+2&}];r@NestWhileList[b.#&,x,t]]
CalculatorFeline
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.