简介
相信不少人会被这个标题唬住,什么叫SAX-VSM算法,其实并不难,容我细细道来。
首先它来自2013年的"SAX-VSM: Interpretable Time Series Classification Using SAX and Vector Space Model"这篇论文,全称为Symbolic Aggregate approXimation in Vector Space Model(在向量空间模型中进行符号聚合近似),其实就是先进行符号聚合近似(SAX),再进行词向量的转换(VSM),细心的朋友应该会发现第一节中简单介绍过SAX。
看到这里,你们可能会想这和时间序列的分类有什么关系呢?
实际上,这是一种把时间序列转换为字母的特征表达,然后使用自然语言处理(NLP)的方法来进行分类的方法。
在Pyts中呢,对于SAX的实现使用了词袋模型,对于词向量的转换则使用了tf-idf模型,所以它的本质就是数字-词转换+Tf-idf。那么如何进行分类的任务呢?只要计算余弦相似度就可以了。
(余弦相似度的百度百科)
所以,它的算法步骤分为以下五步(假设分类有两类):
1.对训练集中每一个时间序列进行窗口滑动抽取子序列。
2.对每一个子序列进行词转换为字母序列。
3.对字母序列进行tf-idf的向量转换,得到两类tf-idf向量。
4.对新的时间序列进行同样的转换,分别计算和两类tf-idf向量的余弦相似度。
5.两个相似度哪个更高,则把新的时间序列分为哪一类。
那么我们接下来先讲两个基本概念:
滑动窗口
可能有些朋友对滑动窗口没什么概念。。它长下面这样子:
比如目前窗口大小为4,步长为1,就是以1个数字为单位,里面有4个数字一起往右滑动,所以对上面这个序列进行抽取子序列的结果是:
主序列1:(0,1,2,3),(1,2,3,4),(2,3,4,5)
主序列2:(6,7,8,9),(7,8,9,10),(8,9,10,11)
抽取出了2x3总共六个子序列。
词转换
这里的词袋(bagofwords)其实更形象的说法是把数字变成字母(在0.11版本中将变成word_extractor,即文字提取),直接上代码,依旧以上面这两行序列作例子:
import numpy as np
from pyts.bag_of_words import BagOfWords
X = np.arange(12).reshape(2, 6