回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图比较几个数据集,基本上测试它们是否显示相同的特性,尽管这个特性可能会被移动、反转或减弱。
下面是一个非常简单的例子:</p>
<pre><code>A = np.array([0., 0, 0, 1., 2., 3., 4., 3, 2, 1, 0, 0, 0])
B = np.array([0., 0, 0, 0, 0, 1, 2., 3., 4, 3, 2, 1, 0])
C = np.array([0., 0, 0, 1, 1.5, 2, 1.5, 1, 0, 0, 0, 0, 0])
D = np.array([0., 0, 0, 0, 0, -2, -4, -2, 0, 0, 0, 0, 0])
x = np.arange(0,len(A),1)
</code></pre>
<p><a href="https://i.stack.imgur.com/1wvX7.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1wvX7.png" alt="That look like this"/></a></p>
<p>我认为最好的方法是将这些信号归一化,得到绝对值(在这个阶段,它们的衰减对我来说并不重要,我对位置感兴趣。。。但我可能错了,所以我也欢迎对这个概念的思考)并计算它们重叠的面积。{我看起来很简单,但是我很难理解。在</p>
^{pr2}$
<p>然后看起来像这样:
<a href="https://i.stack.imgur.com/XPjuo.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XPjuo.png" alt="![Normalized"/></a></p>
<p>但是,当我试图从答案中实施解决方案时,我遇到了问题。在</p>
<p><strong>旧的</strong></p>
<pre><code>for c1,w1 in enumerate([a,b,c,d]):
for c2,w2 in enumerate([a,b,c,d]):
w1 = np.abs(w1)
w2 = np.abs(w2)
M[c1,c2] = integrate.trapz(min(np.abs(w2).any(),np.abs(w1).any()))
print M
</code></pre>
<p>产生<code>TypeError: 'numpy.bool_' object is not iterable</code>或{<cd2>}。但我只包括了<code>.any()</code>,因为没有它们,我得到的是{<cd4>}。在</p>
<p><strong>编辑-新建</strong>
(谢谢@Kody King)</p>
<p>新代码现在是:</p>
<pre><code>M = np.zeros([4,4])
SH = np.zeros([4,4])
for c1,w1 in enumerate([a,b,c,d]):
for c2,w2 in enumerate([a,b,c,d]):
crossCorrelation = np.correlate(w1,w2, 'full')
bestShift = np.argmax(crossCorrelation)
# This reverses the effect of the padding.
actualShift = bestShift - len(w2) + 1
similarity = crossCorrelation[bestShift]
M[c1,c2] = similarity
SH[c1,c2] = actualShift
M = M/M.max()
print M, '\n', SH
</code></pre>
<p>以及输出:</p>
<pre><code>[[ 1. 1. 0.95454545 0.63636364]
[ 1. 1. 0.95454545 0.63636364]
[ 0.95454545 0.95454545 0.95454545 0.63636364]
[ 0.63636364 0.63636364 0.63636364 0.54545455]]
[[ 0. -2. 1. 0.]
[ 2. 0. 3. 2.]
[-1. -3. 0. -1.]
[ 0. -2. 1. 0.]]
</code></pre>
<p>移位矩阵现在看起来不错,但实际的相关矩阵不好。我真的很困惑,因为最小的相关值是用来与d本身相关的。我现在想要实现的是:</p>
<hr/>
<p><strong>编辑-更新</strong></p>
<p>按照建议,我使用了推荐的标准化公式(将信号除以其和),但问题没有解决,只是颠倒过来了。现在d和d的相关性是1,但是所有其他的信号都与它们本身不相关。在</p>
<p>新输出:</p>
<pre><code>[[ 0.45833333 0.45833333 0.5 0.58333333]
[ 0.45833333 0.45833333 0.5 0.58333333]
[ 0.5 0.5 0.57142857 0.66666667]
[ 0.58333333 0.58333333 0.66666667 1. ]]
[[ 0. -2. 1. 0.]
[ 2. 0. 3. 2.]
[-1. -3. 0. -1.]
[ 0. -2. 1. 0.]]
</code></pre>
<hr/>
<ol>
<li>为了使信号与其自身相关,相关值应为最高值(即在主对角线上具有最高值)。在</li>
<li>为了得到介于0和1之间的相关值,因此,我将在主对角线上使用1,在其他地方使用其他数字(0.x)。在</li>
</ol>
<p>我希望M=M/M.max()可以完成这项工作,但前提是条件1得到满足,而目前还没有满足</p>