<p>正如ssm所说,numpy的关联函数对于这个问题很有效。你说过你对这个职位感兴趣。关联函数还可以帮助您判断一个序列与另一个序列的偏移量。在</p>
<pre><code>import numpy as np
def compare(a, b):
# 'full' pads the sequences with 0's so they are correlated
# with as little as 1 actual element overlapping.
crossCorrelation = np.correlate(a,b, 'full')
bestShift = np.argmax(crossCorrelation)
# This reverses the effect of the padding.
actualShift = bestShift - len(b) + 1
similarity = crossCorrelation[bestShift]
print('Shift: ' + str(actualShift))
print('Similatiy: ' + str(similarity))
return {'shift': actualShift, 'similarity': similarity}
print('\nExpected shift: 0')
compare([0,0,1,0,0], [0,0,1,0,0])
print('\nExpected shift: 2')
compare([0,0,1,0,0], [1,0,0,0,0])
print('\nExpected shift: -2')
compare([1,0,0,0,0], [0,0,1,0,0])
</code></pre>
<p><strong>编辑:</strong></p>
<p>在关联每个序列之前,您需要将它们规范化,否则较大的序列将和所有其他序列具有非常高的相关性。在</p>
<p>互相关的一个特性是:</p>
<p><img src="https://latex.codecogs.com/gif.latex?%5Csum%20CrossCorrelate%28f%2C%20g%29%20%3D%20%28%5Csum%20f%29%20*%20%28%5Csum%20g%29" alt="latex"/></p>
<p>所以,如果用每个序列除以它的和来规范化,相似度总是在0和1之间。在</p>
<p>我建议你不要取序列的绝对值。这会改变形状,而不仅仅是比例。例如np.abs([1,-2])==[1,2]。规范化将已经确保序列大部分是正的,加起来等于1。在</p>
<p><strong>第二次编辑:</strong></p>
<p>我意识到了。把信号想象成向量。规范化向量本身总是有一个最大点积。互相关只是在各种位移下计算的点积。如果像向量一样规范化信号(s除以sqrt(s dots s)),那么自相关总是最大和1。在</p>
^{pr2}$
<p>输出:</p>
<pre><code>[[ 1. 1. 0.97700842 0.86164044]
[ 1. 1. 0.97700842 0.86164044]
[ 0.97700842 0.97700842 1. 0.8819171 ]
[ 0.86164044 0.86164044 0.8819171 1. ]]
[[ 0. -2. 1. 0.]
[ 2. 0. 3. 2.]
[-1. -3. 0. -1.]
[ 0. -2. 1. 0.]]
</code></pre>