Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java实现指数移动平均_Java_Math_Lowpass Filter - Fatal编程技术网

用Java实现指数移动平均

用Java实现指数移动平均,java,math,lowpass-filter,Java,Math,Lowpass Filter,我基本上有这样一个值数组: 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 我们的目标是获取这些值并对其应用一个算法,该算法将稍微“平滑”它们,

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

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

我们的目标是获取这些值并对其应用一个算法,该算法将稍微“平滑”它们,这样我就有了更多的线性值。(即:我希望我的结果是曲线,而不是jaggedy)

我被告知对我的值应用指数移动平均过滤器。我该怎么做?阅读数学方程式对我来说真的很难,我处理代码的能力要好得多

我如何处理数组中的值,应用指数移动平均计算来平衡它们

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

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

若你们在数学上有困难,你们可以用一个简单的移动平均值代替指数。所以你得到的输出是最后的x项除以x。未经测试的伪代码:

int data[] = getFilled();
int outdata[] = initializeme()
for (int y = 0; y < data.length; y++)
    int sum = 0;
    for (int x = y; x < y-5; x++)
        sum+=data[x];
    outdata[y] = sum / 5;
int data[]=getFilled();
int outdata[]=initializeme()
对于(int y=0;y
请注意,您将需要处理数据的开始和结束部分,因为很明显,当您处于第二个数据点时,您无法平均最后5个术语。此外,还有更有效的方法来计算移动平均线(总和=总和-最早+最新),但这是为了了解整个移动平均线发生了什么

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

使用所需的衰减参数实例化(可能需要调整;应介于0和1之间),然后使用
average(…)
进行筛选



当阅读关于数学循环的页面时,当将其转换为代码时,您真正需要知道的是数学家喜欢将索引写入带有下标的数组和序列中。(他们还有一些其他的符号,这没有帮助。)然而,EMA非常简单,因为你只需要记住一个旧值;不需要复杂的状态数组。

我很难理解您的问题,但无论如何我都会尽力回答

1) 如果您的算法发现0.25而不是0.36,那么它是错误的。它是错误的,因为它假设单调的增加或减少(即“总是上升”或“总是下降”)。除非你平均所有数据,否则你的数据点——当你呈现它们时——是非线性的。如果您确实想找到两个时间点之间的最大值,那么将数组从
t_min
切片到
t_max
并找到该子数组的最大值

2) 现在,“移动平均线”的概念非常简单:假设我有以下列表:[1.4,1.5,1.4,1.5,1.5]。我可以通过取两个数字的平均值来“平滑它”:[1.45,1.45,1.45,1.5]。请注意,第一个数字是1.5和1.4(第二个和第一个数字)的平均值;第二个(新名单)是1.4和1.5的平均值(第三个和第二个旧名单);第三个(新列表)的平均值为1.5和1.4(第四个和第三个),依此类推。我本可以让它成为“第三阶段”或“第四阶段”,或“n”。请注意,数据更加平滑。“看到移动平均线在起作用”的一个好方法是去谷歌金融,选择一只股票(试试特斯拉汽车公司;相当不稳定(TSLA)),然后点击图表底部的“技术指标”。选择给定时段的“移动平均线”和“指数移动平均线”来比较它们的差异

指数移动平均只是对这一点的另一种阐述,但“旧”数据的权重小于“新”数据;这是一种向背面“偏移”平滑的方法。请阅读维基百科条目

因此,这与其说是一个答案,不如说是一个评论,但这个小小的评论框实在太小了。祝你好运。

看一看。
如果你的噪声平均为零,也考虑使用A。p> 以滚动的方式。。。。我还使用commons.apache数学库

  public LinkedList EMA(int dperiods, double alpha)
                throws IOException {
            String line;
            int i = 0;
            DescriptiveStatistics stats = new SynchronizedDescriptiveStatistics();
            stats.setWindowSize(dperiods);
            File f = new File("");
            BufferedReader in = new BufferedReader(new FileReader(f));
            LinkedList<Double> ema1 = new LinkedList<Double>();
            // Compute some statistics
            while ((line = in.readLine()) != null) {
                double sum = 0;
                double den = 0;
                System.out.println("line: " + " " + line);
                stats.addValue(Double.parseDouble(line.trim()));
                i++;
                if (i > dperiods)
                    for (int j = 0; j < dperiods; j++) {
                        double var = Math.pow((1 - alpha), j);
                        den += var;
                        sum += stats.getElement(j) * var;
                        System.out.println("elements:"+stats.getElement(j));
                        System.out.println("sum:"+sum);
                    }
                else
                    for (int j = 0; j < i; j++) {
                        double var = Math.pow((1 - alpha), j);
                        den += var;
                        sum += stats.getElement(j) * var;
                    }
                ema1.add(sum / den);
                System.out.println("EMA: " + sum / den);
            }
            return ema1;
        }
公共链接列表EMA(整数周期,双alpha)
抛出IOException{
弦线;
int i=0;
DescriptiveStatistics=新的SynchronizedDescriptiveStatistics();
stats.setWindowsSize(dperiods);
文件f=新文件(“”);
BufferedReader in=新的BufferedReader(新文件读取器(f));
LinkedList ema1=新建LinkedList();
//计算一些统计数据
而((line=in.readLine())!=null){
双和=0;
双den=0;
System.out.println(“行:“+”+行);
stats.addValue(Double.parseDouble(line.trim());
i++;
如果(i>d周期)
对于(int j=0;j
公共类移动变量{
公共静态void main(字符串[]args){
双[]数组={1.2,3.4,4.5,4.5,4.5};
双St=0D;
  public LinkedList EMA(int dperiods, double alpha)
                throws IOException {
            String line;
            int i = 0;
            DescriptiveStatistics stats = new SynchronizedDescriptiveStatistics();
            stats.setWindowSize(dperiods);
            File f = new File("");
            BufferedReader in = new BufferedReader(new FileReader(f));
            LinkedList<Double> ema1 = new LinkedList<Double>();
            // Compute some statistics
            while ((line = in.readLine()) != null) {
                double sum = 0;
                double den = 0;
                System.out.println("line: " + " " + line);
                stats.addValue(Double.parseDouble(line.trim()));
                i++;
                if (i > dperiods)
                    for (int j = 0; j < dperiods; j++) {
                        double var = Math.pow((1 - alpha), j);
                        den += var;
                        sum += stats.getElement(j) * var;
                        System.out.println("elements:"+stats.getElement(j));
                        System.out.println("sum:"+sum);
                    }
                else
                    for (int j = 0; j < i; j++) {
                        double var = Math.pow((1 - alpha), j);
                        den += var;
                        sum += stats.getElement(j) * var;
                    }
                ema1.add(sum / den);
                System.out.println("EMA: " + sum / den);
            }
            return ema1;
        }
public class MovingAvarage {

public static void main(String[] args) {
    double[] array = {1.2, 3.4, 4.5, 4.5, 4.5};

    double St = 0D;
    for(int i=0; i<array.length; i++) {
        St = movingAvarage(St, array[i]);
    }
    System.out.println(St);

}

private static double movingAvarage(double St, double Yt) {
    double alpha = 0.01, oneMinusAlpha = 0.99;
    if(St <= 0D) {
        St = Yt;
    } else {
        St = alpha*Yt + oneMinusAlpha*St;
    }
    return St;
   }

}