ワグナー・フィッシャーアルゴリズムとdtwアルゴの間をどのように平行に描くかわかりません。どちらの場合も、各インデックスの組み合わせ(i、j)の距離を求めます。
ワーグナーフィッシャーでは、空の文字列から別の文字列への挿入回数によって距離を開始します。
let wagnerFischer (s: string) (t: string) =
let m, n = s.Length, t.Length
let d = Array2D.create (m + 1) (n + 1) 0
for i = 0 to m do d.[i, 0] <- i
for j = 0 to n do d.[0, j] <- j
for j = 1 to n do
for i = 1 to m do
d.[i, j] <- List.min [
d.[i-1, j ] + 1;
d.[i , j-1] + 1;
d.[i-1, j-1] + if s.[i-1] = t.[j-1] then 0 else 1; ]
printfn "edit matrix \n %A" d
d.[m,n]
DWTでは、+ infinityで境界を開始します。これは、シーケンスの番号を「スキップ」したくないため、常に別のアイテムと一致させたいためです。
DWTとWFアルゴの間で距離を均一に更新するための使用を妨げている変更は、私にはわかりません。DWTでは体系的にコストを追加しますが、WFアルゴでは、さまざまなケースでこの非固有関数を使用します
私は両方のアルゴリズムを理解していますが、コスト関数の更新におけるそれらの違いを結び付けないでください。違いを直感的に理解するためのアイデアはありますか?
let sequencebacktrack (s: 'a seq) (t:'a seq) (cost:'a->'a->double) (boundary:int->double) =
let m, n = s |> Seq.length, t |> Seq.length
let d = Array2D.create (m + 1) (n + 1) 0.
for i = 0 to m do d.[i, 0] <- boundary(i)
for j = 0 to n do d.[0, j] <- boundary(j)
t |> Seq.iteri( fun j tj ->
s |> Seq.iteri( fun i si ->
d.[1+i, 1+j] <- cost tj si + List.min [d.[1+i-1, 1+j ];
d.[1+i , 1+j-1];
d.[1+i-1, 1+j-1]; ] ))
printfn "edit matrix \n %A" d
d.[m,n]
//does not work
let wagnerFischer2 (s: string) (t: string) =
sequencebacktrack s t (fun a b -> if a = b then 0. else 1.) (id >> double)
let b = wagnerFischer2 "ll" "la"
2
ソースコードを取り除くことで(リンクで十分です)、質問を改善できますが、代わりに、2つのアルゴリズムの違いをより明確に強調する必要があります。彼らは同じ再帰を使用していますが、テーブルを異なる順序で処理していますか?初期化だけが違うのですか?誰もソースコードを解析したくありません。また、両方のアルゴリズムが計算するもの、レベンシュタイン距離を明確にしますか?
—
A.Schulz
DWT = DTW?「ダイナミックタイムワープ」についてはよく知りませんが、紹介の参考資料にリンクしていただけませんか。
—
ラファエル
(参照)David Sankoff、Joseph Kruskal:タイムワープ、文字列編集、および高分子:シーケンス比較の理論と実践。1983年、1999年に再発行
—
ヘンドリック月