我有数据记录,其中每条记录是严格增加的顺序的各种长度的整数数组。以下是一些例子:
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
之外,{1}}是连续的。
那么,有没有人知道如何修改我的算法以提供更好的连续性测量?谢谢。
答案 0 :(得分:1)
如果您认为2的差距与10的差距一样差,那么平均“不同于1”的函数:
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
的最佳分数是最不理想的。如果您不喜欢这样,return 1 - average of differenceMeasures
就足够了。