NumPy Python:计算自协方差

Numpy 是用于统计的首选工具,而自协方差是一个统计概念。在本文中,我们将研究如何使用 NumPy 计算自协方差。

自协方差的定义

自协方差是统计学中使用的一个概念,用于计算时间序列及其在不同时间点的滞后版本的协方差。

自协方差是理解时间序列数据周期性行为的重要工具。使我们能够找出各种因素,例如趋势分析、季节性等。

NumPy 简介

NumPy 是一个强大的 Python 库,由于其各种功能和轻松处理大量数学计算的能力而受到欢迎。

它非常容易挑选和使用,并且加载了各种功能,可以帮助我们轻松执行复杂的操作。

要深入了解NumPy 库,请查看此链接中的这篇文章。

自协方差在数据分析和时间序列预测中的应用

自协方差是一个重要的工具,因为它在执行数据分析和时间序列预测的各种任务中变得至关重要。

自协方差通过计算一段时间内一定滞后的重复模式,有助于理解季节性趋势。 

它可以在实现机器学习模型时使用,同时调整某些超参数,并提高该模型产生的结果的性能和质量。

总的来说,自协方差是我们可以解决各种类型不同领域的广泛应用的重要工具。

了解协方差

协方差的定义

协方差是一种统计工具,用于衡量两个变量共同变化的程度。在数据分析中,协方差显示了两个数据点集合之间的关系,并表明它们是否可能一起增加或减少。

如果一个变量在另一个变量增加时增加,则称为正协方差;同样,如果一个变量在另一个变量增加时减少,则称为负协方差。

如果一个变量不会因另一个变量而发生变化,则协方差为零。

协方差可以用数学方程表示,如下所示:

协方差方程

在哪里

x(条) = X 的平均值

y(bar) = Y 的平均值

X = x 的各个数据点

y = y 的各个数据点 

协方差矩阵

协方差矩阵是处理多个变量时变量对协方差的排列。

协方差矩阵的一般形式如下所示:

协方差矩阵

协方差与协方差 自协方差

自协方差将单个时间序列与其之前和即将到来的数据值进行比较,以了解时间依赖性,而协方差则比较两个不同的变量以了解一个变量对另一个变量的影响。

自协方差概念

自动协方差背后的想法

自协方差的概念源于了解时间序列中先前值和即将到来的值之间的关系的愿望。 

时间序列只不过是一段时间内反映某些特征的连续观察。这些特征可以是时间依赖性、趋势和周期性模式。

自协方差帮助我们计算和理解时间序列数据的这些特征。

测量时间序列中不同时间点之间的相关性是寻找自协方差背后的实际想法。

它是处理时间序列数据的重要工具,其应用范围广泛。

数学表示

时间序列中给定滞后的自协方差可以表示如下:

自协方差方程

在哪里,

X = 时间序列,

k = 滞后(滞后只不过是正在比较的两个观测值之间的持续时间)

X t = 时间 t 时的值。

x(bar) = 时间序列的平均值

自协方差用于了解时间序列与其滞后版本之间的相关性在一段时间内如何变化。

使用 NumPy 计算自协方差

‘numpy.cov()’

要使用 numpy.cov(),我们需要时间序列数据的滞后版本,然后将时间序列数据和滞后数据组合起来创建一个二维数组。

经过预处理后,我们可以将此数据传递给 numpy.cov() 函数。 

要开始工作,我们需要在系统中安装 NumPy。为此,我们将使用 pip,它是 Python 的默认包管理器。要了解有关pip 的更多信息,请阅读这篇文章。

要安装 NumPy,请运行以下命令:

pip install numpy

单时间序列:

我们将借助下面的简单示例来了解如何将 numpy.cov() 函数用于单个时间序列。

我将使用 Google Colab 作为本文的环境。

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
 
data = np.array([5,4,3,2,1])
lagged_data = np.roll(data, 1)
 
pre_processed_data = np.vstack((data, lagged_data))
 
cov_mat = np.cov(pre_processed_data).  
 
print("Covariance matrix for auto-covariance (single time series): ")
 
print(cov_mat) 

在上面的代码中,我们首先将 NumPy 库导入为 np.

然后,我们使用“np.array()”函数创建了一个包含五个元素的简单数组,我们将其命名为数据,并将其视为时间序列数据。

之后,我们创建了另一个数组,但使用了“data”数组中使用的相同元素。唯一的区别是我们使用“np.roll()”函数将所有元素移动了一个位置。我们使用第二个数组作为时间序列数据的滞后;因此我们将其命名为“lagged_data”。

现在我们有两个必需的数组:时间序列,即“data”,和滞后,即“lagged_data”。之后,我们将组合两个数组并使用“np.stack()”函数将它们转换为二维数组,因为这是计算自协方差所需的格式,正如我们在定义中看到的那样。

最后,我们将刚刚创建的二维数组传递给“np.cov()”函数,以生成自协方差的协方差矩阵。

单时间序列 NumpyCov

正如您所看到的,我们将两个数组组合在一起,然后我们能够生成自协方差的协方差矩阵。

多时间序列

我们将借助下面的简单示例了解如何将 numpy.cov() 函数用于多个时间序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
 
data1 = np.array([1, 2, 3, 4, 5])
data2 = np.array([2, 3, 4, 5, 6])
 
lagged_data1 = np.roll(data1, 1)
lagged_data2 = np.roll(data2, 1)
 
pre_processed_data = np.vstack((data1,lagged_data, data2, lagged_data2))
 
cov_mat = np.cov(pre_processed_data)
 
