Iterierter gleitender Durchschnitt

13

Wenn wir eine Liste haben, sagen [9, 2, 4, 4, 5, 5, 7]wir die Liste , dann können wir einen gleitenden Durchschnitt darüber bilden.

Ein Fenster von etwa 3 Elementen wird jedes Element durch ein Fenster wie solche ersetzt: [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]und mittelt dann nehmen wir bekommen [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667].

Bis jetzt ziemlich einfach. Aber eine Sache, die Sie daran bemerken können, ist, dass ein gleitender Durchschnitt die Liste "glättet". Das wirft also die Frage auf: Wie oft muss man einen gleitenden Durchschnitt nehmen, um die Liste "glatt genug" zu machen?

Deine Aufgabe

Ausgehend von einer Liste von Gleitkommazahlen, einer Ganzzahlfenstergröße und einer Gleitkommazahl wird ausgegeben, wie oft der gleitende Durchschnitt genommen werden muss, um die Standardabweichung unter dieser Gleitkommazahl zu erhalten. Für diejenigen, die nicht wissen, misst die Standardabweichung, wie unrund ein Datensatz ist, und kann mit der folgenden Formel berechnet werden:

stddev

Wenn .5wir beispielsweise unsere frühere Liste und einen Maximalwert von verwenden , erhalten wir 8Iterationen, die wie folgt aussehen:

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

und ende mit einem stdev von 0.40872556490459366. Sie geben gerade aus 8.

Aber da ist ein Fang:

Die Antwort muss nicht nicht negativ sein! Wenn die anfängliche Liste bereits die maximale stddev erfüllt, müssen Sie sehen, wie viele Iterationen Sie "zurückgehen" und den gleitenden Durchschnitt rückgängig machen können und die Liste weiterhin die maximale stddev erfüllt. Da wir die Fenster für die anfänglichen nDatenpunkte kürzen und diese nicht löschen, sind genügend Daten vorhanden, um einen gleitenden Durchschnitt umzukehren.

Wenn wir zum Beispiel mit der Liste beginnen [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](aus unserem vorherigen Beispiel mit 3 weiteren gleitenden Durchschnitten) und der gleichen Fenstergröße und max. Stddev, werden Sie ausgegeben, -3da Sie den gleitenden Durchschnitt höchstens umkehren können 3.

Jedes vernünftige E / A-Format ist in Ordnung.

Das ist also gewinnt der kürzeste Code in Bytes !

Testfälle

[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
quelle
Verwandte .
Türklinke

Antworten:

1

Wolfram - 236

Ziemlich klobig im Moment, aber zumindest funktioniert es.

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]]
Swish
quelle
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