使用格拉姆角场(GAF)以将时间序列数据转换为图像

这篇文章将会详细介绍格拉姆角场 (Gramian Angular Field),并通过代码示例展示“如何将时间序列数据转换为图像”。

Gramian Angular Summation / Difference Fields (GASF / GADF)可以将时间序列转换成图像,这样我们就可以将卷积神经网络 (CNN) 用于时间序列数据

基本概念

在开始介绍之前,我认为首先我们应该熟悉一下 GASF / GADF 的基本概念。如果您已经知道,可以跳过本节。

笛卡尔坐标:笛卡尔坐标系(Cartesian coordinates,法语:les coordonnées cartésiennes)就是直角坐标系和斜坐标系的统称,相交于原点的两条数轴,构成了平面仿射坐标系 。如两条数轴上的度量单位相等,则称此仿射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。点(或其他几何形状)的位置由一个或多个数字确定。例如,如果我们采用二维坐标系,则位置由一对数字确定,例如 (2,3)。然后在距两条参考线(称为 x 轴和 y 轴)的距离上显示该位置。

极坐标:属于二维坐标系统,创始人是牛顿,主要应用于数学领域。极坐标是指在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。想象一个以原点为中心的圆,它与点(2,3)相交。我们求这个圆的半径以及x轴与(0,0)和(2,3)连线的夹角。在极坐标中会被表示为(3.6,56.3),也就是说是一个距离极点3.6个单位和极轴夹角为56.3°的点

格拉姆矩阵:假设我们有一组向量V。格拉姆(Gram)矩阵是来自V的每一对向量的内积矩阵。如下图所示,矩阵中的每个元素< vi, vj> 是向量 vi 和 vj 之间的向量乘积。

以上图片和介绍来自维基和百度百科,以上就是基本概念的简单介绍,那么咱们开始进入正题。

格拉姆角场

现在我们将朝着这篇文章的主要目标前进,即理解在图像中表示时间序列的过程。简而言之,可以通过以下三个步骤来理解该过程。

  1. 通过取每个 M 点的平均值来聚合时间序列以减小大小。此步骤使用分段聚合近似 ( Piecewise Aggregation Approximation / PAA)。
  2. 区间[0,1]中的缩放值。
  3. 通过将时间戳作为半径和缩放值的反余弦(arccosine)来生成极坐标。这杨可以提供角度的值。
  4. 生成GASF / GADF。在这一步中,将每对值相加(相减),然后取余弦值后进行求和汇总。

语言描述可能不太准确,下面使用代码详细进行解释

Python 中的示例

我在这里提供了一个 Python 示例,以演示使用格拉姆角场将时间序列转换为图像的逐步过程的状态。

导入需要的包

from pyts.approximation import PiecewiseAggregateApproximation
from pyts.preprocessing import MinMaxScaler
import numpy as np
import matplotlib.pyplot as plt

生成一些demo数据

X = [[1,2,3,4,5,6,7,8],[23,56,52,46,34,67,70,60]]
plt.plot(X[0],X[1])
plt.title(‘Time series’)
plt.xlabel(‘timestamp’)
plt.ylabel(‘value’)
plt.show()

分段聚合逼近和缩放

# PAA
transformer = PiecewiseAggregateApproximation(window_size=2)
result = transformer.transform(X)

# Scaling in interval [0,1]
scaler = MinMaxScaler()
scaled_X = scaler.transform(result)

plt.plot(scaled_X[0,:],scaled_X[1,:])
plt.title(‘After scaling’)
plt.xlabel(‘timestamp’)
plt.ylabel(‘value’)
plt.show()

转换成极坐标

arccos_X = np.arccos(scaled_X[1,:])
fig, ax = plt.subplots(subplot_kw={‘projection’: ‘polar’})
ax.plot(result[0,:], arccos_X)
ax.set_rmax(2)
ax.set_rticks([0.5, 1, 1.5, 2]) # Less radial ticks
ax.set_rlabel_position(-22.5) # Move radial labels away from plotted line
ax.grid(True)

ax.set_title(“Polar coordinates”, va=’bottom’)
plt.show()

Gramian angular summation fields

field = [a+b for a in arccos_X for b in arccos_X]
gram = np.cos(field).reshape(-1,4)
plt.imshow(gram)

最后补充

上述步骤用于说明使用 Gramian Angular Summation / Difference Field 将时间序列转换为图像的过程。在实际使用时中可以不需要计算极坐标,这是因为以下的三角函数规则:

为了在 Gramian Angular Field 计算中计算 Cos (A + B),我们将其扩展如下

因为我们通过取时间序列值的余弦倒数来计算 A 和 B(实际上是在 PAA 和缩放之后的值上)。其他的说明可以参考pyts库关于GramianAngularField的说明。

