我有两个信号,我想比较它们的相似性。一个比另一个小(按时间)。 如果我使用相关性来找到最高相似度,它会告诉我最高值位于我意想不到的值。
如果我只是认为“错误”,或者关联是解决此类问题的错误工具,有人可以给我一个提示吗?
我的设置:
import numpy
import matplotlib.pyplot as plt
signal_a = numpy.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
signal_b = numpy.array([28, 22])
correlations = numpy.correlate(signal_a, signal_b, mode = "full")
print(correlations)
plt.plot(correlations)
[28, 22] 的最高相关性是在位置 [..., 30, 20, ...] 处计算的。 我明白了这个公式以及为什么它是 1280。 但我实际上正在寻找 [..., 28, 22, ...] 因为它正是(在这种情况下)我正在寻找的(信号 B)。
相关性是正确的做法吗?我发现了很多使用相关性来检测相似性的来源。相同的值不应该比其他值更相似吗?
解决您的问题的一个可能的解决方案是均方误差(MSE)。给定两个相同维度的信号
a
和 b
,MSE 是 a
和 b
之差的逐元素平方的平均值。代码如下所示(基于this):
import numpy as np
import matplotlib.pyplot as plt
a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
b = np.array([28, 22])
mse = np.ndarray((len(a) - len(b) + 1))
for i in range(mse.size):
mse[i] = np.square(np.subtract(a[i:i+len(b)],b)).mean()
print(mse.argmin())
plt.plot(mse)
您可以通过查看值的差异来检测相似性,而不是查看相关性。 例如,您可以选取 a 中的每 2 个元素(如果 b 的长度为 2)并查看差异的绝对值:
import numpy as np
import matplotlib.pyplot as plt
signal_a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
signal_b = np.array([28, 22])
N2 = len(signal_b)
diffs = []
for i in range(len(signal_a) - len(signal_b) + 1):
diff_ab = signal_a[i:i+N2] - signal_b
diffs.append(sum(abs(diff_ab)))
print(diffs)
plt.plot(diffs)
并在 diffs 数组中找到最小值。 您也可以使用差值的平方值来代替abs()。