2

2 つの行列 A と B があります。どちらにも名前のリストが含まれています。質問は類似度に基づいています。B から A の要素の最小距離 (行列全体) を見つけます。ハミング距離が 3 より大きい場合、データは行列 B に追加されます。そうでない場合は追加されません。例を挙げましょう

 A<-c("cvombiflam","combiflam")
 A<-as.matrix(A)

 B<-c("windfall","computer","baseball")
 B<-as.matrix(B)

ここで、A1 は B を検索し、ハミング距離に関して最も近い B のメンバーを見つけます。最も近いのは B2 です。B[2]で距離を求めます。最近接距離が 3 より大きいため、cvomiflam が B に追加されます。B は次のようになります。

 B<-c("windfall",
      "computer",
      "baseball",
      "cvombiflam")

これで、A の 2 番目の要素 ("combiflam") が B を検索します。最も近いのは、距離が 1 の B の 4 番目の要素 (cvombiflam ) です。したがって、combiflam は B に追加されません。最終的な B リストを更新したい

私が書いたコードは次のとおりです。

 for(i in 1:length(A))
 {    
      d<-min(stringdistmatrix(A[i],B)
      if(d>3)
      {            
           B<-rbind(B,A[i])
      }
 }   

今、私は約 140,000 の A マトリックスと 200,000 の B を持っています。コードは正常に動作していますが、実行に時間がかかります。もっと手っ取り早い方法を教えてください。

4

2 に答える 2

0

あなたのコードは、オブジェクトをB繰り返し成長させることを示唆しています ( B = rbind(B, A[i])。のメモリ サイズの要件が常に大きくなるため、これは非常に遅くなりますB。常にBメモリ単位で拡張すると非常に時間がかかり、ループが非常に遅くなります。これを解決するには、いくつかの方法があります。

  • ループの前に正しいサイズに事前に割り当てB、ループ内に埋めます。
  • applyスタイル ループを使用rbindし、最後に:

    list_of_results = lapply(A, stringdistmatrix, b = B)
    big_data_frame = do.call('rbind', list_of_results)
    

計算を高速化するその他のオプション:

  • 複数のコアを使用してください。 へのncores引数を参照してくださいstringdistmatrix
  • methodさまざまな距離測定 (引数) を試して、違いが生じるかどうかを確認してください。
于 2013-09-22T11:40:47.813 に答える