gpt4 book ai didi

arrays - Haskell 中的移动平均线

转载 作者:行者123 更新时间:2023-12-04 22:57:04 25 4
gpt4 key购买 nike

给定一个权重列表:

let weights = [0.1, 0.2, 0.4, 0.2, 0.1]

和一系列测量值,我想实现加权平均值。

这就是我在 Python 中的做法:

y=[]
w = length(weights)
for n in range(w,len(x)-w):
y[n-w/2-1]=sum([a*b for a,b in zip(weights,x[n-w/2:n+w/2+1])])
#y[n-3]=W[1]*x[n-2]+W[2]*x[n-1]+W[3]*x[n]+W[4]*x[n+1]+W[5]*x[n+2]

我知道 Haskell 没有数组,我想要实现的是 low-pass-filter ,我可以在其中手动定义权重。

最佳答案

移动平均线可以用粉状机器计算,其中内部状态是以前的值。

我将展示三个参数的移动平均值示例,您可以自己摆弄例如使其大小参数化。

Mealy 机本质上是一个初始状态,以及“状态+输入”到“新状态+输出”的功能:

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 ,因为当你推到一端时它的数据结构要好得多,而从另一端弹出,然后是单链表, [] .

为什么我在谈论 Mealy 机器?因为在某些时候你很可能会遇到需要在 Haskell 中使用一些流库的情况: pipes , conduitmachines .那么 Mealy 机器方法将是唯一合理的解决方案。

您也可以制作自回归模型!

关于arrays - Haskell 中的移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40448260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com