数据平滑处理(自用)

public class Smooth {
    private static ArrayList<double[]> resultlist = new ArrayList<>();//平滑后集合
    public Smooth(ArrayList<double[]> resultlist) {
        this.resultlist = resultlist;
    }
    public static ArrayList<double[]> getResultlist() {
        return resultlist;
    }

    /* X = {n∧i} -M<=n<=M,0<=i<=N */
    public static RealMatrix getXMatrix(int n, int k) {//辅助矩阵 X矩阵,(2M+1)行(N+1)列
        int step = (n - 1) / 2;
        RealMatrix realMatrix = MatrixUtils.createRealMatrix(n, k-1 );
        for (int i = 0; i < realMatrix.getRowDimension(); i++) {
            for (int j = 0; j < k-1 ; j++) {
                realMatrix.setEntry(i, j, Math.pow(i - step, j));
            }
        }
        return realMatrix;
    }

    /* B = X*(XT*X)(-1)*XT */
    public static RealMatrix filterCoeff(int n,int k) {//B为滤波系数矩阵,由且仅由X矩阵决定,B矩阵为(2m+1)×(2m+1)阶矩阵, n=2m+1
        RealMatrix realMatrix = getXMatrix(n,k);
        RealMatrix B = realMatrix.multiply(inverse(realMatrix.transpose().
                multiply(realMatrix))).multiply(realMatrix.transpose());
        return B;
    }
    /* s = B*Y
    步骤:1.判断是否为n是否为合法(为奇数),不合法即跳出
         2.将数据进行处理
         3.判断窗口是否在两端,若为两端,拟合结果为平滑结果;若不在两端,仅取中间点作为拟合数据
         4.输出
    *  s 平滑后列矩阵
    *  Y 待平滑列矩阵*/
    public static Smooth SGResult(int n, int k, ArrayList<double[]> testlist){//resultlist为平滑后集合
        ArrayList<double[]> resultlist = new ArrayList<double[]>();
        for (int i = 1; i < testlist.get(1).length; i++){//列,数据类数
            for (int j = (n-1/2)-1; j < testlist.size()-n; j++){//行,数据数
                for (int m = j; m <= j+n; m++){//窗口
                    double[][]y = new double[n][1];
                    for (int count = 0;count < n;count++){
                        y[count][0] = testlist.get(m)[i];
                    }
                    RealMatrix Y = new Array2DRowRealMatrix(y);
                    RealMatrix B = filterCoeff(n,k);
                    RealMatrix S = B.multiply(Y);//B和Y相乘
                    testlist.get(j)[i]=S.getEntry((n-1)/2,0);
                    for (int a = 0; a < (n-1)/2; a++){
                        testlist.get(a)[i]=S.getEntry(a,0);
                    }
                    for (int a = testlist.size()-1-((n-1)/2); a < testlist.size() ; a++){
                         for (int b = (n-1)/2; b < n;b++){
                                        testlist.get(testlist.size()-1-((n-1)/2))[i]=S.getEntry(b,0);
                         }
                    }
                }
            }
        }
        resultlist = testlist;
        return new Smooth(resultlist);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
指数平滑法的计算中,关键是α的取值大小,但α的取值又容易受主观影响,因此合理确定α的取值方法十分重要,一般来说,如果数据波动较大,α值应取大一些,可以增加近期数据对预测结果的影响。如果数据波动平稳,α值应取小一些。理论界一般认为有以下方法可供选择:    经验判断法。这种方法主要依赖于时间序列的发展趋势和预测者的经验做出判断。   1、当时间序列呈现较稳定的水平趋势时,应选较小的α值,一般可在0.05~0.20之间取值;   2、当时间序列有波动,但长期趋势变化不大时,可选稍大的α值,常在0.1~0.4之间取值;   3、当时间序列波动很大,长期趋势变化幅度较大,呈现明显且迅速的上升或下降趋势时,宜选择较大的α值,如可在0.6~0.8间选值,以使预测模型灵敏度高些,能迅速跟上数据的变化;   4、当时间序列数据是上升(或下降)的发展趋势类型,α应取较大的值,在0.6~1之间。   试算法。根据具体时间序列情况,参照经验判断法,来大致确定额定的取值范围,然后取几个α值进行试算,比较不同α值下的预测标准误差,选取预测标准误差最小的α。   在实际应用中预测者应结合对预测对象的变化规律做出定性判断且计算预测误差,并要考虑到预测灵敏度和预测精度是相互矛盾的,必须给予二者一定的考虑,采用折中的α值。 下期预测数=本期实际数×平滑系数+本期预测数×(1-平滑系数) 如某种产品销售量的平滑系数为0.4,1996年实际销售量为31万件,预测销售量为33万件。则1997年的预测销售量为: 1997年预测销售量= 31万件×0.4+33万件×(1-0.4)=32.2万件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值