Khoảng cách Levenstein và độ cong thời gian động


7

Tôi không chắc chắn làm thế nào để vẽ song song giữa thuật toán Wagner của Fischer và dtw algo. Trong cả hai trường hợp, chúng tôi muốn tìm khoảng cách của mỗi kết hợp chỉ mục (i, j).

Trong Wagner hay Fischer, chúng tôi bắt đầu khoảng cách bằng số lần chèn mà chúng tôi phải thực hiện từ chuỗi này sang chuỗi khác.

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]

trong DWT, chúng tôi bắt đầu ranh giới ở + vô cùng vì chúng tôi không muốn 'bỏ qua' bất kỳ số nào của chuỗi, chúng tôi luôn muốn khớp với một mục khác.

Những gì tôi không thấy là những gì thay đổi giữa DWT và WF algo ngăn không cho sử dụng để cập nhật khoảng cách theo cách đồng nhất. Trong DWT, chúng tôi thêm chi phí một cách có hệ thống, trong khi trong thuật toán WF, chúng tôi có chức năng không phải là nhà này, viết các trường hợp khác nhau

Tôi hiểu cả hai thuật toán, nhưng không tạo ra sự liên quan giữa những khác biệt trong cập nhật hàm chi phí .. Có ý tưởng nào để hiểu sự khác biệt bằng trực giác không?

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
Bạn có thể cải thiện câu hỏi của mình, bằng cách loại bỏ mã nguồn (một liên kết đủ), nhưng thay vào đó, bạn nên làm nổi bật sự khác biệt giữa hai thuật toán rõ ràng hơn. Họ có sử dụng cùng một đệ quy nhưng xử lý bảng theo một thứ tự khác không? Là chỉ khởi tạo khác nhau? Không ai muốn phân tích cú pháp thông qua mã nguồn. Cũng làm rõ, những gì cả hai thuật toán tính toán, khoảng cách Levenstein, phải không?
A.Schulz

1
DWT = DTW? Tôi không quen thuộc với "warp time time", bạn có thể vui lòng liên kết đến một tài liệu tham khảo giới thiệu không?
Raphael

1
(tham khảo) David Sankoff, Joseph Kruskal: Warps Time, Chỉnh sửa chuỗi và Macromolecules: Lý thuyết và thực hành so sánh trình tự. 1983, phát hành lại vào năm 1999.
Hendrik ngày 1 tháng

Câu trả lời:


5

Thực tế có một loạt các thuật toán liên quan. Trong bối cảnh hiện đại, tôi tin rằng "thời gian chênh vênh" sẽ được gọi là căn chỉnh trình tự . Tùy thuộc vào việc bạn muốn khớp chuỗi hoàn chỉnh hay chuỗi con tối ưu, người ta sẽ cần Needman-WunschSmith-Waterman .

Trong thuật toán sau của bạn, các chi phí dường như thay đổi, đó là chi phí có thể quy cho các chi phí khác nhau để xóa và chèn một ký tự, cũng như thay đổi các ký tự. Thuật toán đầu tiên của bạn dường như khắc phục các chi phí này thành1 cho cả ba thay đổi có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.