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( "combiflam")の2番目の要素がBを検索します。最も近いのは距離が1のB(cvombiflam)の4番目の要素です。したがってcombiflamはBに追加されません。最後のBリストを更新したいです。
私が書いたコードは次のとおりです。
for(i in 1:length(A))
{
d<-min(stringdistmatrix(A[i],B)
if(d>3)
{
B<-rbind(B,A[i])
}
}
これで、Aマトリックスが約140,000、Bマトリックスが200,000になりました。コードは正常に機能していますが、実行には時間がかかります。もっと速い方法を教えてください。
B
コストがかかり、メモリスペースが断片化する可能性がある、何度も成長する代わりに、のベクトルを格納および更新するか、の要素を追加する必要があるかどうTRUE
かをFALSE
示すことができます。次に、最後にのみ、これらの選択した要素をに追加します。A
B
B
注意すべきもう1つの点は、ベクトルのみが必要な場合は、どこでも行列を使用していることです。私はあなたのためにそれを修正しました。
A <- as.vector(A)
B <- as.vector(B)
add.A <- rep(FALSE, length(A))
for(i in 1:length(A)) {
if (i %% 1000L == 0L) cat(sprintf("%.2f percent completed", 100 * i / length(A)))
d.B <- stringdist(A[i], B)
d.A <- stringdist(A[i], A[add.A])
d <- min(c(d.B, d.A))
if (d > 3) {
add.A[i] <- TRUE
}
}
B <- c(B, A[add.A])
その問題に対処しても、問題の次元はまだ巨大です。多くの距離(少なくともlength(A) * length(B)
)が計算される必要があり、これには多くの時間がかかります。cat
ループ内にを追加して、実行にかかる時間を把握できるようにしました。試してみて、どれだけ遅いか速いかについてコメントしてください。
また、共通の項目がある場合はA
、次のB
ようにすることで、最初に問題の次元を減らすことができます。
A <- unique(A)
B <- unique(B)
A <- setdiff(A, B)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加