我正在尝试复制一些公式但是在将数学转换为代码时遇到问题。
这是简单的指数移动平均线
在c#中:
out[1] = values[1];
for (i in 2:N(X)) {
tmp = (times[i] - times[i-1]) / tau;
w = exp(-tmp);
w2 = (1 - w) / tmp;
out[i] = out[i-1] * w + values[i] * (1 - w2) + values[i-1] * (w2 - w);
}
在Python中:
mu = numpy.exp ((ts[1] - ts[0]) / self.tau)
nu = 1.0 - mu
return numpy.array ([
mu * el + nu * arr[0] for el, arr in zip (last, arrays)
])
我希望能够指定不同的内核,并且不确定如何处理它,如下所述: 这一切都完成了,所以我最终可以重新创建这里给出的移动差异:
感谢您给予的任何帮助
答案 0 :(得分:1)
这里可能的一种方法是使用一个返回内核的方法。
从我能够看到的情况来看,此方法的输入为kerneltype
,i
和otherInputs
。
一个简单的方法是:
for(int i = 1; i < values.length(); i++)
{
tmp = (times[i] - times[i-1]) / tau;
//w = exp(-tmp);
//w2 = (1 - w) / tmp;
List<Object> kernelInputsInital = new List<Object>();
kernelInputsInitial.Add(tmp); //takes in the first argument
kernelInputsInitial.Add(true); //expected to calculate the first
w = GetKernel(KernelType.Exponential, i, kernelInputsInitial);
List<Object> kernelInputsSecondTerm = new List<Object>();
kernelInputsSecondTerm.Add(w); //takes in the first argument
kernelInputsSecondTerm.Add(false); //expected to calculate the first
w2 = GetKernel(KernelType.Exponential, i, kernelInputsInitial);
out[i] = out[i-1] * w + values[i] * (1 - w2) + values[i-1] * (w2 - w);
....
}
这当然非常糟糕,非常粗糙,并且可以进行改进很多,但它只是为了解决这个问题。
我会使用一个接口来表示内核,并为每个内核派生类。根据我的经验,这产生了足够可读和可维护的代码,但总有改进的余地。