.java 指数平滑_转载:二次指数平滑法求预测值的Java代码
时间: 2024-03-14 15:47:17 浏览: 18
好的,以下是二次指数平滑法求预测值的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 个值。