指數平滑法


(轉)一次、二次、三次指數平滑計算思想及代碼

一般常用到的指數平滑法為一次指數平滑、二次指數平滑和三次指數平滑,高次指數平滑一般比較難見到,因此本文着重介紹了一次、二次和三次指數平滑的特點與不同。

一次指數平滑一般應用於直線型數據,且一次指數平滑具有滯后性,可以說明有明顯的時間性、季節性。

二次指數平滑一般也應用於直線型,但是效果會比一次指數平滑好很多,也就相當於加強版的一次指數平滑。

三次指數平滑可以應用於拋物線型的數據,因為數據在二次平滑過后還是具有斜率,那么可以繼續使用三次指數平滑。

初值:不管什么指數平滑都會有個初值,假如數據大於20項,那么初值就可以認定為第一個數據,或者利用下列公式計算也行;假如數據小於20項,則初始值為:

 

低於20項一般取3,大於20的看着取就行了。

 

指數平滑系數α的確定

(1)經驗判斷

1、當時間序列呈現較穩定的水平趨勢時,應選較小的α,一般可在0.05~0.20之間取值‘

2、當時間序列有波動,但長期趨勢變化不大時,可選稍大的α值,常在0.1~0.4之間取值;

3、當時間序列波動很大,長期趨勢變化幅度較大,呈現明顯且迅速的上升或下降趨勢時,宜選擇較大的α值,如可在0.6~0.8間選值。以使預測模型靈敏度高些,能迅速跟上數據的變化。

4、當時間序列數據是上升(或下降)的發展趨勢類型,α應取較大的值,在0.6~1之間。

 

 

一次指數平滑:

一次指數平滑需要滯后一期,給定平滑系數,那么一次指數平滑的計算公式為:

 

預測第期的數值則是上一期的實際值與預測值的加權平均,預測公式為:

 

二次指數平滑:

給定平滑系數,那么二次指數平滑的計算公式為:

 

預測未來期的值的計算公式為:

 

其中:

 

 

三次指數平滑:

 給定平滑系數,那么三次指數平滑的計算公式為:

 

預測未來期的值的計算公式為:

 

其中:

 

 

 

下面舉例說明,數據如下:

253993

275396.2

315229.5

356949.6

400158.2

442431.7

495102.9

570164.8

640993.1

704250.4

767455.4

781807.8

776332.3

794161.7

834177.7

931651.5

1028390

1114914

133

88

150

123

404

107

674

403

243

257

900

1043

1156

895

1200

1038

1024

1283

引入均方誤差概念來判斷平滑系數是否准確:

 

要使最小則構成了一個關於的函數,由此可以得到最優的平滑系數,這里可以引入線性規划的思想來求得最優解

一次指數平滑代碼:

        S1_1 = []
        for m in range(0, len(info_data_id)):
            S1_1_empty = []
            x = 0
            for n in range(0, 3):
                x = x + int(info_data_sales[m][n])
            x = x / 3
            S1_1_empty.append(x)
            S1_1.append(S1_1_empty)
        # print(S1_1)

        a = []  ##這是用來存放阿爾法的數組
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            v = input('請輸入第' + str(i + 1) + '組數據的a:')
            a.append(v)

        for i in range(0, len(info_data_sales)):
            MSE = 0
            for j in range(0, len(info_data_sales[i])):
                S1_1[i].append(
                    float(a[i]) * int(info_data_sales[i][j]) + (1 - float(a[i])) * int(S1_1[i][j]))  ##計算預估值
                MSE = (int(S1_1[i][j]) - int(info_data_sales[i][j])) ** 2 + MSE
                # print(info_data_sales[i][j], S1_1[i][j])
            MSE = (MSE ** (1 / 2)) / int(len(info_data_sales[i]))  ##得到均方誤差
            info_MSE.append(MSE)
        # print(info_MSE)
        # print(S1_1)
        for i in range(0, len(S1_1)):
            print('' + str(i + 1) + '組的一次平滑預估值為:' + str(S1_1[i][len(S1_1[i]) - 1]) + ';均方誤差為:' + str(info_MSE[i]))

二次指數平滑代碼:

        S2_1 = []
        S2_2 = []
        for m in range(0, len(info_data_id)):
            S2_1_empty = []
            x = 0
            for n in range(0, 3):
                x = x + float(info_data_sales[m][n])
            x = x / 3
            S2_1_empty.append(x)
            S2_1.append(S2_1_empty)
            S2_2.append(S2_1_empty)
        # print(S2_2)
        a = []  ##這是用來存放阿爾法的數組
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            v = float(input('請輸入第' + str(i + 1) + '組數據的a:'))
            a.append(v)

        ##下面是計算一次指數平滑的值
        S2_1_new1 = []
        for i in range(0, len(info_data_sales)):
            S2_1_new = [[]] * len(info_data_id)
            for j in range(0, len(info_data_sales[i])):
                if j == 0:
                    S2_1_new[i].append(
                        float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) * float(S2_1[i][j]))
                else:
                    S2_1_new[i].append(float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) * float(
                        S2_1_new[i][j - 1]))  ##計算一次指數的值
            S2_1_new1.append(S2_1_new[i])
        # print(S2_1_new1)
        # print(len(S2_1_new1[i]))

        ##下面是計算二次指數平滑的值
        S2_2_new1 = []
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            S2_2_new = [[]] * len(info_data_id)
            MSE = 0
            for j in range(0, len(info_data_sales[i])):
                if j == 0:
                    S2_2_new[i].append(float(a[i]) * float(S2_1_new1[i][j]) + (1 - float(a[i])) * float(S2_2[i][j]))
                else:
                    S2_2_new[i].append(float(a[i]) * float(S2_1_new1[i][j]) + (1 - float(a[i])) * float(
                        S2_2_new[i][j - 1]))  ##計算二次指數的值
                MSE = (int(S2_2_new[i][j]) - int(info_data_sales[i][j])) ** 2 + MSE
            MSE = (MSE ** (1 / 2)) / int(len(info_data_sales[i]))
            info_MSE.append(MSE)
            S2_2_new1.append(S2_2_new[i])
        # print(S2_2_new1)
        # print(len(S2_2_new1[i]))

        ##下面是計算At、Bt以及每個預估值Xt的值,直接計算預估值,不一一列舉Xt的值了
        u = input('你要預估多少期?')
        Xt = []
        for i in range(0, len(info_data_sales)):
            At = (float(S2_1_new1[i][len(S2_1_new1[i]) - 1]) * 2 - float(S2_2_new1[i][len(S2_2_new1[i]) - 1]))
            Bt = (float(a[i]) / (1 - float(a[i])) * (
            float(S2_1_new1[i][len(S2_1_new1[i]) - 1]) - float(S2_2_new1[i][len(S2_2_new1[i]) - 1])))
            Xt.append(At + Bt * int(u))
            print('' + str(i + 1) + '組的二次平滑預估值為:' + str(Xt[i]) + ';均方誤差為:' + str(info_MSE[i]))

 