引用

  1. Wang, Z., & Oates, T. (2015). Imaging time-series to improve classification and imputation. IJCAI International Joint Conference on Artificial Intelligence, 2015-January, 3939–3945.
  2. Eamonn J Keogh and Michael J Paz- zani. Scaling up dynamic time warping for datamining applications. In Proceedings ofthe sixth ACM SIGKDD international conference on Knowledge discovery and data mining, pages 285– 289. ACM, 2000.
  3. https://pyts.readthedocs.io/en/stable/_modules/pyts/image/gaf.html#GramianAngularField
  4. https://www.overfit.cn/post/f1a917448ad34b7099e3dc0126a84d35

作者:Pankaj Chejara

### 回答1: 格拉姆-施密特正交化(Gram-Schmidt Orthogonalization)是一种将线性无关的向量组转换为标准正交基的方法。下面是一个 Python 实现: ```python import numpy as np def gram_schmidt(A): # 将第一个向量单位化 Q = A[0] / np.linalg.norm(A[0]) # 对于每个向量进行正交化处理 for i in range(1, A.shape[0]): # 先将该向量投影到前面的所有向量上 proj = np.zeros_like(A[i]) for j in range(i): proj += np.dot(A[i], Q[j]) * Q[j] # 将该向量减去投影得到正交向量 q = A[i] - proj # 如果该向量不是零向量,则将其单位化 if not np.allclose(q, np.zeros_like(q)): q = q / np.linalg.norm(q) # 将该向量加入正交基中 Q = np.vstack((Q, q)) return Q ``` 其中,`A` 是一个 $n \times m$ 的矩阵,表示 $m$ 个 $n$ 维向量组成的向量组。函数返回一个 $n \times m$ 的矩阵 `Q`,表示 $m$ 个标准正交向量组成的向量组。 ### 回答2: 格拉姆角场(Gram-Schmidt process)是一种用于求解线性无关向量组的正交基的方法。在Python中可以实现格拉姆角场的过程如下: 1. 首先,我们需要有一个线性无关的向量组。假设我们有一个n维向量组V,其中每个向量的维度为m。我们可以用一个n x m的矩阵来表示该向量组。 2. 创建一个空的n x m的矩阵Q,用于存储正交基。 3. 遍历向量组V中的每一个向量v_i,执行以下步骤: a. 将v_i赋值给新的向量q_i。 b. 对于前面已经处理过的向量q_1, q_2, ..., q_{i-1},将它们与q_i进行正交化处理。即将q_i中与每一个已处理过的向量q_j的投影部分减去,使得q_i与q_j正交。投影的计算方法可以使用向量点乘。 c. 将正交化处理过的q_i归一化,使得q_i为单位向量。 d. 将归一化后的q_i存储到矩阵Q的第i行。 4. 遍历完所有向量之后,矩阵Q中的每一行就是线性无关向量组的正交基。即Q的每一行都是单位正交向量。 这样,我们就可以通过Python代码实现格拉姆角场的过程。具体实现的代码可以参考如下: ```python import numpy as np def gram_schmidt(V): n, m = V.shape Q = np.zeros((n, m)) for i in range(n): q_i = V[i] for j in range(i): q_i -= np.dot(Q[j], V[i]) / np.dot(Q[j], Q[j]) * Q[j] Q[i] = q_i / np.linalg.norm(q_i) return Q ``` 其中,V为表示线性无关向量组的矩阵,每一行代表一个向量。函数gram_schmidt会返回一个矩阵Q,其中每一行都是正交基。 ### 回答3: 格拉姆角场是用来对数据集进行降维处理的一种方法。它通过计算特征矩阵的协方差矩阵,然后对协方差矩阵进行特征值分解,找出与最大特征值对应的特征向量作为新的坐标轴,从而将数据集降维到更低维度的空间中。 在Python中,我们可以使用NumPy库来实现格拉姆角场算法。首先,需导入NumPy库: ```python import numpy as np ``` 接下来,我们可以定义一个函数来实现格拉姆角场算法。函数定义如下: ```python def gram_schmidt(X): # 计算特征矩阵的协方差矩阵 cov_matrix = np.cov(X.T) # 对协方差矩阵进行特征值分解 eig_vals, eig_vecs = np.linalg.eig(cov_matrix) # 找出与最大特征值对应的特征向量 max_eig_vec = eig_vecs[:, np.argmax(eig_vals)] # 返回降维后的数据 return np.dot(X, max_eig_vec) ``` 以上代码中,我们首先使用 `np.cov(X.T)` 计算特征矩阵X的协方差矩阵。然后,使用 `np.linalg.eig(cov_matrix)` 对协方差矩阵进行特征值分解,得到特征值和特征向量。接着,使用 `eig_vecs[:, np.argmax(eig_vals)]` 找出与最大特征值对应的特征向量。最后,使用 `np.dot(X, max_eig_vec)` 将数据矩阵与特征向量相乘,得到降维后的数据。 需要注意的是,格拉姆角场算法要求数据集的维度大于1。如果数据集的维度为1,则无法进行降维。 总结起来,以上就是格拉姆角场算法在Python中的实现方法。这个方法能够有效地将数据集降维,帮助我们更好地理解和处理数据
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值