时间序列模型 (五): 趋势外推预测方法

时间序列的其它博文系列:

时间序列模型 (一):模型概述

时间序列模型 (二):移动平均法

时间序列模型 (三):指数平滑法

时间序列模型 (四):差分指数平滑法、 自适应滤波法v

时间序列模型 (五): 趋势外推预测方法

时间序列模型 (六):平稳时间序列模型 :自回归AR 、移动平均 MA 、ARMA 模型

时间序列模型 (七): 时间序列建模的基本步骤


趋势外推法是根据事物的历史和现时资料,寻求事物发展规律,从而推测出事物 未来状况的一种比较常用的预测方法。利用趋势外推法进行预测,主要包括六个阶段:

(a)选择应预测的参数; (b)收集必要的数据;   (c)利用数据拟合曲线;  

(d)趋势外 推;(e)预测说明;(f)研究预测结果在进行决策中应用的可能性。

趋势外推法常用的典型数学模型有:指数曲线、修正指数曲线、生长曲线、包络 曲线等。 

目录

 指数曲线法 

 修正指数曲线法 

三和法

Compertz 曲线 

 Logistic 曲线(生长曲线) 

  趋势线的选择


 指数曲线法 

一般来说,技术的进步和生产的增长,在其未达饱和之前的新生时期是遵循指数 曲线增长规律的,因此可以用指数曲线对发展中的事物进行预测。 

 

 修正指数曲线法 

利用指数曲线外推来进行预测时,存在着预测值随着时间的推移会无限增大的情 况。这是不符合客观规律的。因为任何事物的发展都是有一定限度的。例如某种畅销产 品,在其占有市场的初期是呈指数曲线增长的,但随着产品销售量的增加,产品总量接 近于社会饱和量时。这时的预测模型应改用修正指数曲线。 

三和法

 

例 8  根据统计资料,某厂收音机连续 15 年的销售量如表 11。 试用修正指数曲线预测 1986 年的销售量。 

计算的 MATLAB 程序如下: 

function chanliang 
clc,clear 
global a b k 
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中 
yt=xsh; n=length(yt);m=n/3 
cf=diff(yt); 
for i=1:n-2     
    bzh(i)=cf(i+1)/cf(i); 
end 
range=minmax(bzh) 
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end)) 
b=((s3-s2)/(s2-s1))^(1/m) a=(s2-s1)*(b-1)/(b*(b^m-1)^2) 
k=(s1-a*b*(b^m-1)/(b-1))/m 
y=yuce(1:18) 
%************************************ 
%定义预测函数 
%************************************ 
function 
y=yuce(t) 
global a b k 
y=k+a*b.^t;  

Compertz 曲线 

 

例 9(续例 8)  根据表 11 的数据,试确定收音机销售量的 Gompertz 曲线方程, 求出各年收音机销售量的趋势值,并预测 1986 年的销售量。

计算的 MATLAB 程序如下: 

function chanliang2 
clc,clear 
global a b k 
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中 
yt=log(xsh); n=length(yt);m=n/3; 
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end)) 
b=((s3-s2)/(s2-s1))^(1/m) 
a=(s2-s1)*(b-1)/(b*(b^m-1)^2) 
k=(s1-a*b*(b^m-1)/(b-1))/m a=exp(a) 
k=exp(k) 
y=yuce(1:18) 
%************************************ %定义预测函数 %************************************ function y=yuce(t); 
global a b k 
y=k*a.^(b.^t); 

 Logistic 曲线(生长曲线) 

生物的生长过程经历发生、发展到成熟三个阶段,在三个阶段生物的生长速度是不 一样的,例如南瓜的重量增长速度,在第一阶段增长的较慢,在发展时期则突然加快, 而到了成熟期又趋减慢,形成一条 S 形曲线,这就是有名的 Logistic 曲线(生长曲线),很多事物,如技术和产品发展进程都有类似的发展过程,因此 Logistic 曲线在预测中有 相当广泛的应用。 

 

例 10(续例 8)  根据表 10 的数据,试确定收音机销售量的 Logistic 曲线方程, 求出各年收音机销售量的趋势值,并预测 1986 年的销售量。 

计算的 MATLAB 程序如下: 

