2012-02-16 4 views
0

У меня есть записи данных, где каждая запись представляет собой массив целых чисел различной длины в строго возрастающий заказ. Вот некоторые примеры:Измерение смежности массива

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

Предполагая, что вы имеете в виду 'sum_diff + = A [i] - A [i-1]' и что ваша гарантия монотонности сохраняется, обратите внимание, что данный алгоритм эквивалентен 'score = (length (A) - 1)/(A [length (A) -1] - A [0]) ', т. Е. Что значения в середине серии полностью не соответствуют общей оценке. – Weeble

+0

Я не могу интуитивно видеть, что * record_2 * должен иметь более высокий балл. Один разрыв последовательности в 8 звучит лучше, чем один из 5. –

+0

@Weeble: извините за ошибку, отредактировал мой вопрос, спасибо. –

ответ

1

Если вы рассматриваете зазор 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 является наименее оптимальной. Если вам это не нравится, достаточно просто return 1 - average of differenceMeasures.

+0

Я рассматриваю размеры зазора. Использование взаимности для «сглаживания» больших пробелов должно быть хорошей идеей. –

Смежные вопросы