短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

24
短短短短短短短短 短短短短短短短短短短短 短短短短短短短短短短短短 短短 短短 短短短短 () 2004 年 1 年 30 年 COMP 年

description

短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム. 宇野 毅明 (情報研) 2004年1月30日 COMP 研. ミスマッチトレランスとは. ・ 文字列 L と ( L より短い) 文字列 S に対して L の中で S に最も似ている( S と同じ長さの)部分列との違いの大きさを 「 S のミスマッチトレンランス」 という ・ 「似ている」の尺度には、ハミング距離を用いる      AT G CCG     A TGCTG      AT C CCG A ATGCT 距離1        距離5. - PowerPoint PPT Presentation

Transcript of 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

Page 1: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

短い部分文字列のミスマッチトレランスを

高速計算するアルゴリズム

宇野 毅明 (情報研)

2004 年 1 月 30 日 COMP 研

Page 2: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

ミスマッチトレランスとはミスマッチトレランスとは

・ 文字列 L と ( L より短い ) 文字列 S に対してL の中で S に最も似ている ( S と同じ長さの ) 部分列との違いの大きさを「「 S のミスマッチトレンランのミスマッチトレンランス」ス」という

・ 「似ている」の尺度には、ハミング距離を用いる

          ATGCCG             ATGCTG

          ATCCCG AATGCT

       距離 1         距離 5

Page 3: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

応用:ジェンチップとマイクロアレイ

・ 「 DNA の中に、指定した 20 文字程度の部分列があると反応する試薬(ジェンチップ)」ができた

・ Q Q さんが X という遺伝子を持つか:    1. X を 20 文字ずつにぶつ切り (オーバーラップするようにする)、  2.それらに反応するような試薬を作る    3. Q Q さんの DNA を入れて反応を見る

・ 全部に同じように反応するならば、遺伝子があるだろう

遺伝子遺伝子

QQ さんのさんの DNADNA

Page 4: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

精度の高い判定をするために

・標的の部分以外に類似する部分列があると、そこが反応してしまうかも

・なるべく固有な(似たものがない)部分列で判定したい

・ ミスマッチトレランスが大きい部分列に切る分ける

Page 5: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

ミスマッチトレランスの既存研究ミスマッチトレランスの既存研究

入力:入力:   文字列 L       と  文字列 S

出力:出力:    S のミスマッチトレランス

・ O(|L|+|S|) 時間で簡単にできる

・ suffix array のように、ある種のデータ構造を作成してから質問 (S のミスマッチトレランス ) に高速に答えるようなことは難しいようだ ( QueryQuery と呼ぶ。ほんとはこれがしたい)

・「ミスマッチトレランスの下界」なら、データ構造で質問に高速回答できる( O(|S|K) 時間、 K はパラーメータ、定数)(山田森下 02)

・一般のエディット距離でできるともっとうれしい

Page 6: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

今回の問題今回の問題

入力:入力:   文字列 L       と  長さ k

出力:出力:    L の各部分列のミスマッチトレランス  (文字種は定数とする。総ミスマッチ計算総ミスマッチ計算と呼ぶ)

・普通に計算すると O(|L|2) 時間かかる

・ゲノムのような長い文字列に対しては、動かない       ( 30 億の 2 乗/ 1000MIPS 90≒ 億秒 ≒ 270270年年 )

・もう少しオーダーの小さい、あるいは実際に速いアルゴリズムが欲しい

Page 7: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

今回の結果今回の結果

・総ミスマッチ計算に対する O(|L|2k) 時間アルゴリズム    (線形時間!線形時間! K=20 なら 30 億 ×100 万、もとの 300 倍)・実用的に高速にする改良    ( K=20 なら 30 億 ×100? 、もとの 300 万倍)

・こんなこともできる  ・類似するペアを列挙(複数の文字列間も可)     ⇒ ゲノムの比較に使える!  ・ O(|L|2k) メモリを使うと Query が O(2k) 時間で解ける  ・一般のエディット距離(係数が大きくなる)

Page 8: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

基本のアイデア:類似の条件基本のアイデア:類似の条件

子問題1:子問題1:各部分列 S に対して、異なりが d 文字以下の部分列があるか

・ Yes  ⇔  S と i1,…, ik-d 番目の文字が等しい部分列がある

子問題2:子問題2:i1,…, ik-d を固定。 i1,…, ik-d 文字目が等しい

他の部分列が存在する部分列を列挙

・ Radix ソートで O(|L|k) 時間

AC T CG T AC G CG AGA G TG AGA C TG CTG G TG A

Page 9: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

基本のアイデア2:分類基本のアイデア2:分類

子問題3:子問題3:全ての i1,…, ik-d に対して、 i1,…, ik-d 文字目が等しい

他の部分列が存在する部分列を列挙 ⇒ 各部分列のミスマッチトレランスが d 以下かどうか分かる

AC T CG T AC G CG AGA G TG AGA C TG CTG G TG A

Page 10: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

基本のアイデア2:分類基本のアイデア2:分類

子問題3:子問題3:全ての i1,…, ik-d に対して、 i1,…, ik-d 文字目が等しい

他の部分列が存在する部分列を列挙 ⇒ 各部分列のミスマッチトレランスが d 以下かどうか分かる

