Java实现二次指数平滑算法进行数据预测(纯手写不易,转载留眼)

本文探讨了Java中二次指数平滑算法的实现,通过实例展示其在数据预测上的准确性,相较于一次平滑预测,二次平滑能够更精准地捕捉数据趋势并及时修正预测误差。适用于数据量大、趋势明显变化的场景。
摘要由CSDN通过智能技术生成

业务场景自己想,这里只讨论技术实现。

这篇基于上一篇一次指数平滑的实现进行的升级版本,不再赘述概念性问题。
直接看公式:

在这里插入图片描述

上代码:

@PostMapping("/secondExponentialSmoothingMethod")
    public String secondExponentialSmoothingMethod(@RequestBody SecondSmoothingEntity secondSmoothingEntity){
   
        /** 二次指数平滑公式:
         * St2 = a * S`t(一次平滑得到的预估值) + (1-a) * S2t-1 (上一次的二次平滑预估值)
         * At = 2 * St1 - St2
         * Bt = a / 1-a * (St1 - St2)
         * ^Yt+T (T为将来预测期数)= At + Bt * T
        **/
        // (1)获取实际观察值列表和最后一次的预测值(存在即合理原则 ---汉涛)
        List<Double> realParamList = secondSmoothingEntity.getRealDataList();
        Double lastSinglePredictParam = secondSmoothingEntity.getLastSinglePredictParam();
        Double lastSecondPredictParam = secondSmoothingEntity.getLastSecondPredictParam();
        // 用于复位的
        Double resizeSecondPredict = secondSmoothingEntity.getLastSecondPredictParam();
        int predictTime = secondSmoothingEntity.getPredictTime();
        // 定义结果集合类
        List<Double> singleGapList = new ArrayList<>();
        List<Double> secondGapList = new ArrayList<>();
        Map<Double,Double> singleGapMap = new HashMap<>();
        Map<Double,Double> secondGapMap = new HashMap<>();
      
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是二次指数平滑法预测值的Java代码,希望能对你有所帮助: ```java public class DoubleExponentialSmoothing { private double alpha; private double beta; private double[] data; private int seasonLength; public DoubleExponentialSmoothing(double alpha, double beta, double[] data, int seasonLength) { this.alpha = alpha; this.beta = beta; this.data = data; this.seasonLength = seasonLength; } public double[] forecast(int numForecasts) { double[] smoothed = new double[data.length]; double[] level = new double[data.length]; double[] trend = new double[data.length]; double[] seasonal = new double[data.length]; double[] forecast = new double[data.length + numForecasts]; // Initialize level and trend level[0] = data[0]; trend[0] = initialTrend(); // First seasonal index is the average of the first season seasonal[0] = initialSeasonalIndex(); // Calculate the smoothed data, level, trend, and seasonal indices for (int i = 1; i < data.length; i++) { smoothed[i] = level[i - 1] + trend[i - 1]; level[i] = alpha * data[i] + (1 - alpha) * (level[i - 1] + trend[i - 1]); trend[i] = beta * (level[i] - level[i - 1]) + (1 - beta) * trend[i - 1]; seasonal[i] = gamma() * (data[i] - level[i]) + (1 - gamma()) * seasonal[i - seasonLength]; } // Use the smoothed data, level, trend, and seasonal indices to make forecasts forecast[0] = data[0]; for (int i = 1; i < forecast.length; i++) { if (i < data.length) { forecast[i] = smoothed[i]; } else { int m = i - data.length + 1; forecast[i] = level[data.length - 1] + m * trend[data.length - 1] + seasonal[i - seasonLength * (m / seasonLength)]; } } return forecast; } private double initialTrend() { double sum = 0; for (int i = 0; i < seasonLength; i++) { sum += (data[seasonLength + i] - data[i]); } return sum / (seasonLength * seasonLength); } private double initialSeasonalIndex() { double[] seasonAverages = new double[seasonLength]; double[] deviations = new double[data.length]; double sum = 0; // Calculate season averages for (int i = 0; i < seasonLength; i++) { int seasonCount = 0; for (int j = i; j < data.length; j += seasonLength) { seasonAverages[i] += data[j]; seasonCount++; } seasonAverages[i] /= seasonCount; } // Calculate deviations from season averages for (int i = 0; i < data.length; i++) { deviations[i] = data[i] / seasonAverages[i % seasonLength]; sum += deviations[i]; } return sum / data.length; } private double gamma() { return 1 - alpha - beta; } } ``` 使用方法如下: ```java double[] data = {10, 12, 13, 12, 10, 12, 12, 14, 16, 18, 17, 15, 13, 15, 16, 18}; DoubleExponentialSmoothing des = new DoubleExponentialSmoothing(0.5, 0.1, data, 4); double[] forecast = des.forecast(4); System.out.println(Arrays.toString(forecast)); ``` 其中,`data` 是时序数据,`alpha` 是平滑系数,`beta` 是趋势系数,`seasonLength` 是季节周期,`forecast` 是预测值数组,`des.forecast(4)` 表示预测 4 个值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值