相似性可以意味着什么(1个系数是完美匹配,0或更低-根本不匹配):
- 640到660点-非常相似(系数约为0.8)
- 670到690个点-相当相似(系数约为0.5-〜0.6)
- 720到780个点-假设相当相似(系数约为0.5-〜0.6)
- 790到810个点-完全相似(系数为1)
我阅读了SO上的许多帖子,但似乎没有解决我的问题。我会非常感激您的帮助。谢谢。
P.S.完美的答案将是提供一个函数的伪代码,该函数可以接受两个数据数组为参数(数据区间),并返回相似性系数。
点击此处查看要比较的点:链接
我认为HighPerformanceMarks的建议是完成工作的标准方式。
一个计算轻量级的替代方法可能是点积。
点积不会是负数。如果两个向量在它们的向量空间中是垂直的,那么点积将为0(事实上这就是“垂直”在更高维度中通常的定义),并且对于相同的向量它将达到最大值。
如果您接受垂直性的几何概念作为(不)相似性度量,那么这里就是解决方案。
注意: 这是一种选择计算效率的特定启发式方法。我无法告诉您该过程和分离属性的数学/统计属性 - 如果您需要严格的分析,您可能会更好地使用相关理论,并应该将您的问题转发给math.stackexchange.com。
我的尝试:
Total_sum=0
1. For each index i in the range (m,n)
2. sum=0
3. k=Array1[i]*Array2[i]; t1=magnitude(Array1[i]); t2=magnitude(Array2[i]);
4. k=k/(t1*t2)
5. sum=sum+k
6. Total_sum=Total_sum+sum
Coefficient=Total_sum/(m-n)
另一个选择是执行广泛的xnor操作。
1. For each index i in the range (m,n)
2. sum=1
3. k=Array1[i] xnor Array2[i];
4. k=k/((pow(2,number_of_bits))-1) //This will scale k down to a value between 0 and 1
5. sum=(sum+k)/2
Coefficient=sum
这个有帮助吗?
v
,比较v || 0
和0 || v
将会得到一个糟糕的结果,尽管它们非常相似。必须使用一些对齐方式。 - amit你可以为长度为N的包含区间[-1, 1]中的数字的两个向量A和B定义距离度量,例如:
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为true,则最终(分化)数组将被排序。
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运行傅里叶变换,然后对返回的频谱进行距离度量。