PowerPoint Presentation

Similar documents
PowerPoint Presentation

11yama

進捗状況の確認 1. gj も gjp も動いた 2. gj は動いた 3. gj も動かない 2

アルゴリズム入門

A Constructive Approach to Gene Expression Dynamics

算法の設計と評価

論理と計算(2)

PowerPoint プレゼンテーション

Microsoft PowerPoint - アルデIII 10回目12月09日

アルゴリズム入門

PowerPoint Presentation

論理と計算(2)

Microsoft PowerPoint - 5Chap15.ppt

Microsoft PowerPoint - ca ppt [互換モード]

PowerPoint プレゼンテーション

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

生命情報学

Microsoft PowerPoint - w5.pptx

Prog1_10th

文字列探索

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Microsoft PowerPoint - mp11-06.pptx

Microsoft PowerPoint - 11th.ppt [互換モード]

Microsoft PowerPoint - 05.pptx

情報処理Ⅰ

生命情報学

memo

Taro-再帰関数Ⅱ(公開版).jtd


第4回バイオインフォマティクスアルゴリズム実習

Microsoft PowerPoint - algo ppt [互換モード]

メソッドのまとめ

2019年度 千葉大・理系数学

Taro-最大値探索法の開発(公開版

プログラミング入門1

プログラミングA

テキスト処理第 12 回 ( ) 田中哲産業技術総合研究所情報技術研究部門 u.ac.jp /

模擬試験問題(第1章~第3章)

Si 知識情報処理

プログラミング入門1

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

ポインタ変数

Microsoft Word - CompA-Ex doc

データ構造

2

講習No.10

Functional Programming

Microsoft PowerPoint - ad11-09.pptx

プログラミングA

Microsoft PowerPoint - lecture a.pptx

cp-7. 配列

プログラミングA

コンピュータリテラシ 第 6 回表計算 2 このスライド 例題 /reidai6.xlsx /reidai6a.xlsx 課題 12 /reidai6b.xlsx /table12_13.xlsx

講習No.9

データ構造

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

プログラミング入門1

Javaによるアルゴリズムとデータ構造

PowerPoint プレゼンテーション

gengo1-11

Section1_入力用テンプレートの作成

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

JavaScriptで プログラミング

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

プログラム例 /* ACM-ICPC2009 国内予選 Problem C */ // // filename = pc1.c // コンパイル

program7app.ppt

Microsoft PowerPoint - algo ppt [互換モード]

2

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

PowerPoint Presentation

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

untitled

PowerPoint プレゼンテーション

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft PowerPoint - lecture a.pptx

プログラミング基礎

メソッドのまとめ

Microsoft PowerPoint - 3.pptx

人工知能入門

Microsoft PowerPoint - comprog11.pptx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft PowerPoint - ruby_instruction.ppt

オートマトン 形式言語及び演習 4. 正規言語の性質 酒井正彦 正規言語の性質 反復補題正規言語が満たす性質 ある与えられた言語が正規言語でないことを証明するために その言語が正規言語であると

タイトル

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

フローチャートの書き方

Microsoft PowerPoint - 09re.ppt [互換モード]

PowerPoint Presentation

ポインタ変数

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

ポインタ変数

Microsoft Word - VBA基礎(6).docx

Taro-スタック(公開版).jtd

行列代数2010A

PowerPoint プレゼンテーション

gengo1-8

Microsoft PowerPoint - 13approx.pptx

Transcription:

パターン認識入門

今回の話題 : パターン認識 長大な列 ( 例えば文章 ) から興味深い部分 ( 例えばある文字列を含む部分 ) を取り出したい ある文字列を含む web ページを抽出 プログラム中の特定の関数の呼び出しを DNA から面白そうな塩基配列を 例えば特定の塩基をたくさん含む場所を スパムメールの識別 B-CAS だけでなく B-C@S なども検出したい 2

簡単なパターン認識 : 文字列検索 文字列 s は その一部として文字列 p そのものを含むか? 含むとしたら何文字目からか? abc ababcdba abc abacdbac 2 ステップに分けて考える 文字列 s の k 番目から始まる文字列は p か? 上の条件を満たす k 番目 は? 3

文字列検索のプログラム def match(s,p) # s は p を含むか? m = Float::INFINITY # 含まれないときは を返す for i in s.length()-1 if submatch(s,p,i) # p は s の i 番目からに一致するか確認 m = i m 4

文字列検索のプログラム ( 続き ) def submatch(s,p,i) # p は s の i 番目からに一致するか? f = true for j in.. p.length()-1 f = f && s[i+j] == p[j] f 以下のプログラムでも良い ( 補足 ) def submatch(s,p,i) s[i.. i + p.length() -1] == p #s の i 番目から p 文字分が p と一致する? 5

文字列検索のプログラムの計算量 文字列 s の長さを m,p の長さを n とする match は m 回を submatch を繰り返す submatch は n 文字調べて結果を返す 時間計算量は O(mn) この結果は満足か? n が小さい ( 実用上多い ) 場合は問題なさそう より高速なアルゴリズムもある 例 : Boyer-Moore 法 6

もっともっと複雑なパターン認識 : アラインメント 文字列 a と文字列 b はどれくらい似ているか? abcaa bac abcaa bac ab acddba (5 点 ) b aacdbac (6 点 ) 応用例 : 遺伝子の類似度の計算 コピペの抽出 編集された部分の抽出 文書修正時の最小の編集の計算 8

fib の漸化式 ( 復習 ) fib の漸化式 : fib() = 1 fib(1) = 1 fib(n) = fib(n 1) + fib(n 2) これを素直に実装した再帰関数は遅い 9

fib(4) の計算の様子 fib(4) fib(3) fib(2) fib(2) fib(1) fib() 1 1 fib(1) 1 fib(1) fib() 1 1 fib(n) には fib(n) 回の再帰呼び出しが必要 1

動的計画法 素直な再帰関数を書いてしまうと同じ関数呼び出しを何度もやってしまって非効率 一回やった計算の結果は覚えておけば? fib の場合は 直前二つ だけ覚えていれば良かったけど 一般的には? 動的計画法 : 最終結果を求めるのに必要な値の 表 を作る 表が埋まった 問題が解けた 表の既に埋めたマスの値は何度も使える 11

動的計画法の作り方 問題の答えを漸化式で表現する 再帰関数を作る場合と同様 欲しい項を求めるのに必要な値を覚える表を用意する 表を漸化式の依存関係に従って順に埋めるプログラムを書く 12

動的計画法の適用例 :fib 動的計画法によって fib を実装してみる fib の漸化式 : fib() = 1 fib(1) = 1 fib(n) = fib(n 1) + fib(n 2) n が小さい方から順に計算 長さn+1のテーブルを用意 i 番目のマスは, fib(i) を保持 13

動的計画法による fib def fibt(n) # n 番目のフィボナッチ数を求める table = make1d(n+1) for i in.. n #n が小さい場合から順に table[i] = fill(table, i) #table[i] = fib(i) となるよう #table を埋める table[n] 14

動的計画法による fib( 続き ) def fill(table, i) #table[i] = fill(table, i) = fib(i) if i <= 1 1 else table[i-1] + table[i-2] fib() = 1 fib(1) = 1 fib(n) = fib(n 1) + fib(n 2) 15

動的計画法の様子 table は以下のようなものとなる 1 2 3 4 5 6 7 8 1 1 2 3 5 8 13 21 34 これを左から右に順に埋めてゆく フィボナッチ数列をそのまま順に書く というアルゴリズムだと思えば良い 16

余談 : 他のアルゴリズムとの比較 fib( 再帰関数 ) 時間計算量空間計算量 O(n) 1+ 5 O(( 2 )n ) fibl( ループ ) O(n) O(1) fibm( 行列乗算 ) O(log n) O(1) fibt( 動的計画法 ) O(n) O(n) 動的計画法は一般的なアプローチ 必ずしもベストなやり方とは限らない 17

動的計画法の適用例 2: 組み合わせ数 組合せ数の計算を動的計画法で実装する 漸化式 : n や k が小さい方から順に計算 n C k = n-1 C k-1 + n-1 C k n C = 1 n C n = 1 (n+1) (k+1) のテーブルの各マス (i, j) を i C j で埋める 18

組み合わせ数の動的計画法 def combination(n,k) # n C k を求める table = make2d(n+1,n+1) for i in.. n for j in.. i #n や k が小さい場合から順に table[i][j] = fill(table, i, j) #table[i][j] = i C j table[n][k] 19

組み合わせ数の動的計画法 ( 続き ) def fill(table, i, j) # table[i][j] = i C j if j == i == j 1 else table[i-1][j-1] + table[i-1][j] nc = 1 nc n = 1 nc k = n-1 C k-1 + n-1 C k 2

動的計画表による表 1 1 2 3 4 5 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 1 1 5 1 パスカルの三角形を上から下へ描いている 21

問題 m nの碁盤目状に部屋が繋がった迷宮があり 各部屋 (i, j) に進入時に得られる得点 award[i][j] が二次元配列 awardにより決まっているとする awardを入力とし (, ) から (m 1, n 1) に回り道せずに移動して得られる総得点の最大値を返す関数を示せ 2 6 5 2 3 1 4 3 3 12 1 8 26 点 22

問題のヒント (i, j) の部屋までの得点の最大値 gain(i, j) は以下の漸化式を満たす gain(, ) = award[][] gain(, j) = gain(, j 1) + award[][j] gain(i, ) = gain(i 1, ) + award[i][] gain(i, j) = max{ gain(i, j 1) + award[i][j], gain(i 1, j) + award[i][j] } 23

DNA やタンパクの比較 DNA --- 塩基 ( 四種類 ) の配列 セントラル ドグマ DNA RNA タンパク 三塩基 ( コドン ) が一つのアミノ酸に 似ている配列は似ているタンパクに 似ている配列は同じ祖先から進化 タンパク --- アミノ酸 (2 種類 ) の配列 似ている配列は似た構造に 似ている配列は似た機能を

アラインメント アラインメント二つ ( 複数 ) の文字列の比較 音声認識 文字認識 DNAやタンパクの比較 GACGGATTAG と GATCGGAATAG ギャップ 不一致 GA-CGGATTAG GATCGGAATAG

ぴったり同じでなくとも 似ているかどうかを判定 スコア 一致不一致ギャップ足し合わせる アラインメントの類似度 類似度が最大の アラインメント 最適化 アラインメント ( ギャップの入れ方 ) を求める

例 スコア : 一致 +2 不一致 -1 ギャップ -2 ATAG と AAC をアラインするには 2 ATA と AA のアラインメントに G と C を付加 ATA ATAG A-A A-AC ATA と AAC のアラインメントに G と - を付加 ATAG と AA のアラインメントに - と G を付加 ATA ATAG AAC AAC- ATAG ATAG- A-A- A-A-C 1 これを採用! -2-2

アラインメントの動的計画法 二つの配列 sとs1の間の類似度 a[i][j] : sの部分配列 s[],...,s[i-1] と s1の部分配列 s1[],...,s1[j-1] の間の類似度 a[i][j] = max{a[i][j-1] + g, a[i-1][j-1] + q(s[i-1], s1[j-1]), a[i-1][j] + g } g : ギャップのペナルティ ( 負の数 ) q(c, d) : c と d の類似度 c と d が等しければ適当なスコア ( 正 ) 似ていればそれなりのスコア似ていなければ不一致のペナルティ ( 負 )

境界条件 a[][] = a[][j] = a[][j-1] + g (j>) a[i][] = a[i-1][] + g (i>) 例えば g = -2 結局 a[][j] = j*g a[i][] = i*g となる 要するに ギャップばかり

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 A -4 C -6

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 2 A -4 C -6

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 2 A -4 C -6

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 ATA A-A ATAG A-A- ATA AAC

スコア : 一致 +2 不一致 -1 ギャップ -2 A T A G ATAG A-AC -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 ATA AAC ATA A-A ATAG A-A- ATAG A-AC

いわずもがな x と y の最大値 align.rb 文字 c と文字 d の類似度を返す def max(x,y) if x>y x else y def q(c,d) if c == d 2 else -1 一致 不一致

def align(s,t) m = s.length() n = t.length() a = make2d(m+1,n+1) a[][] = for j in 1..n a[][j] = a[][j-1] + g() for i in 1..m a[i][] = a[i-1][] + g() for i in 1..m for j in 1..n # ここを埋めよ a 境界条件

トレースバック 最大の類似度を与えるアラインメントを提示するために 配列の最後から それまでの選択を振り返る ( トレースバック ) gap[i] は s の i 番目の文字の前に入るギャップの数 で初期化しておく

j スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 ATAG A-AC gap

j スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 ATAG A-AC gap

スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 gap1 ATAG A-AC j A -2 2-2 -4 A -4 1 2 ATA A-A C -6-2 -1 1 gap ATAG A-AC

j スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 ATAG A-AC gap

j スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 1 ATAG A-AC gap

j スコア : 一致 +2 不一致 -1 ギャップ -2 A A AT A- i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 1 ATAG A-AC gap

j スコア : 一致 +2 不一致 -1 ギャップ -2 i A T A G -2-4 -6-8 A -2 2-2 -4 A -4 1 2 C -6-2 -1 1 gap1 1 ATAG A-AC gap

def traceback(a,s,t) u = "" v = "" i = s.length() j = t.length() while i> j> if j> && a[i][j] == a[i][j-1] + g() else if i> && a[i][j] == a[i-1][j] + g() # 上から求められた場合 u = "-" + u v = t[j-1.. j-1] + v j = j - 1 # go left [u,v] else if i> && j> && a[i][j] == a[i-1][j-1] + q(s[i-1], t[j-1]) # 左上から求められた場合

問題 align.rb を完成させて ATAG と AAC のアラインメントを求めよう