Moyenne mobile itérée

13

Si nous avons une liste, disons la liste [9, 2, 4, 4, 5, 5, 7], nous pouvons faire une moyenne mobile à travers elle.

En prenant une fenêtre de disons, 3 éléments, chaque élément est remplacé par une fenêtre comme celle-ci:, [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]puis en prenant des moyennes, nous obtenons[9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667] .

Assez simple jusqu'à présent. Mais une chose que vous pouvez remarquer à ce sujet est que prendre une moyenne mobile "lisse" la liste. Cela soulève donc la question: combien de fois faut-il prendre une moyenne mobile pour rendre la liste "assez lisse"?

Ta tâche

Étant donné une liste de flottants, une taille de fenêtre entière et un flottant, affichez combien de fois il faut prendre la moyenne mobile pour obtenir l'écart-type inférieur à ce flottant. Pour ceux qui ne le savent pas, l'écart-type mesure le manque de fluidité d'un ensemble de données et peut être calculé par la formule suivante:

stddev

Par exemple, en utilisant notre liste précédente et un max stddev de .5, nous obtenons des 8itérations qui ressemblent à ceci:

[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]

et terminer avec un stdev de 0.40872556490459366. Vous venez de sortir 8.

Mais il y a un hic:

La réponse ne doit pas être non négative! Si la liste initiale satisfait déjà le stddev maximum, vous devez voir combien d'itérations vous pouvez "reculer" et défaire la moyenne mobile et que la liste satisfasse toujours le stddev max. Étant donné que nous tronquons les fenêtres pour les npoints de données initiaux et ne les supprimons pas, il y a suffisamment de données pour inverser une moyenne mobile.

Par exemple, si nous commençons avec la liste [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](tirée de notre exemple précédent avec 3 moyennes mobiles supplémentaires) et la même taille de fenêtre et max stddev, vous afficherez -3car vous pouvez inverser la moyenne mobile la plupart du 3temps.

Tout format d'E / S raisonnable convient.

C'est le donc le code le plus court en octets gagne!

Cas de test

[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
Maltysen
la source
Connexes .
Poignée de porte

Réponses:

1

Wolfram - 236

Assez maladroit en ce moment, mais au moins ça marche.

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]]
bruissement
la source
236 octets,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]]
CalculatriceFeline