11/29 第8回 数値解析, パターン認識


前回までの補足


スライドの補足


10/25の課題について


スライドに使われたプログラム

一文字の類似度を返すメソッドq

# s0のi-1文字目とs1のj-1文字目の
# 類似度を返す
def q(i,j)
  if $s0[i-1] == $s1[j-1]
    return 2
  else
    return -1
  end
end

トレースバック

i = m;  j = n
while i>0 && j>0
  if a[i][j] == a[i][j-1] + g
    gap0[i] += 1;  j -= 1
  elsif a[i][j] == a[i-1][j-1] + q(i, j)
    i -= 1;  j -= 1
  elsif a[i][j] == a[i-1][j] + g
    gap1[j] += 1;  i -= 1
  end
end

トレースバックの表示

for i in 0..m-1
  for k in 1..gap0[i]
    print "-"
  end
  print $s0[i..i]
end
puts ""

前向きアルゴリズム

for i in 0..nn-1
  a[0][i] = $init[i]*$out[i][input[0]]
end
for t in 1..tt-1
  for i in 0..nn-1
    p = 0.0
    for j in 0..nn-1
      p += a[t-1][j]*$trans[j][i]
    end
    a[t][i] = p*$out[i][input[t]]
  end
end
r = 0.0
for i in 0..nn-1
  r += a[tt-1][i]
end

Viterbiのアルゴリズム

for i in 0..nn-1
  d[0][i] = $init[i]*$out[i][input[0]]
end
for t in 1..tt-1
  for i in 0..nn-1
    p = 0.0;  k = 0
    for j in 0..nn-1
      if (d[t-1][j]*$trans[j][i] > p)
        p = d[t-1][j]*$trans[j][i];  k = j
      end
    end
    d[t][i] = p*$out[i][input[t]];  prev[t][i] = k
  end
end
r = 0.0;  m = 0
for i in 0..nn-1
  if (d[tt-1][i] > r)
    r = d[tt-1][i];  m = i
  end
end

今日の課題

12/6の講義のページの穴埋めプログラムに誤りがあることが分かったので,提出期限を12/20(水) 21:00に延長しました.