当前位置: 首页 > 面试题库 >

在Java中实现指数移动平均

窦英武
2023-03-14
问题内容

我基本上有一个像这样的值数组:

0.25, 0.24, 0.27, 0.26, 0.29, 0.34, 0.32, 0.36, 0.32, 0.28, 0.25, 0.24, 0.25

上面的数组过于简化,我在实际代码中每毫秒收集1个值,我需要使用编写的算法处理输出,以找到某个时间点之前最接近的峰值。我的逻辑失败了,因为在上面的示例中,0.36它是真正的峰值,但是我的算法会向后看,并看到最后一个数字0.25是峰值,因为之前的数值减少了0.24

目标是获取这些值,并对它们应用一种算法,该算法将使它们“平滑”一些,以便获得更多的线性值。(即:我希望自己的成绩是弯曲的,而不是参差不齐)

有人告诉我对我的值应用指数移动平均滤波器。我怎样才能做到这一点?我真的很难读数学方程式,我对代码的处理要好得多。

如何处理数组中的值,应用指数移动平均值计算使它们均匀?

float[] mydata = ...
mySmoothedData = exponentialMovingAverage(mydata, 0.5);

float[] exponentialMovingAverage(float[] input, float alpha) {
    // what do I do here?
    return result;
}

问题答案:

要计算指数移动平均值,您需要保持一些状态,并且需要一个调整参数。这需要一个小类(假设您使用的是Java
5或更高版本):

class ExponentialMovingAverage {
    private double alpha;
    private Double oldValue;
    public ExponentialMovingAverage(double alpha) {
        this.alpha = alpha;
    }

    public double average(double value) {
        if (oldValue == null) {
            oldValue = value;
            return value;
        }
        double newValue = oldValue + alpha * (value - oldValue);
        oldValue = newValue;
        return newValue;
    }
}

用所需的衰减参数实例化(可能需要调整;应在0到1之间),然后用于average(…)过滤。

在阅读有关数学递归的页面时,将其转换为代码时,您真正需要知道的只是数学家喜欢将索引写入带有下标的数组和序列中。(它们还有其他一些表示法,这无济于事。)但是,EMA非常简单,因为您只需要记住一个旧的值即可。不需要复杂的状态数组。



 类似资料:
  • 我正在开发一个小型交易机器人作为练习。他日复一日地接收股票价格(表示为迭代)。 这是我的类的样子: 正如您从我的最后两个属性中所看到的,我希望实现指数移动平均值,作为趋势跟踪算法的一部分。 但我想我不太明白如何实施它;这是我的calcEMA函数,它只计算EMA: 但是当我的股票价值(在文件中传递)是这样的: 以确保我的均线是有意义的,嗯...它没有! 我在手术中哪里出错了? 另外,如果这是我第一次

  • 问题内容: 我有一个日期范围,并且每个日期都有一个度量值。我想计算每个日期的指数移动平均值。有人知道怎么做这个吗? 我是python的新手。似乎没有将平均值内置到标准python库中,这让我感到有些奇怪。也许我找的地方不对。 因此,给定以下代码,如何计算日历日期的IQ点的移动加权平均值? (可能是一种更好的数据结构方式,任何建议将不胜感激) 问题答案: 编辑:看来SciKits(补充SciPy的附

  • 我也看过Pyspark中的加权移动平均线,但我需要一个Spark/Scala的方法,以及10天或30天的均线。 有什么想法吗?

  • 公式链接:https://sciencing.com/calculate-exponential-moving-averages-8221813.html

  • 我正在尝试检索大型数据集(15000个值)的最后一个EMA。这是一个非常消耗资源的算法,因为每个值都依赖于前一个值。这是我的代码: 我已经做了什么: 隔离$k,因此不会计算10000次 仅保留最新计算的EMA,而不是将所有EMA都保留在一个数组中 使用for()而不是foreach() $data[]数组没有键;这是一个基本阵列 这使我能够将15000个值的执行时间从2000ms减少到500ms左