亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

探索時間序列預測中的Theta方法:Python實戰講解

Python中的Theta预测法实用指南

Negative Theta 是一种时间序列预测方法,结合了分解、线性外推和集成模型。它特别适用于带有强烈趋势和季节性特征的时间序列。

Theta方法是由Assimakopoulos和Nikolopoulos(2000年)提出的一种预测方法。它基于将时间序列分解成两个或多个部分,然后分别预测各部分并重新组合。核心思想是通过应用一个“theta系数”来调整时间序列的趋势,并利用线性和平滑后的部分进行预测。

Theta方法的关键步骤如下:

  1. 将时间序列分解成趋势部分和季节性部分。
  2. 对趋势应用theta变换以调整趋势的曲率。
  3. 分别预测每个部分。
  4. 将预测结果结合起来产生最终结果。

我们将用Python里的Theta方法来做这个。为了演示,我们将使用常用的AirPassengers数据集(记录了从1949年到1960年的每月航空乘客人数)。

    import pandas as pd  
    import numpy as np  
    import matplotlib.pyplot as plt  

    # 加载数据  
    url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"  
    data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')  
    data.rename(columns={'Passengers': 'AirPassengers'}, inplace=True)  
    # 绘制数据  
    plt.figure(figsize=(10, 6))  
    plt.plot(data, label="AirPassengers", color="blue")  
    plt.title("每月航空乘客")  
    plt.xlabel("月份")  
    plt.ylabel("乘客数")  
    plt.legend()  
    plt.grid()  
    plt.savefig("air_passengers_plot.png")  
    plt.show()

Theta 分量拆分

首先,将时间序列拆分为趋势和季节性部分,然后……

    从statsmodels.tsa.seasonal导入seasonal_decompose  

    # 分解时间序列  
    result = seasonal_decompose(data['AirPassengers'], model='乘法模型')  
    # 绘制分解图  
    result.plot()  
    plt.tight_layout()  
    plt.savefig("decomposition_plot.png")  
    plt.show()

应用θ变换

我们使用一个theta系数来调整趋势曲线的曲率。通常使用theta = 2来表示传统的θ方法。

    def theta_transform(series, theta=2):  
        linear_trend = np.poly1d(np.polyfit(range(len(series)), series, 1))(range(len(series)))  
        theta_series = theta * series - (theta - 1) * linear_trend  
        return theta_series, linear_trend  

    # 应用这个变换  
    theta_series, linear_trend = theta_transform(data['AirPassengers'])  
    # 绘制变换后的序列  
    plt.figure(figsize=(10, 6))  
    plt.plot(data['AirPassengers'], label="原始数据", color="blue")  
    plt.plot(theta_series, label="θ=2 的Theta序列", color="orange")  
    plt.plot(linear_trend, label="线性趋势", color="green")  
    plt.title("Theta变换图")  
    plt.xlabel("时间轴")  
    plt.ylabel("乘客数量")  
    plt.legend()  
    plt.grid()  
    plt.savefig("theta_transformation.png")  
    plt.show()

使用Theta方法 做预测

我们将使用线性趋势法和经过调整的序列做预测,最后整合结果。

    from sklearn.linear_model 导入 LinearRegression  

    def forecast_theta(series, forecast_horizon, theta=2):  
        # 线性趋势预测  
        X = np.arange(len(series)).reshape(-1, 1)  
        model = LinearRegression()  
        model.fit(X, series)  
        future_X = np.arange(len(series), len(series) + forecast_horizon).reshape(-1, 1)  
        trend_forecast = model.predict(future_X)  
        # 使用简单的朴素方法预测Theta序列  
        theta_series, _ = theta_transform(series, theta)  
        naive_forecast = np.mean(theta_series[-12:])  # 过去12个月的平均值  
        # 结合预测  
        combined_forecast = (trend_forecast + naive_forecast) / 2  
        return combined_forecast  
    # 预测未来12个月  
    forecast_horizon = 12  
    forecast_values = forecast_theta(data['AirPassengers'].values, forecast_horizon)  
    # 生成未来时间点  
    future_dates = pd.date_range(data.index[-1], periods=forecast_horizon + 1, freq='M')[1:]  
    # 绘制预测结果  
    plt.figure(figsize=(10, 6))  
    plt.plot(data, label="历史数据", color="蓝色")  
    plt.plot(future_dates, forecast_values, label="Theta预测结果", color="红色", linestyle="--")  
    plt.title("Theta预测结果")  
    plt.xlabel("时间")  
    plt.ylabel("乘客数量")  
    plt.legend()  
    plt.grid()  
    plt.savefig("theta预测.png")  
    plt.show()

结果分析

Theta法结合了线性趋势和经过调整的曲率,从而为具有趋势和季节性的时间序列提供了稳健的预测结果。该方法的简单性和高效性使其是许多实际预测任务的优秀选择。

下一步骤:

这篇文章将展示如何手动实现Theta方法。但在大多数情况下,人们更倾向于使用Python库如statsmodelsstatsforecast。这些库可以节省时间,减少错误,并帮助应用更复杂的技术。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消