jupyter 写一个函数求三个数的平均值

指数平滑方法适用于非平稳数据(即具有趋势和/或季节性的数据),其工作方式类似于指数移动平均线。预测是过去观察的加权平均值。这些模型更加强调最近的观察结果,因为权重随时间呈指数级变小。平滑方法很受欢迎,因为它们速度快(不需要大量计算)并且在预测方面相对可靠。(扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。)

,最基本的模型称为简单指数平滑(SES)。这类模型最适用于所考虑的时间序列不表现出任何趋势或季节性的情况。它们也适用于只有几个数据点的系列。

该模型通过平滑参数 α 进行参数化,其值介于 0 和 1 之间。值越高,对最近观察的权重就越大。当 α = 0 时,对未来的预测等于历史数据(模型拟合的数据)的平均值。当 α = 1 时,所有预测值都与训练数据中的最后一个观察值相同。

简单指数平滑的预测函数是平坦的,即所有的预测,无论时间跨度如何,都等于同一个值——最后一个级别的分量。这就是为什么这种方法只适用于既没有趋势也没有季节性的序列。

Holt 的模型是简单指数平滑(SES)的扩展,它通过将趋势分量添加到模型规范中来说明序列中的趋势。当数据存在趋势但没有季节性时,应使用此模型。

Holt 模型的一个问题是趋势在未来是恒定的,这意味着它会无限增加/减少。这就是模型的扩展通过添加阻尼参数 φ 来抑制趋势的原因。它使趋势在未来收敛到一个恒定值,从而有效地将其拉平。Hyndman 和 Athanasopoulos (2018) 指出 φ 很少小于 0.8,因为阻尼对较小的 φ 值具有非常强的影响。

最佳做法是限制 φ 的值,使其介于 0.8 和 0.98 之间,因为对于 φ = 1,阻尼模型等效于没有阻尼的模型。

在本文中,我们将向您展示如何将平滑方法应用于 Google 的每月股票价格(具有趋势且没有明显季节性的非平稳数据)。我们将模型与 年的价格进行拟合,并对 2018 年进行预测。

在下文中,我们将在相同的图上绘制多条线,每条线代表不同模型的类型。这就是为什么我们要确保这些线条清晰可辨,尤其是黑白线条。出于这个原因,我们将为绘图使用不同的调色板,即:

执行以下步骤以使用指数平滑方法来创建对 Google 股票价格的预测。

2、下载调整后的谷歌股价数据:

6、拟合三个简单指数平滑(SES)模型并为它们创建预测:

7、绘制原始价格和模型的结果:

在前面的图中,我们可以看到我们在本文的介绍中描述的 SES 的特征——预测是一条平坦的线。我们还可以看到 优化程序选择的最优值接近 1。此外,第三个模型的拟合线实际上是观察到的价格向右移动的线。

8、拟合 Holt 平滑模型的三个变体并创建预测:

9、绘制原始价格和模型的结果:

在第 2 步到第 5 步中,我们下载了 年 Google 的股票价格,将这些值重新采样到每月频率,将数据拆分为训练()和测试(2018)集,并绘制了系列图。

在第 6 步中,我们使用 类及其拟合方法拟合了三个不同的 SES 模型。对于拟合,我们只使用了训练数据。我们可以手动选择平滑参数 () 的值,但是,最佳实践是让 优化它以获得最佳拟合。这种优化是通过最小化残差平方和(误差)来完成的。我们使用预测方法创建了预测,该方法需要我们要预测的周期数(等于测试集的长度)。在第 7 步中,我们将结果可视化并将其与实际股票价格进行比较。我们使用拟合模型的拟合值方法提取模型的拟合值。

在第 8 步中,我们使用了 类(它是更加 通用的 类)以适合 的线性趋势模型。默认情况下,模型中的趋势是线性的,但我们可以通过指定 并使用添加阻尼来使其呈指数增长。与 SES 的情况一样,使用不带参数的 方法会导致运行优化例程以确定参数的最佳值。我们可以通过运行来访问它。在示例中,我们手动将阻尼参数的值指定为 0.99,因为优化器选择 1 作为最佳值,这在图上是无法区分的。在第 9 步中,我们将结果可视化。

Holt 的方法有一个扩展,称为 Holt-Winter 季节性平滑法。它考虑了时间序列中的季节性。此模型没有单独的类,但我们可以通过添加 和 参数来调整 类。

无需过多赘述,此方法最适合具有趋势和季节性的数据。该模型有两种变体,它们具有加法或乘法季节性。在前一种中,季节变化在整个时间序列中或多或少是恒定的。在后者中,变化与时间的流逝成比例地变化。

从绘制的预测图中,我们可以看到,与 SES 和 Holt 的线性趋势模型相比,该模型更加灵活。序列开始时的极端拟合值是由于没有足够的观察值可供回溯(我们在处理月度数据时选择了)。

扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。


%timeit:测量代码消耗的时间

(5)生成范围内的数组:

np.arange(0,20,2)。第一个参数是起点,第二个是终点(不包含),第三个是步长

np.linspace(0,20,10).第一个参数是起点,第二个是终点(包含),第三个是平均分成多少个数。

里面的矩阵运算+-*/都是对应元素之间的运算

真正的矩阵乘法:A.dot(B)=>A行的每一行和B的每一列相乘再相加

矩阵的转置:A.T=>行变列,列变行。

c.矩阵与向量间的运算

元素之间的乘法:v*A

d.聚合操作:把一组值变成一个值。

快速排序:np.partition(x,3) 寻找一个标定点,将数组中的小于标定点的元素放在标定点的左侧,大于标定点的元素放在标定点的右侧。

第一个参数表示整型,第二个是list

不同分类不同颜色样式的点

  • 这周过得似乎要比上周好一些,但又似乎没有什么太大的区别。 有点点好些,因为我会做一点点高数题了,多谢大三的那位学长...

  • 我报了无戒365极限挑战日更营,并没有热血沸腾,甚至是有点冷静,仍然是每天按步就班地做事。因为我只是想坚持每天做同...

  • 自从父母撤资,出来工作以后,越过越穷,生活无时无刻不在提醒着我它有多艰辛,少的可怜的工资,吃穿用度加上高额的...

  • 如果我将要死去,不怨。 自然之命不可违抗,无奈。 世事我已看的够多,人生哲理不过如此 生命之门千苍百孔,命运之刑就...

  • 娘的眼睛视力一直不好,去年做过一只眼睛的白内障手术,最近另一只眼睛眼问题也严重了很多,姥姥晚年患眼疾以至于后来因为...

我要回帖

更多关于 写一个函数求三个数的平均值 的文章

 

随机推荐