テキストファイル内のパターンを検索するための高速アルゴリズム

私は倍数の配列を持っています。約200,000行×100列です。パターンは、パターンが10〜100個のどこかのパターンに最も近いシーケンスを含む行を見つけるための高速なアルゴリズムを探しています。私はPythonを使用しているので、ブルートフォース方式(以下のコード:各行をループし、列インデックスを開始し、各点でユークリッド距離を計算する)には約3分かかります。

numpy.correlate関数は、この問題をはるかに高速に解決することを約束します(20秒以内に同じデータセットを実行する)。しかし、単純に完全な行に渡ってパターンのスライディングドット積を計算します。つまり、類似性を比較するために、結果を最初に正規化する必要があります。相互相関を正規化するには、データの各スライスの標準偏差を計算する必要があります。これは、最初にnumpy.correlateを使用する速度向上を即座に無効にします。

Pythonで正規化された相互相関を素早く計算することは可能ですか?または、Cでブルートフォース方式をコーディングする必要がありますか?

def norm_corr(x,y,mode='valid'):
    ya=np.array(y)
    slices=[x[pos:pos+len(y)] for pos in range(len(x)-len(y)+1)]
    return [np.linalg.norm(np.array(z)-ya) for z in slices]

similarities=[norm_corr(arr,pointarray) for arr in arraytable]
10
私はよく分からないので、ちょうどアイデアを投げている:おそらく、より速いスライディングメソッドは、stddevを計算することですか?
追加された 著者 liori,
私は好奇心を追加するつもりです:マシン上でコードを試してみましたが、7秒で実行されました。その量のスライスされた配列オブジェクトを作成しないようにすることをお勧めしますが、その方法をまだわかりません。
追加された 著者 user16873,

1 答え

データが2D Numpy配列の場合、2Dスライス(200000行からlen(パターン)列まで)を取り、すべての行のノルムを一度に計算できます。次に、forループ内のウィンドウを右にスライドさせます。

ROWS = 200000
COLS = 100
PATLEN = 20
#random data for example's sake
a = np.random.rand(ROWS,COLS)
pattern = np.random.rand(PATLEN)

tmp = np.empty([ROWS, COLS-PATLEN])
for i in xrange(COLS-PATLEN):
    window = a[:,i:i+PATLEN]
    tmp[:,i] = np.sum((window-pattern)**2, axis=1)

result = np.sqrt(tmp)
1
追加された
正確に私が探していたもの、ありがとう!
追加された 著者 sbrother,