由于种种原因,此处只讨论技术实现,业务场景自己想。
二次平滑其实已经能满足我们的业务场景,但是如果不考虑拐角的误差,而追求单一趋势中的更加精确的预测值,则可以考虑下当前的三次指数平滑算法。它是基于实际值/一次预测/二次预测的基础上进行的再次平滑,具有超灵敏的调整修正,超准确的预测,但是同时也拥有超过的拐角误差。
这还不是重头戏,重头戏是三次指数平滑,它能够更好处理具有周期性和季节性,甚至周期性+单一趋势的复杂混合型的数据模型预测,它必须建立在一次和二次的基础上进行三次平滑计算,计算量会较大。
直接看公式:
直接上代码吧:
@PostMapping("/tripleExponentialSmoothingMethod")
@ApiOperation("三次指数平滑法")
public String tripleExponentialSmoothingMethod(@RequestBody TripleSmoothingEntity tripleSmoothingEntity){
List<Double> realParamList = tripleSmoothingEntity.getRealDataList();
Double lastSinglePredictParam = tripleSmoothingEntity.getLastSinglePredictParam();
Double lastSecondPredictParam = tripleSmoothingEntity.getLastSecondPredictParam();
Double lastTriplePredictParam = tripleSmoothingEntity.getLastTriplePredictParam();
int totalTimes = realParamList.size();
Double resizeSecondPredict = tripleSmoothingEntity.getLastSecondPredictParam();
Double resizeTriplePredict = tripleSmoothingEntity.getLastTriplePredictParam();
int predictTime = tripleSmoothingEntity.getPredictTime();
List<Double> singleGapList = new ArrayList<>();
List<Double> secondGapList = new ArrayList<>();
List<Double> tripleGapList = new ArrayList<>();
Map<Double,Double> singleGapMap = new HashMap<>();
Map<Double,Double> secondGapMap = new HashMap<>();
Map<Double,Double> tripleGapMap = new HashMap<>();
DecimalFormat decimalFormat = new DecimalFormat("#