演算法簡介
與平滑指數法,移動平均法一樣,自適應過濾法也是一種預測時間序列的方法,但相較于前兩者,自適應過濾法有著可以對引數進行調整的優點,他可以根據前若干個資料,來不斷地嘗試算出與后一個數相同的結果,故相對與平滑指數法以及移動平均法,可以更好地對時間序列進行擬合,此外,自適應過濾法思路簡單,所以相對容易實作,可以在資料比較平穩的情況下使用,
本文將以上海財經大學出版社《統計預測和決策》中的【例6-1】為例,對該演算法進行講解,
演算法思路
該演算法首先需要構造線性的預測模型,之后確定權重個數以及權重初始值,并根據權重及線性預測模型計算預測值,并計算該預測值與真實值間的誤差,之后再根據誤差,前p個值組成的向量及他們所構成的迭代函式來對權重進行調整,知道第p個值為0.
引數確定
首先,我們假設有一組時間序列為
x
0
,
x
1
,
x
2
,
.
.
.
,
x
t
x_{0},x_{1},x_{2},...,x_{t}
x0?,x1?,x2?,...,xt?
之后,我們確定權重個數p(p<t),在本例中,p取2,然后,我們通過權重個數以及時間序列的前p大的資料來確定學習函式:
k
=
1
[
∑
i
=
0
p
?
1
x
^
i
2
]
m
a
x
k=\frac{1}{[\sum^{p-1}_{i=0}\hat{x}^2_i]_{max}}
k=[∑i=0p?1?x^i2?]max?1?
在這里,我們需要對原始時間序列進行一個排序,然后取最大的p個值,
然后,我們設權重向量為 ? \boldsymbol{\phi} ?,其每一個元素的初始值為 1 p \frac{1}{p} p1?,在本例中,權重向量為 [ 0.5 , 0.5 ] [0.5,0.5] [0.5,0.5]
構建預測模型
我們將權重與對應前p個未知數相乘,得到預測模型: x p = ∑ i = 0 p ? 1 ? i x i x_{p}=\sum^{p-1}_{i=0}\phi_{i}x_{i} xp?=i=0∑p?1??i?xi?在本例中,其預測模型為 x ^ 2 = 0.5 x 0 + 0.5 x 1 \hat{x}_{2}=0.5x_{0}+0.5x_{1} x^2?=0.5x0?+0.5x1?
損失函式
在這里,我們將損失函式定義為時間序列的第p個值,既
p
t
p_{t}
pt?,減去預測值
e
p
=
x
p
?
x
^
p
e_{p}=x_{p}-\hat{x}_{p}
ep?=xp??x^p?
當然,你也可以使用MSE(標準均方誤差)為損失函式
迭代條件
當 e p e_{p} ep?小于設定閾值(本例選擇0.001,當然也可以不設定,即閾值為0)當前迭代次數epoch小于最大迭代數max_epoch(這里選擇為100)時,進行迭代運算,
調整后的第i個權重為: ? i ′ = ? i + 2 k e p x p ? i \phi^{'}_{i}=\phi_{i}+2ke_{p}x_{p-i} ?i′?=?i?+2kep?xp?i?
程式代碼
"""
Created on Thu Oct 27 13:55:00 2021
@author: Joseph.chunfai.Lai
上海財經大學出版社 《統計預測與決策(第五版)》 例6-1
"""
'''引入相關的庫'''
import numpy as np
class AFM:
def __init__(self, Data, P=2):
self.Data = Data
self.Data_sort = np.sort(Data)[::-1]
self.P = P # 權重數
self.K = K = 1 / np.sum((self.Data_sort[0] ** 2, self.Data_sort[1] ** 2)) # 學習係數/學習率
self.threshold = 0.001 # 損失函數閾值
self.Max_epoch = 100 # 最大迭代次數
phi = []
# 初始參數
for i in range(2):
phi.append(1 / self.P)
self.phi = np.array(phi)
def Error(self, x_predict, x_target):
return x_target - x_predict
def Cal_weight(self):
iter_epoch = 0
X_predict = np.dot(self.phi, self.Data[0:2])
# print(X_predict)
error = self.Error(X_predict, self.Data[self.P])
# print(error)
# print(Data[0:2][::-1])
# 開始迭代
while (np.abs(error) > self.threshold) and (iter_epoch < self.Max_epoch): # 終止條件為誤差小於設定閾值或大於等於最大迭代次數,根據De
# Morgen定律 ,執行條件為誤差大於閾值且當前迭代次數小於最大迭代次數
x_predict = np.dot(self.phi, self.Data[0:2]) # 計算預測值
error = self.Error(x_predict, self.Data[self.P]) # 計算誤差
self.phi = self.phi + 2 * self.K * error * self.Data[0:self.P][::-1]
iter_epoch = iter_epoch + 1
print('第{}輪迭代,誤差為{:.2f}'.format(iter_epoch, error))
print('算得調整後的權重為: \n', self.phi)
return self.phi
if __name__ == "__main__":
Data = np.array([43, 45, 48, 50, 53])
Phi = AFM(Data, P=2).Cal_weight()
print('Success!')
參考資料
[1]:徐國祥.統計預測和決策(第五版).上海財經大學出版社
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340641.html
標籤:AI