三次指數平滑代碼

       S3_1 = []
        S3_2 = []
        S3_3 = []
        for m in range(0, len(info_data_id)):
            S3_1_empty = []
            x = 0
            for n in range(0, 3):
                x = x + float(info_data_sales[m][n])
            x = x / 3
            S3_1_empty.append(x)
            S3_1.append(S3_1_empty)
            S3_2.append(S3_1_empty)
            S3_3.append(S3_1_empty)
        # print(S3_1)
        a = []  ##這是用來存放阿爾法的數組
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            v = float(input('請輸入第' + str(i + 1) + '組數據的a:'))
            a.append(v)

        ##下面是計算一次指數平滑的值
        S3_1_new1 = []
        for i in range(0, len(info_data_sales)):
            S3_1_new = [[]] * len(info_data_id)
            for j in range(0, len(info_data_sales[i])):
                if j == 0:
                    S3_1_new[i].append(
                        float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) * float(S3_1[i][j]))
                else:
                    S3_1_new[i].append(float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) * float(
                        S3_1_new[i][j - 1]))  ##計算一次指數的值
            S3_1_new1.append(S3_1_new[i])

        ##下面是計算二次指數平滑的值
        S3_2_new1 = []
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            S3_2_new = [[]] * len(info_data_id)
            for j in range(0, len(info_data_sales[i])):
                if j == 0:
                    S3_2_new[i].append(float(a[i]) * float(S3_1_new1[i][j]) + (1 - float(a[i])) * float(S3_2[i][j]))
                else:
                    S3_2_new[i].append(float(a[i]) * float(S3_1_new1[i][j]) + (1 - float(a[i])) * float(
                        S3_2_new[i][j - 1]))  ##計算二次指數的值
            S3_2_new1.append(S3_2_new[i])

        ##下面是計算二次指數平滑的值
        S3_3_new1 = []
        info_MSE = []  ##計算均方誤差來得到最優的a(阿爾法)
        for i in range(0, len(info_data_sales)):
            S3_3_new = [[]] * len(info_data_id)
            MSE = 0
            for j in range(0, len(info_data_sales[i])):
                if j == 0:
                    S3_3_new[i].append(float(a[i]) * float(S3_2_new1[i][j]) + (1 - float(a[i])) * float(S3_3[i][j]))
                else:
                    S3_3_new[i].append(float(a[i]) * float(S3_2_new1[i][j]) + (1 - float(a[i])) * float(
                        S3_3_new[i][j - 1]))  ##計算三次指數的值
                MSE = (int(S3_3_new[i][j]) - int(info_data_sales[i][j])) ** 2 + MSE
            MSE = (MSE ** (1 / 2)) / int(len(info_data_sales[i]))
            info_MSE.append(MSE)
            S3_3_new1.append(S3_3_new[i])
            # print(S3_3_new1)

        ##下面是計算At、Bt、Ct以及每個預估值Xt的值,直接計算預估值,不一一列舉Xt的值了
        u = input('你要預估多少期?')
        Xt = []
        for i in range(0, len(info_data_sales)):
            At = (
            float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) * 3 - float(S3_2_new1[i][len(S3_2_new1[i]) - 1]) * 3 + float(
                S3_3_new1[i][len(S3_3_new1[i]) - 1]))
            Bt = ((float(a[i]) / (2 * ((1 - float(a[i])) ** 2))) * ((6 - 5 * float(a[i])) * (
            float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) - 2 * (5 - 4 * float(a[i])) * float(
                S3_2_new1[i][len(S3_2_new1[i]) - 1]) + (4 - 3 * float(a[i])) * float(
                S3_3_new1[i][len(S3_3_new1[i]) - 1]))))
            Ct = (((float(a[i])) ** 2) / (2 * ((1 - float(a[i])) ** 2))) * (
            float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) - float(S3_2_new1[i][len(S3_2_new1[i]) - 1])*2 + float(
                S3_3_new1[i][len(S3_3_new1[i]) - 1]))
            Xt.append(At + Bt * int(u) + Ct * (int(u) ** 2))
            print('' + str(i + 1) + '組的三次平滑預估值為:' + str(Xt[i]) + ';均方誤差為:' + str(info_MSE[i]))

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM