您可以为长度为 N 的两个向量 A 和 B 定义距离度量,其中包含区间 [-1, 1] 中的数字,例如
sum = 0
for i in 0 to 99:
d = (A[i] - B[i])^2 // this is in range 0 .. 4
sum = (sum / 4) / N // now in range 0 .. 1
现在,对于完全相反的向量(一个全为 1,另一个全为 -1)返回距离 1,对于相同的向量返回 0。
您可以通过以下方式将其转换为您的系数
coeff = 1 - sum
然而,这是一种粗略的方法,因为它没有考虑到您要比较的信号之间可能存在水平失真或偏移的事实,所以让我们看看一些应对方法。
您可以对两个数组进行排序(例如按升序),然后计算距离/系数。这比原始度量返回更多相似性,并且与信号的排列/移位无关。
您还可以计算差异并计算距离/系数,然后您也可以进行排序。使用微分的好处是它消除了垂直偏移。排序差异消除了水平偏移,但仍然比排序的原始数据点更好地识别不同的形状。
然后,您可以例如平均不同的系数。这里有更完整的代码。下面的例程计算给定大小的数组 A 和 B 的系数,并首先(递归地)取 d 个微分。如果 sorted 为真,则对最终(微分)数组进行排序。
procedure calc(A, B, size, d, sorted):
if (d > 0):
A' = new array[size - 1]
B' = new array[size - 1]
for i in 0 to size - 2:
A'[i] = (A[i + 1] - A[i]) / 2 // keep in range -1..1 by dividing by 2
B'[i] = (B[i + 1] - B[i]) / 2
return calc(A', B', size - 1, d - 1, sorted)
else:
if (sorted):
A = sort(A)
B = sort(B)
sum = 0
for i in 0 to size - 1:
sum = sum + (A[i] - B[i]) * (A[i] - B[i])
sum = (sum / 4) / size
return 1 - sum // return the coefficient
procedure similarity(A, B, size):
sum a = 0
a = a + calc(A, B, size, 0, false)
a = a + calc(A, B, size, 0, true)
a = a + calc(A, B, size, 1, false)
a = a + calc(A, B, size, 1, true)
return a / 4 // take average
对于完全不同的东西,您还可以使用 FFT 运行傅里叶变换,然后对返回的光谱进行距离度量。