目录
为什么要对时间序列进行图像编码
来源:
Wang 等人写的一篇论文:Imaging Time-Series to Improve Classification and Imputation,通过将时间序列图像化提高分类和推断。
他将流量的每个字节转换成像素,由此来把流量转换为图片,再将图片作为CNN的输入进行训练与分类,得到的二分类和多分类准确率分别是100%和99.17%。
为什么对时间序列图像化能够提高模型的分类准确率?
因为一维信号可能存在数据维度和丰富度的不足,限制了模型从数据中中提取出复杂特征和特征局部相关性的能力。
GAF(Gramian Angular Field)将时间序列映射为图像,侧重于周期性和幅度信息的表达,增加了数据的维度和丰富度。
Python-pyts库
pyts库是一个用于时间序列分析的开源Python库。它提供了一系列的数据预处理方法、特征提取技术以及常用的机器学习模型,可以用于单变量和多变量时间序列数据分析。
使用格拉姆角场GramianAngularField函数
先导入pyts库
pip install pyts
导入脉率变异性数据。data_x 维度是90×80,即90个样本,80维特征。
# 导入数据HappyHeartRate
data = pd.read_csv("../AnxietyPPData.csv")
data_x = data.iloc[:,0:80]#选择输入数据
data_y = data.iloc[:,80]#选择输出数据
进行归一化。将数据缩放到一个固定的范围(0到1),使得不同特征的数据在同一尺度上,便于比较和计算。(按列计算,把每一列特征都缩放到0~1)
#归一化化处理
from sklearn import preprocessing
mm = preprocessing.MinMaxScaler()
data_x = mm.fit_transform(data_x)
print(data_x)
data_y = np.array(data_y )
data_y = data_y.reshape(-1, 1)
使用格拉姆角场函数对数据进行变换,并显示图像化的图片
Anxiety = []
j = 0
for i in data_x:
# 格拉姆角场函数要求数据输入格式为(1,-1),因此要把i变成二维的
data = np.array(i).reshape(1, -1)
# 这里的image_size=80是因为数据有80维特征,所以构建80*80的图片
gadf = GramianAngularField(image_size=80, method='difference')
X_gadf = gadf.fit_transform(data)
print(X_gadf)
Anxiety.append(X_gadf)
plt.figure(figsize=(5, 5))
# cmap='rainbow'指定了颜色映射方案为彩虹色
# origin='lower'表示图像的原点在左下角
plt.imshow(X_gadf[0], cmap='rainbow', origin='lower')
plt.tight_layout()# 自动调整子图参数,使之填充整个图像区域,避免重叠
plt.axis('off')
# plt.savefig("." + str(j) + ".jpg",dpi=600,pad_inches=0.0,bbox_inches = 'tight')
plt.show()
j = j+1
然后将变换后的图像数据保存成MATLAB格式
import scipy.io
import scipy.io as scio
scipy.io.savemat('Anxiety.mat', {'Anxiety': Anxiety})
需要用数据的时候再加载数据
dataAnxiety = scio.loadmat('Anxiety.mat')
dataSad = scio.loadmat('Sad.mat')
dataHappy = scio.loadmat('Happy.mat')
dataStress = scio.loadmat('Stress.mat')
dataPeace = scio.loadmat('Peace.mat')
使用马尔可夫变迁场MarkovTransitionField函数
马尔可夫变迁场和格拉姆角场是同一篇论文提出来的,所以使用的时候只需要把上面代码的GramianAngularField改成MarkovTransitionField函数就行。
Anxiety = []
j = 0
for i in data_x:
data = np.array(i).reshape(1, -1)
mtf = MarkovTransitionField(image_size=80)
X_mtf = mtf.fit_transform(data)
Anxiety.append(X_mtf)
使用递归图RecurrencePlot函数
RecurrencePlot函数也是pyts库写好的函数,可以直接用。
Anxiety = []
for i in data_x:
data = np.array(i).reshape(1, -1)
rp = RecurrencePlot(threshold='point', percentage=20)
X_rp = rp.fit_transform(data)
Anxiety.append(X_rp)