Скользящее среднее можно рассчитать с помощью мучной машины, где внутреннее состояние - это предыдущие значения.
Я покажу пример скользящего среднего по трем аргументам, вы можете поиграть, например. сделайте его параметризуемым по размеру.
Мили машина, по существу, начальное состояние, а «состояние + ввод» для функции «новое состояние + выход»:
Mealy i o ~ (s, s -> i -> (o, s))
Давайте предположим, что начальное состояние всех нулей, и написать функцию для скользящего среднего более 3.
type S = (Double, Double)
type I = Double
type O = Double
initialState :: S
initialState = (0, 0)
weight0, weight1, weight2 :: Double
weight0 = 0.25
weight1 = 0.5
weight2 = 0.25
ma :: S -> I -> (O, S)
ma (x0, x1) x2 = (o, s)
where
s = (x1, x2)
o = x0 * weight0 + x1 * weight1 + x2 * weight2
Теперь мы получили все части, давайте запустим машину на входе:
runMealy :: (S -> I -> (O, S)) -> S -> [I] -> [O]
runMealy _ _ [] = []
runMealy f s (x : xs) =
let (o, s') = f s x
in o : runMealy f s' xs
И попробовать:
λ *Main > runMealy ma initialState [1,2,3,4,5,6,7,8,9]
[0.25,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]
Вы можете оставить первый полученные значения, так как машина внутреннее состояние «разогрев».
Для произвольного размера скользящей средней машины, вы можете использовать Data.Sequence
, так как это намного лучше, структура данных, когда вы нажимаете на один конец, в то время как поп от другого, то один список, []
.
Почему я говорю о машине Мили? Потому что в какой-то момент вы, скорее всего, столкнетесь с ситуацией, когда вам нужно использовать некоторую поточную библиотеку в Haskell: pipes
, conduit
или machines
. Тогда машинный подход Мили станет единственным разумным решением.
Также вы можете сделать авторегрессивные модели!
Учитывая некоторую магию, я хотел бы пони. Но серьезно, это ужасно недоказано. Что такое 'x'? Что такое 'w' (возможно, вы имели в виду« вес »)? Является ли 'length w' always' 5'? Есть ли у вас эталонная реализация на другом языке? __Что вы пробовали? – Zeta
X - это входной массив, w - вес, y - результирующий массив. –
Учитывая, что мы находимся на языке без массивов, я предполагаю, что вы начинающий язык. В любом случае, дополнительная информация должна быть отредактирована в самом вопросе, так что другим пользователям не нужно удалять информацию из комментариев. У меня нет времени, чтобы дать полный ответ, но это должно быть осуществимо с помощью 'tails',' zipWith' и немного битмантирования границ. – Zeta