2012-01-22 8 views
1

データセット内のパターンをプログラムで検出する方法はありますか?たとえば、次のデータがある場合、最初の列が6行ごとに繰り返され、2番目の列が7行ごとに繰り返されることがわかります。データセット内のパターンをプログラムで検出しますか?

2 3 
1 1 
5 2 
4 5 
3 7 
2 6 
1 3 
5 1 
4 2 
3 5 
2 7 

実際のデータはこれよりはるかに複雑です。私はPHPまたはJavaを使用することができます。このためのライブラリや関数はありますか?

+4

これはプログラム的に行うことができますが、数字セットの任意のパターンを任意に検出するライブラリや関数はありません。 – dqhendricks

+0

探したいパターンをすべて列挙できたら、それを検出するコードを書くことができます。 –

+0

LZWのような圧縮アルゴリズムを理解しようとすると多くの助けになるかもしれません。 – piotrm

答えて

2

私は参考になるものはありませんが、これらのかなり単純なパターンの場合は、auto correlationとします。基本的には、配列がさまざまなデルタとどれほどうまく関連しているかを知ることができます。 +1は数字が完全に相関していることを意味し、0はお互いに対して「完全に」ランダムであることを意味し、-1は互いに完全に「反対」であることを意味するように定義される。完全な相関があなたのケースでは、すべての時間

あり、デルタ= 0の場合

、あなたが自分自身にデータを比較している、に、最初の列も持つピーク(数ほぼ1)が表示されますデルタが6、デルタが7の2番目の列。

Javaの場合、​​をチェックします。

0

ここでは無理な力があります。アイデアは、配列のすべてのサブセット(最初の要素、次に最初の2つの要素、最初の3つの要素など)をテストし、そのうちのどれかが配列にパターンとして現れるかどうかを確認することです。

私はそうは保証、その場でこれを書いていない:)

boolean hasPattern(int[] data) { 
    ArrayList<Integer> matchList = new ArrayList<Integer>(); 

    for (int i = 0; i < data.length; i++) { 
     matchList.add(i); 

     if (matchPattern(data, matchList)) 
      return true; 
    } 

    return false; 
} 

boolean matchPattern(int[] data, ArrayList<Integer> pattern) { 
    for (int i = 0; i < data.length; i++) 
     if (data[i] != pattern.get(i % pattern.size()) 
      return false; 

    return true; 
} 
0

は "matchList.add(データ[i])と" と "matchList.add(I)" を交換し、それは素晴らしい作品:

static boolean hasPattern(int[] data) { 
    ArrayList<Integer> matchList = new ArrayList<Integer>(); 

    for (int i = 0; i < data.length; i++) { 
     matchList.add(data[i]); 

     if (matchPattern(data, matchList)) 
      return true; 
    } 

    return false; 
} 

static boolean matchPattern(int[] data, ArrayList<Integer> pattern) { 
    for (int i = 0; i < data.length; i++) 
     if (data[i] != pattern.get(i % pattern.size())) { 
      return false; 
     } 

    return true; 
} 
関連する問題