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ため、30から5から「ジャンプ」があります。上記のデータ例えば

、私のアルゴリズムを使用して、スコアは以下のとおりです。

record_1 : 0.89 
record_2 : 0.23 
record_3 : 0.4 

それはrecord_3より低いrecord_2に得点できますが、我々は直感的にrecord_2であるためrecord_2record_3よりも高いスコアを持っている必要があることがわかりことができます5から30へのジャンプ以外は連続しています。

したがって、より正確な連続性測定を行うためにアルゴリズムを変更する方法はありますか?前にありがとう。

+2

sum_diff + = A [i] - A [i-1] 'を意味し、単調性の保証が成り立つと仮定すると、与えられたアルゴリズムは' score =(length(A)-1)/ (A [長さ(A)-1] - A [0]) '、すなわち、シリーズの中間の値は全体のスコアと完全に無関係である。 – Weeble

+0

私は直感的に* record_2 *が高いスコアを持つことは理解できません。 8でのシーケンスの1つのブレークは、5の1より良いサウンド。 –

+0

@Weeble:間違って申し訳ありません、私の質問を編集、ありがとう。 –

答えて

1

あなたは10のギャップと同じくらい悪いと2のギャップを検討している場合、関数「一つ違い」平均:

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'. 

あなたはギャップを取りたい場合は、アカウントにサイズ、Iは単調減少関数を使用することをお勧めします往復のようにゼロに囲ま:これらの機能1の両方において

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... 

0で最適なスコアが最も最適です。それが気に入らなければ、return 1 - average of differenceMeasuresまでは簡単です。

+0

ギャップサイズを考慮します。往復運動を使って大きなギャップを「滑らかに」することは良い考えです。 –

関連する問題