Ітераційне рухоме середнє


13

Якщо у нас є список, скажімо, список [9, 2, 4, 4, 5, 5, 7], ми можемо здійснити ковзну середню по ньому.

Взявши вікно, скажімо, 3 елемента, кожен елемент замінюється вікном на кшталт такого: [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]і, приймаючи середні значення, ми отримуємо [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667].

Досить простий поки що. Але одне, що ви можете помітити з цього приводу, це те, що отримання ковзної середньої "згладжує" список. Отже, тут виникає питання: скільки разів потрібно брати ковзну середню, щоб зробити список "досить гладким"?

Ваше завдання

Враховуючи список поплавків, цілий розмір вікна та поплавок, виведіть, скільки разів потрібно взяти ковзну середню, щоб отримати стандартне відхилення менше, ніж цей поплавок. Для тих, хто не знає, стандартне відхилення вимірює, наскільки негладкий набір даних і може бути обчислений за такою формулою:

stddev

Наприклад, використовуючи наш попередній список і max stddev .5, ми отримуємо 8ітерації, які виглядають приблизно так:

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

і закінчуємо stdev від 0.40872556490459366. Ви просто виходите 8.

Але є улов:

Відповідь не повинна бути негативною! Якщо початковий список вже задовольняє максимальний stddev, ви повинні побачити, скільки ітерацій ви можете "повернути назад" та скасувати ковзаючу середню величину, і все ж список має задовольняти максимальний stddev. Оскільки ми обрізаємо вікна для початкових nточок даних і не скидаємо їх, є достатньо даних, щоб повернути ковзну середню.

Наприклад, якщо ми почнемо зі списком [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](взято з нашого попереднього прикладу з 3 більш ковзають середніх , зроблених до нього) і того ж розміру вікна і макс STDDEV, ви вихідний , -3тому що ви можете звернути ковзне середнє в більшості 3раз.

Будь-який розумний формат вводу-виводу є нормальним.

Це тому найкоротший код у байтах виграє!

Випробування

[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


Відповіді:


1

Вольфрам - 236

Зараз досить незграбно, але принаймні це працює.

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 байт,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]]
КалькуляторFeline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.