print("Covariance matrix for auto-covariance (multiple time series):")
 
print(cov_mat)

在上面的代码中,我们首先将 NumPy 库导入为 np.

然后使用“np.array()”函数创建两个包含五个元素的简单数组,我们将其命名为 data1 和 data2,我们将其视为时间序列数据。

之后,我们创建了另外两个数组,但使用了“data1”和“data2”数组中使用的相同元素。唯一的区别是我们使用“np.roll()”函数将所有元素移动了一个位置。我们使用后来创建的数组作为时间序列数据的滞后;因此我们将它们命名为“lagged_data1”和“lagged_data2”。

现在我们有了所需的数组:时间序列和滞后。之后,我们将组合这些数组并使用“np.stack()”函数将它们转换为多维数组,因为这是计算自协方差所需的格式,正如我们在定义中看到的那样。

最后,我们将刚刚创建的多维数组传递给“np.cov()”函数,以生成自协方差的协方差矩阵。

多个时间序列 NumpyCov 1

成功执行上述代码后,您将得到类似的输出。

‘numpy.correlate()’

什么是互相关?

互相关是一种数学工具,用于量化两个序列的相似度。在时间序列的背景下,它用于查找时间序列与其滞后版本的相似程度。

通常用于需要找到时间平移并识别一对序列之间的模式和周期性的问题。

使用互相关计算自协方差。

我们将通过一个例子来理解这个过程:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
 
data = np.array([1, 2, 3, 4, 5])
 
auto_cov = np.correlate(data - data.mean(), data - data.mean(), mode='full')
 
positive_lags = np.arange(len(data))
auto_cov = auto_cov[len(data) - 1:]
 
print("Auto-covariance values at different lags:")
print(auto_cov)

上面的代码与我们在前面的示例中使用“np.cov()”所做的类似。您可以更深入地了解 np.correlate() 函数的工作原理;你可以阅读这篇文章。

互相关示例

在上面的示例中,我们将“数据”视为时间序列,并使用互相关计算不同时间滞后的自协方差值。

可视化自协方差

由于我们已经获得了有关自协方差的所有理论知识,并且还了解了如何使用 NumPy 计算它,因此我们对该主题有了很好的理解,但有时当我们直观地看到事物时,我们往往会更好地理解它们。

我们将借助另一个名为 Matplotlib 的 Python 库来绘制一些图表,该库用于可视化数据,以便更好地理解该主题。

要了解有关Matplotlib的更多信息,请参阅链接中的一篇详细文章。

pip install matplotlib

时间序列图

首先,我们将从绘制时间序列图开始;借助下面的代码,您可以绘制时间序列图:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt
 
time_series = np.array([1, 2, 3, 4, 5])
 
time = np.arange(len(time_series))
 
plt.plot(time, time_series, marker='o', linestyle='-')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Time Series Plot')
plt.grid(True)
plt.show()

上面的代码执行使用 matplotlib 绘制时间序列图的任务。

我们只需导入如上所示的库即可。

我们创建了一个数组,将其视为时间序列,并且我们需要一个整数作为图表的 x 轴,我们将其视为时间,因为我们正在绘制价值随时间增加而增加的图表,并且我们将在 x 轴上绘制时间。

然后我们使用“plt.plot()”创建了一个绘图,并根据我们的要求传递了其参数。之后,我们更改了绘图的某些属性,例如将 x 轴和 y 轴命名为“时间”和“值”,然后将标题设置为“时间序列图”,最后使用“plt.show()”命令来显示绘图。

您可以查看下图所示示例中的时间序列图:

时间序列图

滞后自协方差

接下来,我们还将借助一个示例来了解如何用滞后图绘制自协方差,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt
 
auto_covariance = np.array([2.5, 1.2, 0.8, 0.4, -0.2])
 
lags = np.arange(1, len(auto_covariance) + 1)
 
plt.stem(lags, auto_covariance, use_line_collection=True)
plt.xlabel('Lag')
plt.ylabel('Auto-covariance')
plt.title('Auto-covariance Plot with Lag')
plt.grid(True)
plt.show();

绘制带有滞后的自协方差图与绘制时间序列图相同。唯一的区别是我们用自动协方差替换了值,用滞后替换了时间。其余过程与时间序列图执行的过程相同。

您可以在下图中看到带有滞后图的自协方差示例:

带滞后图的自动协方差

通过借助 matplotlib 绘制结果,您可以更好地理解并解释您执行的计算和操作的结果。 

情节总是令人赏心悦目且易于理解。

实际应用

自协方差是一种具有许多实际应用的工具,范围从股票市场分析到气候预测分析。投资者利用自协方差生成的模式在股票市场进行投资。

这些模式有助于理解交易策略、投资组合改进和其他因素并做出计算决策。

借助自协方差可以获得与气候和天气相关的重要知识。

考虑到所有应用程序和用例,可以理解,自协方差通过在生成的模式和趋势的帮助下指导决策并提高我们做出的决策的质量来提供很大帮助。

概括

为了结束本文,让我们修改一下本文中介绍的内容。首先,我们首先了解基本概念、自协方差的定义及其在统计领域的重要性。

我们了解了什么是协方差,并概述了该概念的数学部分。

后来我们接触了自协方差,深入理解了它,涵盖了它的数学概念,然后我们开始使用 NumPy 和 Python 将其实际实现为代码。

我们看到了一些如何借助 matplotlib 可视化结果的示例。

最后,我们刚刚温习了有关如何在现实世界中使用自协方差以及自协方差的潜在用例的知识。

参考

Stackoverflow 查询