이동 평균은 밀리 머신으로 계산할 수 있습니다. 여기서 내부 상태는 이전 값입니다.
예를 들어 3 개 이상의 인수를 이동 평균으로 표시 할 수 있습니다. 크기가 매개 변수화되도록하십시오.
Mealy i o ~ (s, s -> i -> (o, s))
가의 초기 상태는 모두 0이라고 가정하자, 평균 이동 함수를 작성 :
반점이 기계는 "상태 + 입력", "새로운 상태 + 출력"기능은 본질적으로 초기 상태이며,
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
,369 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
을 통해 우리는 모든 조각,의 입력에 기계를 실행 할 수있어
그리고 그것을 시도 :
λ *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
를 사용할 수 평균 기계를 이동 크기를 서로 팝, 다음 단일 연결리스트, []
동안.
왜 Mealy 컴퓨터에 대해 이야기하고 있습니까? 어느 시점에서 하스켈에서 스트리밍 라이브러리를 사용해야하는 경우가 가장 많습니다 : pipes
, conduit
또는 machines
. 그런 다음 Mealy 시스템 접근 방식 만이 유일한 합리적인 솔루션입니다.
또한 자동 회귀 모델을 만들 수 있습니다!
일부 마술을 감안할 때, 나는 조랑말을 원합니다. 그러나 진지하게, 그것은 horrendously underspecified입니다. 'x' 란 무엇입니까? 'w'는 무엇입니까 (아마도'무게'를 의미합니까?)? '길이 w'는 항상 '5'입니까? 다른 언어로 참조 구현이 있습니까? __ 대체 뭘 먹었 니? – Zeta
X는 입력 배열, w는 가중치, y는 결과 배열입니다. –
우리는 배열이없는 언어를 사용하므로 언어 초보자라고 가정합니다. 어느 쪽이든, 추가 정보는 질문 자체에 포함되어야합니다. 다른 사용자는 주석에서 정보를 제거 할 필요가 없습니다. 나는 완전한 대답을 줄 시간이 없지만, 이것은 '꼬리 (tails)', 'zipWith (zipWith)'및 약간의 경계 동작을 통해 실현 가능해야합니다. – Zeta