给定M个实数的任意两个序列/向量,我可以使用各种度量/规范轻松计算它们的接近度或相关性。但是,是否有一种有效的结构来查找序列语料库中最接近的M序列,或者更长序列的最接近的子序列?滑动窗口将是天真/暴力的方法。有没有人知道更好的事情呢?
编辑:当我输入此内容时,我认为在K-d树中搜索的内容可能会起作用,其中每个偏移是M维空间中的单独维度?答案 0 :(得分:4)
加速结构(例如K-d树)的问题在于,随着维度(问题中的M)的增加,它们变得不那么有效。如果您的M非常大,那么使用线性搜索可能会更好。
如果你的M是中等大小(大约6个左右,作为一个球场猜测?),可能值得尝试一个K-d树。有更高维空间的搜索结构;我建议由Samet查找多维度量和度量数据结构的基础。
答案 1 :(得分:2)
如果一个滑动窗口可以工作,你可能正在做cross-correlation,在这种情况下你可以使用FFTs来更快地解决你的问题因子为O(n / log(n) )。
因此,如果你有一个向量V和一个C其他向量的语料库,并且所有向量的大小为N,则滑动窗口解决方案将花费O(N ^ 2 * C)时间。通过使用FFT,您可以将单个滑动窗口从O(N ^ 2)减少到O(N log N),因此总时间将为O(CN log N)。
如果您不熟悉FFT,那么在使用它们之前您可能需要阅读它们,但总体思路是:
# If you forget to take the complex conjugate of V you'll be doing a
# convolution instead of a correlation
V' := Fft(Conjugate(V))
for each vector W in C:
W' := Fft(W)
P := W' * V' # Multiplication here is the dot product
R := inverse_Fft(P)
# Check through the vector R for any spikes, a large value at
# R[i] indicates that if you shift W' by i then it will
# correlate strongly with W
注意事项:
1)如果你正在做相关性,你需要对你的向量进行标准化,或者至少做一些事情以确保你没有从其值比其他向量更大且更积极的向量得到误报。如果你的是一个寻找噪音信号的典型用例,那么你就没事了。
2)在假设所有这些信号都是圆形的情况下,FFT相关。如果您不想将它们视为圆形,则需要在每个向量的末尾添加0的缓冲区以使其长度加倍。