我有数据记录,其中每条记录都是按严格递增顺序排列的不同长度的整数数组。以下是一些示例:
record_1 : 1,2,3,4,5,6,8,9,10
record_2 : 5,30,31,32,33,34,35,36
record_3 : 10,11,12,19,20
我想测量(或给出分数)每个数组的连续性,即数组的每个相邻元素“接近”的程度。目前我正在使用每个相邻数组元素的差之和(伪代码):
for i=2 to length(A) do
sum_diff += A[i] - A[i-1]
end
score = (length(A) - 1) / sum_diff
因此对于一个完美连续的数组(例如:1,2,3,4,5
),分数将为 1(最高分)。
但是对于连续但包含“跳转”的数据会出现问题,例如上面的record_2
,存在从5
到的“跳转” 30
。
对于上面的数据示例,使用我的算法的分数是:
record_1 : 0.89
record_2 : 0.23
record_3 : 0.4
它给 record_2
的分数低于 record_3
,但我们可以直观地看到 record_2
应该有更高的分数得分低于 record_3
,因为 record_2
是连续的,除了从 5
到 30
的跳转。
那么,有没有人知道我应该如何修改我的算法以提供更好的邻接性测量?先谢谢了。
最佳答案
如果您认为 2 的差距与 10 的差距一样糟糕,那么平均“相差一个”函数:
differenceMeasures[i] = A[i+1] - A[i] == 1 ? 1 : 0
return average of differenceMeasures
// Note that the average will be sum(differenceMeasures)/(n-1) since there's
// one less difference than there is number of array entries in 'A'.
如果您想考虑间隙大小,我建议使用以零为界的单调递减函数,例如往复函数:
differenceMeasures[i] = 1 / A[i+1] - A[i]
return average of differenceMeasures
// When the difference is 1, differenceMeasures gets 1.
// When 2, differenceMeasures gets 1/2. Etc...
在这两个函数中,1
是最佳分数,0
是最差的。如果您不喜欢这样,返回 1 - differenceMeasures 的平均值
就足够了。
关于arrays - 测量阵列连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312366/