Yinelenen Hareketli Ortalama


13

Bir listemiz varsa, listeyi söyleyin, [9, 2, 4, 4, 5, 5, 7]onun üzerinde hareketli bir ortalama yapabiliriz.

3 elemanlı bir pencere alarak, her bir elemanın yerini aşağıdaki gibi bir pencere alır: [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]ve sonra ortalamaları alırız [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667].

Şimdiye kadar oldukça basit. Ancak bu konuda fark edebileceğiniz bir şey, hareketli bir ortalama almanın listeyi "düzleştirdiği" dir. Bu şu soruyu akla getiriyor: listeyi "yeterince pürüzsüz" hale getirmek için kaç kez hareketli bir ortalama almak zorunda?

Senin görevin

Bir float listesi, bir tamsayı pencere boyutu ve bir float göz önüne alındığında, standart sapmayı o floattan daha az elde etmek için kaç kez hareketli ortalamayı almak zorunda olduğu çıktısı verilir. Bilmeyenler için standart sapma, bir veri kümesinin pürüzsüzlüğünü ölçer ve aşağıdaki formülle hesaplanabilir:

stddev

Örneğin, önceki listemizi ve maksimum stddev'ini kullanarak .5, aşağıdaki 8gibi yinelemeler elde ederiz:

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

ve stdev ile biter 0.40872556490459366. Sadece çıktınız 8.

Ama bir sorun var:

Cevabın negatif olması gerekmez! İlk liste zaten maksimum stddev'i karşılıyorsa, kaç tane yineleme "geriye gidebileceğinizi" ve hareketli ortalamayı geri alabileceğinizi görmeniz ve yine de listenin max stddev'i tatmin etmesini sağlamanız gerekir. İlk nveri noktaları için pencereleri kesip bunları düşürmediğimiz için, hareketli bir ortalamayı tersine çevirmek için yeterli veri var.

Örneğin, listeyle [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](daha önceki 3 örneğimizden daha fazla hareketli ortalama yapılırken alınır) ve aynı pencere boyutu ve max stddev ile başlarsak, -3hareketli ortalamayı çoğu 3zaman tersine çevirebileceğiniz için çıktı alırsınız .

Makul I / O formatı iyidir.

Bu bayt en kısa kodu kazanır!

Test Durumları

[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


Yanıtlar:


1

Volfram - 236

Şu anda oldukça hantal ama en azından işe yarıyor.

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]]
Hesap MakinesiFeline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.