AC T CG T AC G CG AGA G TG AGA C TG CTG G TG A

Page 11: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

基本のアイデア2:分類基本のアイデア2:分類

子問題3:子問題3:全ての i1,…, ik-d に対して、 i1,…, ik-d 文字目が等しい

他の部分列が存在する部分列を列挙 ⇒ 各部分列のミスマッチトレランスが d 以下かどうか分かる

AC T CG T AC G CG AGA G TG AGA C TG CTG G TG A

O(|L|k kCd) 時間でできる

p=0,…,k 全てについて行うとO(|L|k 2k) 時間

Page 12: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実用上の高速化 1実用上の高速化 1

・ 全ての i1,…, ik-d に対して、毎回律儀にソートする必要は無い

・ まず 1 文字目でソートしておけば、 i1,…, ik-d が 1 文字目を含むなら、このソートの結果を共同利用できる

・ 同様に、再帰的に i 文字目のソート結果を再利用できる

・ 何文字かでソートした際に、すでに等しい部分列がないものがでたら、以後それは考慮しなくて良い ⇒ 計算時間の短縮

Page 13: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実用上の高速化 2実用上の高速化 2

! 早めに共通部分のソートをした方が、同値類が小さくなる

・ 添え字集合 i1,…, ik-d を分類

 1. k/2 以下の添え字が k/2+1 以上のものより同じか少ない 2. k/2+1 以上の添え字が k/2 以下の添え字より少ない

1.は 1,…,k/2 文字目を先にソート2.は k/2+1,…,k 文字目を先にソートこれを再帰的に繰り返す

Page 14: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実用上の高速化 3実用上の高速化 3

・ 何文字かでソートした際に、すでに等しい部分列がないものがでたら、以後それは考慮しなくて良い

・ 何文字かでソートした際に、等しい部分列が少なくなったら、直接比較したほうが速い

(等しい部分列のグループ =  同値類同値類)

Page 15: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実用上の高速化 4実用上の高速化 4

・ i 文字目までをソートした

・ そこまでの同値類で、全てのメンバーのミスマッチトレランスが d 以下だとすでにわかっている

⇒ その同値類は以後計算する必要はない

Page 16: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実験実験

・ 東芝ノート PC

・ Pentium III 750MHz 、 RAM 256MB (実際は 80MB  )・ C で組み、 Windows 上の Linux 、 Cygwin で実行

・ Radix sort を 2k 回行ったもの、改良 1,2,3,4 を順々に加えたものを比較

・ d を k の 1-2割とし、ミスマッチトレランスがそれ以上のものは「それ以上」とだけ答えるようにした(実用性&計算時間から)

Page 17: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実験:実験: k=20, d=2k=20, d=2

0.1

1

10

100

1000

10000

210 700 2100 7000 22950length

time(sec)

Originalmethod1method2method3method4

Page 18: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実験:実験: k=20, d=3k=20, d=3

1

10

100

1000

10000

210 700 2100 7000 22950length

time(sec)

Originalmethod1method2method3method4

Page 19: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実験:実験: k=40, d=4k=40, d=4

110

1001000

10000100000

1000000

length

time(sec)

Originalmethod1method2method3method4

Page 20: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

実験:長さを実験:長さを 200200 万、ミスマッチ率万、ミスマッチ率10%10%

で固定、で固定、 kk を変化させるを変化させる

1

10

100

1000

10000

100000

20 30 40 50 60 70 80 length

time(sec)

Originalmethod1method2method3method4

Page 21: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

Query Query に答えるに答える

・ 計算の再帰構造をメモリに記憶する

・ 与えられた文字列 S に対して、 S に関係する再帰だけをトレースすると、 S を含む同値類が列挙できる

  ⇒ S のミスマッチトレランスがわかる

・ 人間の Y染色体で行うと、 10GB くらいのメモリを使うことになるようだ。

Page 22: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

類似する部分列のペアを列挙類似する部分列のペアを列挙

・ 各 i1,…, ik-p での同値類を計算し、大きさ 2 以上の同値類のメンバー同士は、ハミング距離が p 以下。そういうペアを全部出力

・ ハミング距離が p 未満だと、複数回出力される(ちょうど p だと、ちょうど1回出力される)  ⇒ ハミング距離がちょうど p のペアのみ出力     p を 1 から k まで順に大きくする

・ ゲノム A の部分列と B の部分列で似ているものを列挙、ということもできる

Page 23: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

一般のエディット距離に拡張一般のエディット距離に拡張

・ 各 i1,…, ik-p でと j1,…, jk-p の組に対して、 i1 番目と j1 番目、 i2 番目と j2 番目 ,…,ik-p 番目と jk-p 番目が同じ部分列の組を見つければよい

          A T G C C G             A T G C T G

          A T C C C G A A T G C T

       距離 1         距離 2

Page 24: 短い部分文字列の ミスマッチトレランスを 高速計算するアルゴリズム

まとめ

・ 文字列の、長さ k の各部分列のミスマッチトレランスを線形時間で計算する、分類型アルゴリズムを提案した

・ 実用上速くなる手法を提案した(再帰的に分類、無用な再帰の省略)

・ 計算実験の結果を示した(ノート PC でも、何とかゲノムが扱える)

・ 類似する部分列のペアの列挙、一般の距離への拡張などの応用を示した