我正在对多项时间序列进行无监督学习(聚类和 DR)。我需要减少我的数据的维度,这些数据是稀疏的并且有很多维度。我意识到某种形式的张量分解可能是解决这个问题的最佳方法。我所拥有的是一组样本,每个样本都有一组及时的特征。每个时间长度可以不同,但每个样本都有相同的特征。
想要最终得到的是一组具有单一特征的样本。这样,我可以使用由动态时间扭曲确定的距离进行聚类。
这整个方案听起来合理吗?
TensorFlow 有一个功能tf.qr ( https://www.tensorflow.org/api_docs/python/tf/qr ) 可以进行张量分解,但我不太了解它背后的输出或数学以利用它。我已经尝试以看似成功的方式运行它,但我不明白存储在q和r输出张量中的内容。如果有人可以向我解释这一点,如果这甚至适用于我正在尝试做的事情,我将非常感激。
此外,我尝试使用 scikit 张量的cp分解(https://github.com/mnick/scikit-tensor/blob/master/sktensor/cp.py),它返回一个张量。我也不明白这个输出中存储了什么,或者它是否做了类似于 TensorFlow 的 tf.qr 函数或与我想做的事情相关的事情。
正如你现在可能知道的那样,我对数学很迷茫。我试图找到这些函数如何工作的解释,但我不能不跳入我不理解的多线性代数。如果有人能指出我正确的方向,我将不胜感激。
编辑:
如果s1和s2是两个多维时间序列,那么这应该计算它们之间的距离。我在 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
这是在做我认为它做的事情/论文所说的合适吗?