1. 程式人生 > >二次指數平滑法 C++

二次指數平滑法 C++

二次指數平滑法(Second exponential smoothing method)

點選開啟連結

二次指數平滑法是對一次指數平滑值作再一次指數平滑的方法。它不能單獨地進行預測,必須與一次指數平滑法配合,建立預測的數學模型,然後運用數學模型確定預測值。一次移動平均法的兩個限制因素線上性二次移動平均法中也才存在,線性二次指數,平滑法只利用三個資料和一個α值就可進行計算;在大多數情況下,一般更喜歡用線性二次指數平滑法作為預測方法。

二次指數平滑法實質上是將歷史資料進行加權平均作為 未來時刻的預測結果。它具有計算簡單、 樣本要求量較少、 適應性較強、 結果較穩定。


應用時間序列平滑法的前提條件是:(1)所預測的客觀事物發展屬於漸進式,無跳躍性的變化;(2)過去和目前影響客觀事物發展的因素也決定著客觀事物未來的發展。由於客觀事物的發展變動受多種因素的影響,而各種影響因素又可能是不斷髮展或不斷變動的,因此,時間序列平滑法在一般情況下僅適用於短期的與近期的預測。當預測如果需要延伸至較遠未來,時間序列平滑法則存在較大的侷限性。時間序列平滑法在客觀影響因素髮生較大變化可能產生較大的預測誤差。為降低這些可能的預測誤差,必須充分研究客觀影響因素可能的發展與變動,將定性分析和定量研究結合起來,這樣才能提高預測的精度。


#include <iostream>
#include <vector>

using namespace std;

double getExpect(vector< vector<double> > vector1 , int month, double modulus )
{
    double modulusLeft = 1 - modulus;

    double lastIndex = vector1[0][0];
    double lastSecIndex = vector1[0][0];

    for (int i=1;i<=40;i++)
    {	//更新到最後時刻的一次和二次的平滑值
        lastIndex = modulus * vector1[0][i-1] + modulusLeft * lastIndex;
        lastSecIndex = modulus * lastIndex + modulusLeft * lastSecIndex;
    }
    double At = 2 * lastIndex - lastSecIndex;
    double Bt = (modulus / modulusLeft) * (lastIndex - lastSecIndex);

    return At + Bt * month;

}

int main()
{
//    int a[2][7]={{11,23,32,41,53,62,74},{2,4,7,5,3,6,8}};
//    vector <vector<int >> sequences1(2,vector<int>(7));
//
//    for (int i = 0; i < 2; i++)
//    {
//        for(int j=0;j<7;j++)
//        {
//            sequences1[i][j]=a[i][j];
//           cout<<sequences1[i][j]<<" ";
//        }
//        cout<<endl;
//    }

    double a[40]={0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,7,1,0};
    vector< vector<double> > sequences(5);
    for(int i=0;i<5;i++) {
        sequences[i].resize(40);
    }

    for (int i = 0; i < 40; i++)
    {
        sequences[0][i]=a[i];
        //cout<<sequences[0][i]<<endl;
    }

    double value=getExpect(sequences,1,0.8);
    cout<<value<<endl;

    cout<<"Succeed!";
    return 0;
}
當預測時間前臨近的幾天出現大的資料下降時,預測值有可能為負數,根據實際情況處理。