function chanliang3 
clc,clear 
global a b k 
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中 
yt=1./xsh; n=length(yt);m=n/3; 
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end)) 
b=((s3-s2)/(s2-s1))^(1/m) 
a=(s2-s1)*(b-1)/(b*(b^m-1)^2) 
k=(s1-a*b*(b^m-1)/(b-1))/m 
y=yuce(1:18) 
%************************************ %定义预测函数 %************************************ function y=yuce(t); 
global a b k 
y=1./(k+a*b.^t); 


  趋势线的选择

 趋势线的选择有以下几种方式

当有几种趋势线可供选择时,应选择S 小的趋势线。

 


时间序列的其它博文系列:

时间序列模型 (一):模型概述

时间序列模型 (二):移动平均法

时间序列模型 (三):指数平滑法

时间序列模型 (四):差分指数平滑法、 自适应滤波法v

时间序列模型 (五): 趋势外推预测方法

时间序列模型 (六):平稳时间序列模型 :自回归AR 、移动平均 MA 、ARMA 模型

时间序列模型 (七): 时间序列建模的基本步骤

  • 38
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为你编写一个简单的趋势预测模型。这个模型将使用Python编写,并且需要一些时间序列数据来训练模型。 首先,我们需要安装并导入一个称为“pandas”和“matplotlib”的Python库,以处理和可视化时间序列数据。您可以使用以下命令安装这些库: ``` !pip install pandas matplotlib ``` 在安装这些库之后,我们现在可以加载我们的时间序列数据。在这里,我的荐是使用pandas库的“read_csv”函数来读取你的csv文件,并加载到一个pandas dataframe中。 ```python import pandas as pd # load the time series data into a pandas dataframe data = pd.read_csv('YOUR_CSV_FILE.csv', index_col=0) ``` 接下来,我们需要将数据集分成训练集和测试集。一般来说,训练集占数据集的大约70-80%,而测试集则占20-30%。在这里,我们将把前80%的数据用于训练,剩余的20%用于测试。我们还将使用一个可以将数据可视化的matplotlib库。 ```python import matplotlib.pyplot as plt # split the data into a training set and a testing set train_size = int(len(data) * 0.8) train, test = data[:train_size], data[train_size:] # plot the training and testing data to see how it looks plt.plot(train) plt.plot(test) plt.show() ``` 接下来,我们需要处理数据并为模型准备数据。我们将使用一个称为“sklearn.preprocessing”库的Python库来进行标准化数据处理。标准化是一种将数据处理为具有零均值和单位方差的过程。 ```python from sklearn.preprocessing import StandardScaler # normalize the training and testing data scaler = StandardScaler() train_scaled = scaler.fit_transform(train) test_scaled = scaler.transform(test) ``` 现在我们准备好训练模型了。对于这个模型,我们将使用一个查找“单指数平滑”概念的函数所获得的趋势线。这里我使用numpy库,但你也可以使用其他可用的库。 ```python import numpy as np # define a function to get the trend line using exponential smoothing def get_trend_line(train_data): alpha = 0.2 preds = np.zeros(len(train_data)) preds[0] = train_data[0] for i in range(1, len(train_data)): preds[i] = alpha * train_data[i] + (1 - alpha) * preds[i-1] return preds # get the trend line for the training data trend_line = get_trend_line(train_scaled) ``` 现在我们可以可视化我们的趋势,使它更好理解我们是怎么做的。 ```python plt.plot(train_scaled) plt.plot(trend_line) plt.show() ``` 最后,我们可以使用趋势线对我们的测试集进行,并可视化它: ```python # define a function to forecast future values using the trend line def forecast_trend_line(train_data, test_data): alpha = 0.2 preds = np.zeros(len(test_data)) preds[0] = alpha * train_data[-1] + (1 - alpha) * trend_line[-1] for i in range(1, len(preds)): preds[i] = alpha * test_data[i-1] + (1 - alpha) * preds[i-1] return preds # predict future values using the trend line test_preds = forecast_trend_line(train_scaled, test_scaled) # plot the actual testing data and the predicted values plt.plot(test_scaled) plt.plot(test_preds) plt.show() ``` 这就是一个简单的趋势预测模型的实现,希望可以帮助到你!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值