TensorFlow 中的张量分解用于多项时间序列降维

数据挖掘 Python 张量流 降维
2022-02-15 05:46:06

我正在对多项时间序列进行无监督学习(聚类和 DR)。我需要减少我的数据的维度,这些数据是稀疏的并且有很多维度。我意识到某种形式的张量分解可能是解决这个问题的最佳方法。我所拥有的是一组样本,每个样本都有一组及时的特征。每个时间长度可以不同,但​​每个样本都有相同的特征。

想要最终得到的是一组具有单一特征的样本。这样,我可以使用由动态时间扭曲确定的距离进行聚类。

这整个方案听起来合理吗?

TensorFlow 有一个功能tf.qr ( https://www.tensorflow.org/api_docs/python/tf/qr ) 可以进行张量分解,但我不太了解它背后的输出或数学以利用它。我已经尝试以看似成功的方式运行它,但我不明白存储在qr输出张量中的内容。如果有人可以向我解释这一点,如果这甚至适用于我正在尝试做的事情,我将非常感激。

此外,我尝试使用 scikit 张量的cp分解(https://github.com/mnick/scikit-tensor/blob/master/sktensor/cp.py),它返回一个张量。我也不明白这个输出中存储了什么,或者它是否做了类似于 TensorFlow 的 tf.qr 函数或与我想做的事情相关的事情。

正如你现在可能知道的那样,我对数学很迷茫。我试图找到这些函数如何工作的解释,但我不能不跳入我不理解的多线性代数。如果有人能指出我正确的方向,我将不胜感激。

编辑:

如果s1s2是两个多维时间序列,那么这应该计算它们之间的距离。我在 python 中尝试过,它实际上输出了一个数字,但我不知道我是否理解正确。它的行为方式与 DTW 的一维行为相同,但在计算给定时间点的距离时,它采用所有特征的 MSE 之和,而不是仅其中一个特征。此外,这个 DTW 函数有一个时间窗口,它设置为 10,但当然可以改变......

def MDTWDistance(s1, s2, window=10, num_columns=1):

    DTW={}
    w = max(window, abs(len(s1)-len(s2)))

    for i in range(-1,len(s1)):
        for j in range(-1,len(s2)):
            DTW[(i, j)] = float('inf')
    DTW[(-1, -1)] = 0

    for i in range(len(s1)):
        for j in range(max(0, i-w), min(len(s2), i+w)):
            dist= mdist(s1.loc[i], s2.loc[j], num_columns)
            print i, j, dist
            DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])

    return np.sqrt(DTW[len(s1)-1, len(s2)-1]) 

和...

def mdist(a, b, num_col):

    dist = 0
    for col in range(num_col):
        dist = dist + (a[col]-b[col])**2
        print a[col], b[col]
    return dist

这是在做我认为它做的事情/论文所说的合适吗?

1个回答

“每个时间长度可以不同,但​​每个样本都有相同的特征。” 您可以使它们的长度相同,请参见 http://www.cs.ucr.edu/~eamonn/DTW_myths.pdf的神话 1

“想要结束的是一组具有单一时间特征的样本”如果多项时间序列是“相关的”,这可能会起作用,请参见 http://www.cs.ucr.edu/~eamonn/的图 1 Multi-Dimensional_DTW_Journal.pdf 否则,这是一个非常非常糟糕的主意。

“有了它,我可以使用由动态时间扭曲确定的距离进行聚类。” 当然可以,但是您可以在 DTW 下使用多项时间序列进行聚类。看到]。

--

[a] Nurjahan Begum、Liudmila Ulanova、Jun Wang、Eamonn Keogh(2015 年)。使用新的可接受剪枝策略加速动态时间扭曲聚类 SIGKDD 2015