内容简介:本文主要研究一下Elasticsearch的ExponentiallyWeightedMovingAverageelasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/ExponentiallyWeightedMovingAverage.javaelasticsearch-7.0.1/server/src/test/java/org/elasticsearch/common/ExponentiallyWeightedMovingAv
序
本文主要研究一下Elasticsearch的ExponentiallyWeightedMovingAverage
ExponentiallyWeightedMovingAverage
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/ExponentiallyWeightedMovingAverage.java
public class ExponentiallyWeightedMovingAverage { private final double alpha; private final AtomicLong averageBits; /** * Create a new EWMA with a given {@code alpha} and {@code initialAvg}. A smaller alpha means * that new data points will have less weight, where a high alpha means older data points will * have a lower influence. */ public ExponentiallyWeightedMovingAverage(double alpha, double initialAvg) { if (alpha < 0 || alpha > 1) { throw new IllegalArgumentException("alpha must be greater or equal to 0 and less than or equal to 1"); } this.alpha = alpha; this.averageBits = new AtomicLong(Double.doubleToLongBits(initialAvg)); } public double getAverage() { return Double.longBitsToDouble(this.averageBits.get()); } public void addValue(double newValue) { boolean successful = false; do { final long currentBits = this.averageBits.get(); final double currentAvg = getAverage(); final double newAvg = (alpha * newValue) + ((1 - alpha) * currentAvg); final long newBits = Double.doubleToLongBits(newAvg); successful = averageBits.compareAndSet(currentBits, newBits); } while (successful == false); } }
(alpha * newValue) + ((1 - alpha) * currentAvg)
实例
elasticsearch-7.0.1/server/src/test/java/org/elasticsearch/common/ExponentiallyWeightedMovingAverageTests.java
public class ExponentiallyWeightedMovingAverageTests extends ESTestCase { public void testEWMA() { final ExponentiallyWeightedMovingAverage ewma = new ExponentiallyWeightedMovingAverage(0.5, 10); ewma.addValue(12); assertThat(ewma.getAverage(), equalTo(11.0)); ewma.addValue(10); ewma.addValue(15); ewma.addValue(13); assertThat(ewma.getAverage(), equalTo(12.875)); } public void testInvalidAlpha() { IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> new ExponentiallyWeightedMovingAverage(-0.5, 10)); assertThat(ex.getMessage(), equalTo("alpha must be greater or equal to 0 and less than or equal to 1")); ex = expectThrows(IllegalArgumentException.class, () -> new ExponentiallyWeightedMovingAverage(1.5, 10)); assertThat(ex.getMessage(), equalTo("alpha must be greater or equal to 0 and less than or equal to 1")); } public void testConvergingToValue() { final ExponentiallyWeightedMovingAverage ewma = new ExponentiallyWeightedMovingAverage(0.5, 10000); for (int i = 0; i < 100000; i++) { ewma.addValue(1); } assertThat(ewma.getAverage(), lessThan(2.0)); } }
- testEWMA方法测试算法的计算逻辑;testInvalidAlpha测试alpha参数的校验;testConvergingToValue则测试ewma值的收敛
小结
(alpha * newValue) + ((1 - alpha) * currentAvg)
doc
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coming of Age in Second Life
Tom Boellstorff / Princeton University Press / 2008-04-21 / USD 29.95
The gap between the virtual and the physical, and its effect on the ideas of personhood and relationships, is the most interesting aspect of Boellstorff's analysis... Boellstorff's portrayal of a virt......一起来看看 《Coming of Age in Second Life》 这本书的介绍吧!