いいプログラムは コーディング技術だけではない

112
いいいいいいいい いいいいいいいい いいいいいいいいいいいいいい いいいいいいいいいいいいいい 2007 い 3 い 22 い JOI いい いい いい いい いい いいいいいいいい いいいいいいいいいい &)

Upload: aric

Post on 05-Jan-2016

35 views

Category:

Documents


1 download

DESCRIPTION

いいプログラムは コーディング技術だけではない. 宇野 毅明   (国立情報学研究所         &総合研究大学院大学). 200 7 年 3 月 22 日 JOI 合宿. 簡単に自己紹介. 名前: 宇野 毅明 年齢・職種: 36歳、助教授 研究分野: アルゴリズム理論 - コンピュータプログラムの設計手法の理論 - 速いコンピュータを作ったり、プログラミングの腕を競うの    ではなく、「設計方法の違いによる性能の向上」を目指す - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: いいプログラムは コーディング技術だけではない

いいプログラムはいいプログラムは

コーディング技術だけではないコーディング技術だけではないいいプログラムはいいプログラムは

コーディング技術だけではないコーディング技術だけではない

2007 年 3 月 22 日 JOI 合宿

宇野 毅明  宇野 毅明  (国立情報学研究所        &総合研究大学院大学)

Page 2: いいプログラムは コーディング技術だけではない

簡単に自己紹介簡単に自己紹介簡単に自己紹介簡単に自己紹介

名前: 名前: 宇野 毅明年齢・職種: 年齢・職種: 36歳、助教授研究分野: 研究分野: アルゴリズム理論  -- コンピュータプログラムの設計手法の理論  -- 速いコンピュータを作ったり、プログラミングの腕を競うの   ではなく、「設計方法の違いによる性能の向上」を目指す

最近の研究: 最近の研究: ゲノム情報学やデータマイングで出てくる巨大なデータベースの基礎的(とはいっても非常に時間のかかる)な解析を超高速で行うアルゴリズムの開発

趣味(日課?): 趣味(日課?): 子供と遊ぶこと

Page 3: いいプログラムは コーディング技術だけではない

アルゴリズム技術の粋アルゴリズム技術の粋アルゴリズム技術の粋アルゴリズム技術の粋

Page 4: いいプログラムは コーディング技術だけではない

世の中での「プログラミング」世の中での「プログラミング」世の中での「プログラミング」世の中での「プログラミング」

・・ 情報化社会において、コンピュータプログラムはありとあらゆる場所で使われている、もはや「言葉」と同じくらい基本的で重要なツール

・・ それゆえに、プログラミングは、単純労働に近い位置にある - - SE のシステムを組む、という作業は、       プログラムではなく全体の設計 - - ゲノムなど、○○情報学の分野でも、あくまでプログラミングは道具であり、真の目的とは一線を画する

・・ 昔はプログラムが組めるだけですごかったんだけど...

Page 5: いいプログラムは コーディング技術だけではない

プログラムの美学プログラムの美学プログラムの美学プログラムの美学

・・ プログラムの普及がプログラムを単純労働にしたが、それはプログラムの価値を低くしたわけではない 誰でも文章を書けるが、質の高い文学作品は誰にでも書けるものではない

・・ プログラムにはプログラムの粋がある

プログラムプログラム

情報システム

ビジネスモデル

自然科学

豊かな生活

技術の粋

Page 6: いいプログラムは コーディング技術だけではない

技術の粋とは技術の粋とは技術の粋とは技術の粋とは

・・ 「日本には OS を作れる人材がいない」と言われることがある・・ これは言いすぎだと思うが、「高い技術を持ったプログラマーが少ない」というのはあっていると思う

・・ OS のような高度なシステム作りに要求される技術は「大規模なシステムを、論理的に正しくデザインすること」   いわば、車やジャンボジェット作りに似ている  ( 1 万、 10 万を超える部品を組立てて、安定した製品を作る)

・・ 他の粋として、「速いプログラムを作る」というものがある   こちらは、 F1 カーや、ジェット戦闘機作りに相当  (目的に特化して、どこまで高性能にできるか、限界に挑戦)

Page 7: いいプログラムは コーディング技術だけではない

プログラムを速くするにはプログラムを速くするにはプログラムを速くするにはプログラムを速くするには

・・ プログラムを速くする方法の1つは、並列化をすること   クラスタコンピュータ、デュアルコア、メニーコア

・・ もうひとつはプログラムコードの改良 -  - 使用言語を変える   インタープリタ系 (perl,lisp) からコンパイル系へ(C,PASCAL)

 -  - キャッシュのヒット率を上げる(ループを開く) -  - ディスク IO 、メモリ IO を高速化する(バッファを自分で管理)

・・ その他にも、「アルゴリズムの改良」   アルゴリズムは、いわばプログラムの設計書。設計を変えることで、高速化を図る

Page 8: いいプログラムは コーディング技術だけではない

 アルゴリズム理論のアプローチ アルゴリズム理論のアプローチ アルゴリズム理論のアプローチ アルゴリズム理論のアプローチ

・・ アルゴリズム理論では、解く問題の大きさに対する計算時間に注目し、増加の仕方が小さくなる設計法を考える

・・ 「増加の仕方」にしか注目しないので、コーディングの技術など、問題の大きさに依存しない高速化部分は無視できる

・・ 大体の場合、「最悪の場合の計算時間」を算定するので、リスクが小さい

・・ 「実際の計算時間」「小規模だと単純なものに負ける」が弱点

Page 9: いいプログラムは コーディング技術だけではない

情報爆発時代のアルゴリズム情報爆発時代のアルゴリズム情報爆発時代のアルゴリズム情報爆発時代のアルゴリズム

Page 10: いいプログラムは コーディング技術だけではない

データ中心の科学データ中心の科学データ中心の科学データ中心の科学

・ ・ 近年、 IT 技術の発達で、大規模なデータが半自動的に収集できるようになった  ( POS 、 web 、文書、顧客データ、財務、利用者、人事…)

データの選別データの選別 モデル化モデル化 データ処理データ処理

既存のデータを使って何かを得たい既存のデータを使って何かを得たい

いわば、データを出発点とした問題解決の科学(人工知能、データマイニング、自然言語処理、セマンティック web…

近年の情報学でもメジャーな研究スタイル)

いわば、データを出発点とした問題解決の科学(人工知能、データマイニング、自然言語処理、セマンティック web…

近年の情報学でもメジャーな研究スタイル)

Page 11: いいプログラムは コーディング技術だけではない

データ中心科学の特徴データ中心科学の特徴データ中心科学の特徴データ中心科学の特徴

・ データが整形されていない 目的がはっきりしない、あるいは異なる目的のために集められたデータを用いるため、必要なものがすぐ取り出せるとは限らない。また、ノイズや不正確な情報も含まれうる。

・ 目的関数があいまい データが情報の塊のようなものなので、そこから得られるものはやはり情報であることが多い(知識、特徴分析といったもの)。それら情報の価値は数理的な尺度では計りにくい。また、従来の最適化とは異なる尺度を用いることが多い。(グラフクラス、シークエンス、情報量、隣接性、類似度、頻出度・・・)

・ データが巨大で、構造を持つ 半自動で集められたデータであるので、データは通常、巨大である。しかし各項目が持つ属性は少なく、疎である。

・ データ処理は比較的簡単なものが多い データ処理の計算は、最適化のような複雑ではなく、組合せの検索や整形などいくつかの簡単な処理の組合せ

Page 12: いいプログラムは コーディング技術だけではない

 今、巨大データにできること 今、巨大データにできること 今、巨大データにできること 今、巨大データにできること

・・ データベースの構築(データ構造)データベースの構築(データ構造)・・ キーワード検索キーワード検索・・ ソート、整列ソート、整列・・ フィルタリングフィルタリング・・ 統計量の計算統計量の計算・・ 圧縮圧縮・・ 最短路検索 最短路検索......

1次的な処理が多い。組合せ的な構造を処理するものは少な1次的な処理が多い。組合せ的な構造を処理するものは少ないい1次的な処理が多い。組合せ的な構造を処理するものは少な1次的な処理が多い。組合せ的な構造を処理するものは少ないいより高度な解析のため、より複雑な基礎処理アルゴリズムがより高度な解析のため、より複雑な基礎処理アルゴリズムが

必要必要より高度な解析のため、より複雑な基礎処理アルゴリズムがより高度な解析のため、より複雑な基礎処理アルゴリズムが

必要必要

Page 13: いいプログラムは コーディング技術だけではない

データ処理の変化データ処理の変化データ処理の変化データ処理の変化

▪ ▪ 不ぞろいなデータから有用な情報を得るには複雑で豊かなモデルを解く必要がある▪ ▪ そのためには、解く問題を複雑にする必要がある ▪ ▪ 比較・統計量 全対比較・組合せ的な統計量 ▪ ▪ キーワード検索 パターンマイニング ▪ ▪ 完全一致 類似検索 ▪ ▪ 最適化 列挙

・・ このように処理が変化すると、既存のアルゴリズムを用いて行った場合に、非常に時間がかかることがある例)例) 全対比較を通常の検索を用いて行うと、レコード数だけのクエリを必要とする

複雑かつ大量の計算を効率良く行う手法の開発が重要複雑かつ大量の計算を効率良く行う手法の開発が重要

データベース

データベース

Page 14: いいプログラムは コーディング技術だけではない

データ処理に求められるものデータ処理に求められるものデータ処理に求められるものデータ処理に求められるもの

[多様性] 個別の案件に対してモデルが変化 問題設定の変化に対して柔軟であること  - -[基礎問題] 解く問題が基礎的であること  - -[単純な構造] アルゴリズムのアイディアが単純であり、            汎用性の高いレベルで構築されていること

[速度] 大規模データに対しても高速に動作すること コードの改良より、良いアルゴリズムの開発  - -[疎成] データの疎性、スケールフリー性を利用して  - -[計算構造] 計算構造の改良により、無駄な探索を省く  - -[スケールメリット] 多数の操作を一度に行うことで高速化

[正確性] なんらかの意味で正確な計算を行うこと  - -[列挙] 全ての解をもらさず重複無く発見  - -[精度保障] 誤差の範囲を保障する

Page 15: いいプログラムは コーディング技術だけではない

 アルゴリズム理論の利点 アルゴリズム理論の利点 アルゴリズム理論の利点 アルゴリズム理論の利点

・・ 大規模な計算には、アルゴリズム理論に基づいた技術が有効  アルゴリズム理論による高速化は、問題の大きさに対する計算時間の増加を抑える  計算の結果は変化しない

データが巨大になるほど、アルゴリズム改良の加速率は上がデータが巨大になるほど、アルゴリズム改良の加速率は上がるるデータが巨大になるほど、アルゴリズム改良の加速率は上がデータが巨大になるほど、アルゴリズム改良の加速率は上がるる

100項目2-3倍

100 万項目

10000倍

Page 16: いいプログラムは コーディング技術だけではない

頻出パターン発見頻出パターン発見頻出パターン発見頻出パターン発見

Page 17: いいプログラムは コーディング技術だけではない

データベースを分析したいデータベースを分析したいデータベースを分析したいデータベースを分析したい

・ ・ データベース構築と検索は、もうできるようになった (絞込みや、あいまい検索はまだ改良の余地があるけど)

・・ より詳しくデータを解析するために、データの特徴を捉えたい各種統計量(データベースの大きさ、密度、分布)よりも、深い解析がしたい

組合せ(パターン)的な構造に注目(どういう組合せ(パターン)がどれくらい入っているか)

・ ・ 組合せ・パターンの個数は指数的に増えていくので、全てを尽くすのは無理 多く現れるものだけに注目

ゲノム情報実験結果

データベース

ATGCGCCGTATAGCGGGTGGTTCGCGTTAGGGATATAAATGCGCCAAATAATAATGTATTATTGAAGGGCGACAGTCTCTCAATAAGCGGCT

ATGCGCCGTATAGCGGGTGGTTCGCGTTAGGGATATAAATGCGCCAAATAATAATGTATTATTGAAGGGCGACAGTCTCTCAATAAGCGGCT

実験1

実験2

実験3

実験4

 ●  ▲  ▲   ●  ▲

 ●  ●  ▲  ● ●  ●  ▲  ● ▲  ●  ●

 ●  ▲  ● ●  ▲  ▲   ▲  ▲  

Page 18: いいプログラムは コーディング技術だけではない

頻出パターンの列挙頻出パターンの列挙頻出パターンの列挙頻出パターンの列挙

・ ・ データベースの中に多く現れるパターンを全て見つける問題を頻出パターン列挙(あるいは発見、マイニング)問題という

 データベース: トランザクション、ツリー、グラフ、多次元ベクトル パターン: 部分集合、木、パス・サイクル、グラフ、図形

ゲノム情報実験結果

データベース 頻出する頻出する

パターンを抽出パターンを抽出ATGCGCCGTATAGCGGGTGGTTCGCGTTAGGGATATAAATGCGCCAAATAATAATGTATTATTGAAGGGCGACAGTCTCTCAATAAGCGGCT

ATGCGCCGTATAGCGGGTGGTTCGCGTTAGGGATATAAATGCGCCAAATAATAATGTATTATTGAAGGGCGACAGTCTCTCAATAAGCGGCT

実験1

実験2

実験3

実験4

 ●  ▲  ▲   ●  ▲

 ●  ●  ▲  ● ●  ●  ▲  ● ▲  ●  ●

 ●  ▲  ● ●  ▲  ▲   ▲  ▲  

・・ 実験 1● ,実験 3 ▲・・ 実験 2● ,実験 4●・・ 実験 2●, 実験 3 ▲, 実験4●・・ 実験 2▲ ,実験 3 ▲    .    .    .

・・ 実験 1● ,実験 3 ▲・・ 実験 2● ,実験 4●・・ 実験 2●, 実験 3 ▲, 実験4●・・ 実験 2▲ ,実験 3 ▲    .    .    . ・・ ATGCAT

・・ CCCGGGTAA・・ GGCGTTA・・ ATAAGGG    .    .    .

・・ ATGCAT・・ CCCGGGTAA・・ GGCGTTA・・ ATAAGGG    .    .    .

Page 19: いいプログラムは コーディング技術だけではない

多く現れるものを見つけるために、多く現れるとは何か、を決める

・ ・ データベースが項目の集まりだとする・ ・ パターンに対して、そのパターンを含む項目を出現出現という・ ・ 出現の数(頻出度頻出度)が閾値より大きければ、良く現れるとする

(含む、の定義は、集合で行ったり、文字列の包含、グラフの埋め込みなどで定義する)

多く現れる 多く現れる 頻出する頻出する多く現れる 多く現れる 頻出する頻出する

{A,C,D}

{A,B,C,D,E}

パターンパターンXYZ

項目項目AXccYddZf

Page 20: いいプログラムは コーディング技術だけではない

トランザクションデータベーストランザクションデータベーストランザクションデータベーストランザクションデータベース

・ ・ パターンとして、集合を考える (集合:ものの集まり。ここでは {1,2,…,n}。部分集合は、この中からいくつかを選んだもの。 {1,4,7} など。)

トランザクションデータベース:トランザクションデータベース: 各トランザクション T がアイテム集合 E={1,…,n} の部分集合であるデータベース

-- POS データ(各項目が、客 1 人の購入品目)-- アンケートのデータ( 1 人がチェックした項目)-- web log ( 1 人が 1回の webサーフィンで見たページ)-- オプション装備 (車購入時に 1 人が選んだオプション)実際のデータは、大きくて疎なものが多い

パワー則、スモールワールドが成り立つ

1,2,5,6,72,3,4,51,2,7,8,91,7,92,7,92

D ==

Page 21: いいプログラムは コーディング技術だけではない

集合の出現と頻出度集合の出現と頻出度集合の出現と頻出度集合の出現と頻出度

集合 K に対して:K の出現の出現::    K を含む D のトランザクションK の出現集合 の出現集合 Occ(K) : : K を含む D のトランザクション全ての集合K の頻出度 の頻出度 frq(K) : : K の出現集合の大きさ

1,2,5,6,7,92,3,4,51,2,7,8,91,7,92,7,92

TT ==

  {1,2} の出現集合==  { {1,2,5,6,7,9}, {1,2,7,8,9} }

  {2,7,9} の出現集合==  { {1,2,5,6,7,9},      {1,2,7,8,9}, {2,7,9} }

Page 22: いいプログラムは コーディング技術だけではない

頻出集合頻出集合頻出集合頻出集合

・・ 頻出集合:頻出集合: TT の定数 θ個以上のトランザクションに含まれる集合 (頻出度が θ以上の集合)( θ を最小サポートとよぶ)

例)例) データベース T T の 3つ以上のトランザクションに含まれる集合 1,2,5,6,7,9

2,3,4,51,2,7,8,91,7,92,7,92

TT ==

3つ以上に含まれるも3つ以上に含まれるものの{1} {2} {7} {9}{1,7} {1,9}{2,7} {2,9} {7,9}{1,7,9} {2,7,9}

与えられたトランザクションデータベースと最小サポート θ に対して、頻出集合を全て見つける問題を

考える

Page 23: いいプログラムは コーディング技術だけではない

応用:バスケット分析応用:バスケット分析応用:バスケット分析応用:バスケット分析

・・ スーパーなどの小売店舗で、同時に購入される事の多い品物の組を知りたい

・・ 客が購入した品目 トランザクション・ ・ 品目の組で、多くの客が購入したもの 多くのトランザクションに含まれるアイテム集合 (ある θ に対する)頻出集合

「おむつとビールの組合せが良く売れる」という発見が有名

● 牛乳、弁当● お茶、弁当● おにぎり、雑誌● はさみ、のり● ラーメン、はし● こっぷ、皿● 弁当、おにぎり   ...

Page 24: いいプログラムは コーディング技術だけではない

応用:データベースの比較応用:データベースの比較応用:データベースの比較応用:データベースの比較

・・ 2つのデータベースが、意味的にどの程度似ているか知りたい 大きさの違い、ノイズは無視したい

・・ 各アイテム、属性などの総数だけでは、組合せがわからない・ ・ 組合せを細かく見ると、ノイズに振り回される頻出集合を列挙することで、組合せ的な特徴を比較できる データ

ベースデータベース

データベースデータベース

・ ・ いろいろな言語の辞書データ・ ・ 異なる種のゲノムデータ・ ・ 文書集合の単語データ(新聞のデータ、雑誌のデータなど)・ ・ 顧客のデータ

Page 25: いいプログラムは コーディング技術だけではない

応用:分類ルール、特性の発見応用:分類ルール、特性の発見応用:分類ルール、特性の発見応用:分類ルール、特性の発見

・・ データの特徴を現す規則、あるいは正例・負例を分類するような規則が知りたい ( A,B,C が含まれている、 A,B が含まれれば、 C が含まれる、など)

・・ 多く現れる組合せを用いないと、仮定部分を満たすものが少なく、ルールとして意味がない・ ・ 組合せを細かく見ると、ノイズに振り回される

頻出集合を仮定に用いることで、信頼度の高いルールを効率良く見つけられる

・ ・ 実験データ・ ・ 利用者履歴データ、マーケッティング

データデータベースベース

データベース

負例正例

Page 26: いいプログラムは コーディング技術だけではない

頻出集合の列挙頻出集合の列挙頻出集合の列挙頻出集合の列挙

Page 27: いいプログラムは コーディング技術だけではない

頻出集合発見用のプログラム頻出集合発見用のプログラム頻出集合発見用のプログラム頻出集合発見用のプログラム

・・ 頻出集合発見は、データマイニングと呼ばれる最近興ったデータ解析の中でも基礎的な問題なので、プログラムが多く作られている

・・ 入力データ、出力する解、どちらも大きいことが多いので、計算速度は非常に重要

・・ しかも、アルゴリズムの設計しだいで、パフォーマンスが大きく変わる

・・ 国際プログラミングコンテストでも、こんな感じ。ばらつき大きい(時間軸は対数)

どういうアルゴリズムがあるのか、見てみよ

どういうアルゴリズムがあるのか、見てみよ

Page 28: いいプログラムは コーディング技術だけではない

プログラムを作ろうプログラムを作ろうプログラムを作ろうプログラムを作ろう

・・ 問題は入力: トランザクションデータベース D と閾値 θ出力: 全ての頻出集合出現

・ ・ さて、どんな方針でプログラムを作りましょうか(これがアルゴリズムを考える、という作業)

作戦1:部分集合1つ1つについて頻出度を計算する 計算時間は O(2n|D|)      ( n= アイテムの数、 |D|=データベースの大きさ) n=30 、 |D| =1000 くらいでも大変なことになる

もう少し工夫しないともう少し工夫しないと

Page 29: いいプログラムは コーディング技術だけではない

計算時間は、どうなるべきだろう?計算時間は、どうなるべきだろう?計算時間は、どうなるべきだろう?計算時間は、どうなるべきだろう?

・・頻出集合の数は最高で 2n個になるから、計算時間 O(2n|D|) は、 |D| の部分を除けばある意味で仕方ない?

そんなことはない。そんなにたくさん答えが出てくるような計算は、そもそもしたくない つまり、解(頻出集合)の数はそんなに多くない、と思ってよい

逆に考えると、解を出力する部分の計算は避けられないつまり、「これだけは最低かかる」

・・そこで、「解1つあたりの計算時間がどうなるか」に注目しよう

Page 30: いいプログラムは コーディング技術だけではない

頻出集合の単調性頻出集合の単調性頻出集合の単調性頻出集合の単調性

・・ 工夫をするためには、何か問題の特徴をつかまなくてはいけない

・・ 使えそうなのが、「頻出集合の部分集合は必ず頻出」、というもの(単調性という)

つまり、ハッセ図(包含関係を図示したもの)の上では、頻出集合が存在するエリアはつながっている

頻出頻出

111…1

000…0

これなら、うまいことたどれば、頻出集合をすばやく全部見つけられそう

これなら、うまいことたどれば、頻出集合をすばやく全部見つけられそう φ

1,31,2

1,2,3 1,2,4 1,3,4 2,3,4

1 2 3 4

3,42,41,4 2,3

1,2,3,4

Page 31: いいプログラムは コーディング技術だけではない

重複に気をつける重複に気をつける重複に気をつける重複に気をつける

・・ また、よくよく見ると、「どの頻出集合も、空集合(アイテムが何も入っていない集合)にアイテムを1つずつ追加して作れる・・ また、頻出集合にアイテムを追加して、頻出でなくなったら、その後いくら追加しても 2 度と頻出にはならない

全ての追加の仕方を尽くせば、 全ての頻出集合が見つかる

・・しかし、単純に全てを尽くすと、大量に重複が出る

どうやって重複を回避しようかどうやって重複を回避しようか φ

1,31,2

1,2,3 1,2,4 1,3,4 2,3,4

1 2 3 4

3,42,41,4 2,3

1,2,3,4

φ

1,3

1

φ

1,2

1,2,3

2

φ

1,2

1,2,3

1

Page 32: いいプログラムは コーディング技術だけではない

重複の回避法重複の回避法重複の回避法重複の回避法

・・ グラフ探索問題(幅優先探索、深さ優先探索)をするのだ、と考えれば、「一度訪れた頂点には、マークをつければいい」となる マークをどうやってつける? そもそも、探索するグラフを得ること自体が、解を求める作業と同じ

・・ 他の手として、出力した解を全部メモリにとっておいて、新たな頻出集合が見つかるたびに、「今までにこれを出力したか」チェックをする メモリが大量に必要。おまけに、探索の手法、というレベルでは、重複は避けられていないため、1つあたりの計算時間は長くなるはず

メモリを使わず、本質的に重複を回避する方法がほしい

メモリを使わず、本質的に重複を回避する方法がほしい

Page 33: いいプログラムは コーディング技術だけではない

バックトラック法による探索バックトラック法による探索バックトラック法による探索バックトラック法による探索

・・ そもそも重複が起こるのは、各頻出集合がいくつもの部分集合から「アイテムを1つ追加」として得られるのが原因 ( {1,2,3} には、 {2,3}+1, {1,3}+2, {1,2}+3 の 3通りある)

・・ そこで、各頻出集合に対して、「作られ方」と 1通りに制限する・・ 具体的には、「一番大きなアイテムを加えた場合のみ」とする ( {1,2,3} は、 {1,2}+3 という  作り方でしか作らない、  ということ)

探索ルートが木構造に  なるので、重複がなくなるこういう探索方法をバックトラック法

というこういう探索方法をバックトラック法

というφ

1,31,2

1,2,3 1,2,4 1,3,4 2,3,4

1 2 3 4

3,42,41,4 2,3

1,2,3,4

Page 34: いいプログラムは コーディング技術だけではない

バックトラック法の計算時間バックトラック法の計算時間バックトラック法の計算時間バックトラック法の計算時間

・・計算時間を算定してみよう。擬似コードはBacktrack (K)

1 Output K

2 For each e > > K の末尾( K の最大のアイテム) If K + e が頻出集合 call Backtrack (K+ e)

--再帰呼び出しの回数は、  頻出集合の数と同じ-- 1呼び出し(反復と言う)の  計算時間は( n-K の末尾) ×× (頻出度計算時間)

解1つあたりの計算時間が算定できた解1つあたりの計算時間が算定できたφ

1,31,2

1,2,3 1,2,4 1,3,4 2,3,4

1 2 3 4

3,42,41,4 2,3

1,2,3,4

O(|D|)O(|D|)

Page 35: いいプログラムは コーディング技術だけではない

解解 11つ当たり、を速くするつ当たり、を速くする解解 11つ当たり、を速くするつ当たり、を速くする

・・解1つあたりの計算時間はそれなりに(多項式時間で)抑えられたが、まだまだ大きい

・ ・ 各 K+ e について、その頻出度を計算 - -単純にするなら、全ての項目(トランザクション)について、 K+ e を含むかどうか調べる   最悪、データベースの大きさに比例、   平均ではだいたい、項目数、  頻出度 ×K の大きさ、の大きいほう -  - 2 分木のようなデータ構造を作って、含むものだけ抜き出す、あるいは勘定する、というのは、難しい

ここにもアルゴリズムが必要ここにもアルゴリズムが必要

1,2,5,6,7,92,3,4,51,2,7,8,91,7,92,7,92

Page 36: いいプログラムは コーディング技術だけではない

D0={φ}, k := 1

while Dk-1 が空でない for each Dk-1 のメンバー X for each e

if X+e が頻出集合 then Dk に X+e を挿入

・・ X+e の頻出度を計算する前にX+e に含まれる部分集合が全て Dk にあるか調べる

・ ・ ないものがあるなら、頻出でない

幅優先探索の利用幅優先探索の利用幅優先探索の利用幅優先探索の利用

φ

1,31,2

1,2,3 1,2,4 1,3,4 2,3,4

1 2 3 4

3,42,41,4 2,3

1,2,3,4

メモリを使う点、検索に時間がかかる点がネック

メモリを使う点、検索に時間がかかる点がネック

Page 37: いいプログラムは コーディング技術だけではない

含むものしか含まない含むものしか含まない含むものしか含まない含むものしか含まない

・・ アイテム集合 X の出現集合を T とする・・ X+ e の出現は X を含む(= X の出現) X+ e を含むトランザクションを見つけるとき には、 T のトランザクションしか見なくてよい

・・ T のトランザクションで e を含むものを集めると X+ e の出現集合が得られる

・ ・ 出現集合を更新すれば、   データ全体を見なくて良い

計算時間はだいぶ短くなる

Page 38: いいプログラムは コーディング技術だけではない

共通部分をとる共通部分をとる共通部分をとる共通部分をとる

・・ T のトランザクションで e を含むものを集めると X+ e の出現集合が得られる   X+ e の出現集合は、 X の出現集合と e の出現集合の共通部分 (両方に含まれるものを集めたもの)

・ ・ 共通部分をとるには、両者をソートしておき、同時に先頭からスキャンする

{1,3,7,8,9}{1,3,7,8,9}

{1,2,4,7,9}{1,2,4,7,9}

= = {1,7,9}{1,7,9}

計算時間は、スキャンしたアイテムの数  両者の大きさの和

計算時間は、スキャンしたアイテムの数  両者の大きさの和

Page 39: いいプログラムは コーディング技術だけではない

ビット演算を使った共通部分の高速計算ビット演算を使った共通部分の高速計算ビット演算を使った共通部分の高速計算ビット演算を使った共通部分の高速計算

・・ 各アイテムの出現をビットの形で保持する(現在の部分集合も同じように)

{1,3,7,8,9} {1,3,7,8,9} [101000111][101000111]

{1,2,4,7,9} {1,2,4,7,9} [110100101][110100101]

    [100000101][100000101]

共通部分の計算が、 AND 演算でできる    (いっぺんに 32個 ( 最近は 64個 ) 計算できる)  メモリの節約にもなる

しかし、後述するデータベース縮約と相性が悪いしかし、後述するデータベース縮約と相性が悪い

Page 40: いいプログラムは コーディング技術だけではない

振り分けによる高速化振り分けによる高速化振り分けによる高速化振り分けによる高速化

・ ・ 各アイテムに空のバケツを用意する

・ ・ X の各出現 T に対して、以下を行う  -- T に含まれるアイテム e に対して、 e のバケツに T を入れる

この操作が終わった後は、各アイテム e のバケツの中身は X+ e の出現集合になる

for each X の各出現 T for each T に含まれる e, e>X の末尾     e のバケツに T を挿入

A: 1,2,5,6,7,9B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

1: A,C,D2: A,B,C,E,F3: B4: B5: A,B6: A7: A,C,D,E8: C9: A,C,D,E

Page 41: いいプログラムは コーディング技術だけではない

振り分けの計算時間振り分けの計算時間振り分けの計算時間振り分けの計算時間

for each X の各出現 T

for each T に含まれる e, e>X の末尾     e のバケツに T を挿入

・・ 計算時間は ,

X の各出現の (X の末尾 ) より大きなアイテムの数の総和

A: 1,2,5,6,7B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

Page 42: いいプログラムは コーディング技術だけではない

Occurrence DeliverOccurrence DeliverOccurrence DeliverOccurrence Deliver

・ ・ Compute the denotations of P {∪ i} for all i’s at once,・ ・ Compute the denotations of P {∪ i} for all i’s at once,

1,2,5,6,7,92,3,4,51,2,7,8,91,7,92,7,92

D==

A 1 2 5 6 7 9

B 2 3 4 5

C 1 2 7 8 9

D 1 7 9

E 2 7 9

F 2P = {1,7}

A A A

C C

Check the frequency for all items to be added in linear time of the database size

Check the frequency for all items to be added in linear time of the database size

A

C

D

Generating the recursive calls in reverse direction, we can re-use the memoryGenerating the recursive calls in reverse direction, we can re-use the memory

Page 43: いいプログラムは コーディング技術だけではない

11再帰呼び出しの計算時間のイメージ再帰呼び出しの計算時間のイメージ11再帰呼び出しの計算時間のイメージ再帰呼び出しの計算時間のイメージ

・・ 普通に頻出度の計算をすると各 X+ e に対してデータを一回スキャンする

・・ 共通部分による計算はD(X) と D(e) のをスキャンする   D(X) を n-t 回スキャンし、データベースの t より大きなアイテムをスキャンする

・・ 振り分けは D(X) に含まれるトランザクションの t のをスキャンする t より大きなアイテムをスキャンする

(n-t)個

(n-t)個t

t

効果はこれだけではない効果はこれだけではない

Page 44: いいプログラムは コーディング技術だけではない

末広がり性末広がり性末広がり性末広がり性

・・ 再帰呼び出しを繰り返すと、 X の頻出度は小さくなる 振り分けの計算時間も短くなる

・・ バックトラックは、各反復で複数の再帰呼び出しをする 計算木は、下に行くほど大きくなる 計算時間を支配するのは一番下の数レベル

ほぼ全ての反復が短時間で終了 全体も速くなる

ほぼ全ての反復が短時間で終了 全体も速くなる

・・・・・・

計算時間長計算時間長

計算時間短計算時間短

Page 45: いいプログラムは コーディング技術だけではない

最小サポートが大きい場合も最小サポートが大きい場合も最小サポートが大きい場合も最小サポートが大きい場合も

・・ θ が大きいと、下のレベルでも多くの出現を見ることになる 末広がり性による高速化はいまひとつ

・・ データベースの縮約により、下のレベルの高速化をはかる(1)(1) 前回追加したアイテムより小さいアイテムは消す(2) (2) 現在の出現集合からできるデータベースの中で、頻出になっていないアイテムは消去する (再帰呼び出しの中で加えられることが無いから)(3) (3) まったく同一のトランザクションは、1つにまとめる

・・ 実データだと、下のほうのレベルではだいたい大きさが定数になる

θ が小さいときと速度の大きな差はないθ が小さいときと速度の大きな差はない

1 3 4 5

1 2 4 6

3 4 7

1 2 4 6 7

3 4 5 6 7

2 4 6 7

Page 46: いいプログラムは コーディング技術だけではない

キャッシュとの相性キャッシュとの相性キャッシュとの相性キャッシュとの相性

・・ 速いプログラムを作るとき、キャッシュのヒット率が良く問題になる - - ループを開く - - メモリの配置を変える

for i=1 to n { x[i]=0; }

for i=1 to n step 3 { x[i]=0; x[i+1]=0; x[i+2]=0; }● ● ● ● ● ●

● ● ●

▲ ▲ ▲●▲ ● ▲ ● ▲

再帰的に問題が小さくなり、ある反復より先ではキャッシュに入る

末広がり性より、ほぼ全ての部分でキャッシュに入っている

再帰的に問題が小さくなり、ある反復より先ではキャッシュに入る

末広がり性より、ほぼ全ての部分でキャッシュに入っている

Page 47: いいプログラムは コーディング技術だけではない

木構造を用いた圧縮 木構造を用いた圧縮 (( trie, prefix treetrie, prefix tree ))木構造を用いた圧縮 木構造を用いた圧縮 (( trie, prefix treetrie, prefix tree ))

・・ 各トランザクションを文字列とみなすと、 2 分木の形で格納でき、メモリを節約できる   振り分けと併用できる。スキャンの時間も、それだけ短くなる

* 1 2 5 6 7 9

7 8 9

7 9

21

3 4 5

7 9

7 9

A

C

D

B

E

F

A: 1,2,5,6,7,9B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,3,7,9F: 2,7,9

Page 48: いいプログラムは コーディング技術だけではない

コンテストの結果コンテストの結果コンテストの結果コンテストの結果

Page 49: いいプログラムは コーディング技術だけではない

計算機実験: 計算機実験: FIMI04FIMI04計算機実験: 計算機実験: FIMI04FIMI04

・ ・ FIMI: Frequent Itemset Mining Implementations

-- ICDM (International Conference on Data Mining) サテライトワークショップで、頻出/頻出飽和/極大頻出集合列挙のプログラムコンテストを行った。 2回目。 3回目はなし

・・去年は 15 、今年は 8個の投稿があった

ルール:- - ファイルを読み、列挙してファイルに書くこと-- time コマンドで時間を計測(メモリも他のコマンドで計測)

-- CPU を制御する命令(パイプラインなど)は使用禁止

Page 50: いいプログラムは コーディング技術だけではない

計算機実験: 計算機実験: FIMI04FIMI04計算機実験: 計算機実験: FIMI04FIMI04

・・計算機環境: CPU 、メモリ : Pentium4 3.2GHz 、 1GB RAM

OS 、言語、コンパイラ : Linux 、 C 言語、 gcc

・ ・ データセット: -  - 実データ: 疎、アイテム数大 -  - 機械学習用データ: 密、アイテム数小、規則的 -  - 人工データ: 疎、アイテム数大、ランダム -  - 密な実データ: 超密、アイテム数小

LCM (宇野有村清見)、見事優勝LCM (宇野有村清見)、見事優勝

Page 51: いいプログラムは コーディング技術だけではない

賞状と賞品賞状と賞品賞状と賞品賞状と賞品

賞品は { ビール , 紙おむつ }

“Most Frequent Itemset” だそうです

Page 52: いいプログラムは コーディング技術だけではない

実データ実データ(すかすか)(すかすか)

平均の大きさ平均の大きさ 5-105-10

実データ実データ(すかすか)(すかすか)

平均の大きさ平均の大きさ 5-105-10

BMS-POS retail

BMS-WebView2

Page 53: いいプログラムは コーディング技術だけではない

実データ実データ(すかすか)(すかすか)メモリ使用量メモリ使用量

実データ実データ(すかすか)(すかすか)メモリ使用量メモリ使用量

BMS-POS retail

BMS-WebView2

Page 54: いいプログラムは コーディング技術だけではない

密(密( 50%50%程度)程度)でで

構造があるデー構造があるデータタ

密(密( 50%50%程度)程度)でで

構造があるデー構造があるデータタ

pumsb

connect chess

Page 55: いいプログラムは コーディング技術だけではない

密で構造がある密で構造があるデータ、メモリデータ、メモリ

量量

密で構造がある密で構造があるデータ、メモリデータ、メモリ

量量

pumsb

connect chess

Page 56: いいプログラムは コーディング技術だけではない

密な実データ&密な実データ&巨大データ巨大データ

密な実データ&密な実データ&巨大データ巨大データ

accidents メモリ

web-doc

accidents

Page 57: いいプログラムは コーディング技術だけではない

飽和集合の列挙飽和集合の列挙飽和集合の列挙飽和集合の列挙

Page 58: いいプログラムは コーディング技術だけではない

頻出集合の問題点頻出集合の問題点頻出集合の問題点頻出集合の問題点

・・ 面白い頻出集合を見つけようとすると、 θ を小さくする必要がある 大量の頻出集合が出てくる

・・ 情報を失わずに、頻出集合的な、数の少ないものを   見つけるようにモデルを変えたい

1. 極大頻出集合:1. 極大頻出集合:他の頻出集合に含まれない頻出集合

2. 飽和集合:2. 飽和集合:出現集合が等しいものの中で極大なもの

111…1

000…0

Page 59: いいプログラムは コーディング技術だけではない

極大頻出集合と飽和集合の例極大頻出集合と飽和集合の例極大頻出集合と飽和集合の例極大頻出集合と飽和集合の例

・ ・ 頻出集合を出現集合で分類

1,2,5,6,7,92,3,4,51,2,7,8,91,7,92,7,92

TT ==

3つ以上に含まれるも3つ以上に含まれるも

のの

{1} {1} {2}{2} {7} {9} {7} {9}

{1,7}{1,7} {1,9} {1,9}

{2,7}{2,7} {2,9}{2,9} {7,9} {7,9}

{1,7,9} {1,7,9} {2,7,9}{2,7,9}頻出飽和集合

極大頻出集合 出現集合の共通部分が飽和集合になる

Page 60: いいプログラムは コーディング技術だけではない

極大頻出集合と飽和集合極大頻出集合と飽和集合極大頻出集合と飽和集合極大頻出集合と飽和集合

・ ・ 多項式時間で列挙できるかどうか、未解決・ ・ クリークと同じように枝刈りをすると、高速に列挙できる・ ・ 数が少ないが θ による解のぶれが大きい

両者とも、1つあたりほぼ定数時間、 1秒間に 1~ 10万個

両者とも、1つあたりほぼ定数時間、 1秒間に 1~ 10万個

極大頻出集合極大頻出集合

・・ 逆探索という探索手法で多項式時間列挙可能・・ 離散アルゴリズムと末広がり性を用いて、高速列挙可能・ ・ 出現の意味で情報の損失がない・ ・ ノイズが多いと出現集合が等しいものが少なくなり、   解の減少効率が悪くなる

・・ 逆探索という探索手法で多項式時間列挙可能・・ 離散アルゴリズムと末広がり性を用いて、高速列挙可能・ ・ 出現の意味で情報の損失がない・ ・ ノイズが多いと出現集合が等しいものが少なくなり、   解の減少効率が悪くなる

飽和集合飽和集合飽和集合飽和集合

Page 61: いいプログラムは コーディング技術だけではない

飽和集合の列挙手法飽和集合の列挙手法飽和集合の列挙手法飽和集合の列挙手法

・ ・ 頻出集合列挙ベース - - 頻出集合列挙アルゴリズムをベースに、多少無駄な計算

を省く - - 飽和集合のよさが出ない。計算時間の改善も少ない

・ ・ 保存 + 枝狩り   - - 見つけた解を保存し、それを用いて無駄な分枝を刈る - - 計算速度はまあまあ - - 解保存のためにメモリを使用し、それがひとつのネック

・ ・ 逆探索 + データベース縮約  ( LCM )   - - 計算効率が良い   - - 解保存用のメモリが不要

Page 62: いいプログラムは コーディング技術だけではない

飽和集合の隣接関係飽和集合の隣接関係飽和集合の隣接関係飽和集合の隣接関係

・ 飽和集合から、添え字の大きい順に要素を抜いていく

・ どこかで出現集合が大きくなる・ その出現集合の飽和集合を求める・ こうして求めた飽和集合を、親親とする (一意的に定まる)

・ ・ 親の頻出度は必ず真に大きいので、親子関係は非巡回的   親子関係は有向根付き木を導出する

Page 63: いいプログラムは コーディング技術だけではない

逆探索逆探索逆探索逆探索

親子関係は有向根付き木を導出する

この木を深さ優先探索すれば全ての解を見つけられるこの木を深さ優先探索すれば全ての解を見つけられる

・ 探索には、子供を見つけるアルゴリズムがあれば十分・ 子供が1つあたり多項式時間で見つかれば、全体も多項式

時間(親に要素を1つ加えて極大をとった飽和集合が子供になる)

非巡回的な親子関係と、子供を見つける多項式時間アルゴリズムがあれば、なんでも多項式時間列挙ができ

非巡回的な親子関係と、子供を見つける多項式時間アルゴリズムがあれば、なんでも多項式時間列挙ができ

Page 64: いいプログラムは コーディング技術だけではない

φ

1,7,9

2,7,9

1,2,7,9

7,9

2,5

2

2,3,4,5

1,2,7,8,9 1,2,5,6,7,9

親子関係の例親子関係の例親子関係の例親子関係の例

・・ データベースの全ての飽和集合とその親子関係

出現集合が隣接親子関係

1,2,5,6,7,92,3,4,51,2,7,8,91,7,92,7,92

TT ==

Page 65: いいプログラムは コーディング技術だけではない

子どもを求める子どもを求める子どもを求める子どもを求める

・ 子どもから親を作る際に抜いた、最後のアイテムを親に追加すると、出現集合は子どもと等しくなる

   子どもは、アイテムを1つ追加して、出現集合の共通部分をとると得られる

   とはいえ、そのようにして作ったもの全てが子どもになるとは限らない

   子どもである条件は、抜いたアイテムより前の部分に、新しくアイテムが追加されないこと

Page 66: いいプログラムは コーディング技術だけではない

・・ K+e の出現の共通部分、素直に計算してもよいが、「共通部分が K と等しいか」を調べるだけなので、必ずしも全て計算する必要はない

異なることがわかった時点で、計算をやめてよい

・・ K+e の出現それぞれを小さい順にたどり、全てに共通するものがあるか調べる

・ ・ 全てに共通するものがあったらK に入っているか調べる

・ ・ 前回たどったところで止まっておき、次回はそこからたどる

比較の手間比較の手間比較の手間比較の手間

K

K+e の出現集合

22 44 55 99

11 33 44 55 99

33

11

33

33 44 55 99

44 55 99

444433

11

11 44 99

22 44 66 9911

11 44 99

22 44 66 99

44 1111

1111

1111

1111

1111

66 999966 1111

Page 67: いいプログラムは コーディング技術だけではない

ビットマトリクスビットマトリクスビットマトリクスビットマトリクス

・ ・ スウィープポインタは、行列の形でデータを持ってないがゆえの工夫。隣接行列を持って入れば、もっと単純に速くできる

・・が、大きすぎて構築することすら不可能

・・ 出現集合がある程度以下に小さくなったところで、    行列を構築しよう  ビットで持てば、各列が 1つの変数に入る!

Page 68: いいプログラムは コーディング技術だけではない

ビットマトリクスの定数時間計算ビットマトリクスの定数時間計算ビットマトリクスの定数時間計算ビットマトリクスの定数時間計算・ ・ 各アイテムに対応する列を1変数で持っていると、 K+e の出現全てにそのアイテムが含まれるかどうか、 1 ステップでチェックでき

・ ・ K+e の出現のビットパターンと、アイテム i の列のビットパターンの AND をとる

・・アイテム i が K+e の出現全てに含まれるなら、共通部分は K+e の出現ビットパターンと等しくなる

・・・K の頂点 K<i ∩N(vi)

Page 69: いいプログラムは コーディング技術だけではない

実データ実データ(すかすか)(すかすか)

平均の大きさ平均の大きさ 5-105-10

実データ実データ(すかすか)(すかすか)

平均の大きさ平均の大きさ 5-105-10

BMS-POS retail

BMS-WebView2

Page 70: いいプログラムは コーディング技術だけではない

実データ実データ(すかすか)(すかすか)メモリ使用量メモリ使用量

実データ実データ(すかすか)(すかすか)メモリ使用量メモリ使用量

BMS-POS retail

BMS-WebView2

Page 71: いいプログラムは コーディング技術だけではない

密(密( 50%50%程度)程度)でで

構造があるデー構造があるデータタ

密(密( 50%50%程度)程度)でで

構造があるデー構造があるデータタ

pumsb

connect chess

Page 72: いいプログラムは コーディング技術だけではない

密で構造がある密で構造があるデータ、メモリデータ、メモリ

量量

密で構造がある密で構造があるデータ、メモリデータ、メモリ

量量

pumsb

connect chess

Page 73: いいプログラムは コーディング技術だけではない

密な実データ&密な実データ&巨大データ巨大データ

密な実データ&密な実データ&巨大データ巨大データ

accidents メモリ

web-doc

accidents

Page 74: いいプログラムは コーディング技術だけではない

参考文献など参考文献など参考文献など参考文献など

・・ 頻出集合およびその応用 (’90~ )   星の数ほど   “ frequent pattern” 、” frequent itemset” で検索すると出てくる・ ・ 極大頻出集合およびその応用 (’90~ )   やはり多い   “ maximal frequent itemset” などで検索すると出てくる・・ pasquer らのアルゴリズム (‘99) 飽和集合の導入・・ 宇野らのアルゴリズム LCM (‘04) 現在最速のアルゴリズム・ ・ 実装 LCM: (Linear time Closed itemset Miner) 宇野の HP http:research.nii.ac.jp/~uno/・ ・ レポジトリ (実装、論文、比較実験の数々) http://fimi.cs.helsinki.fi/・ ・ 中野・宇野・有村 (’ 03~ ) 順序木・無順序木の多項式時間頻出列挙

Page 75: いいプログラムは コーディング技術だけではない

閑話休題: 初期化のいらない配列閑話休題: 初期化のいらない配列閑話休題: 初期化のいらない配列閑話休題: 初期化のいらない配列

Page 76: いいプログラムは コーディング技術だけではない

閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列

・・ 配列は、普通、確保したら初期化( 0 などを代入)してから使う    初期化しないで使えるかな???

・ ・ 実はうまい方法がある

・・ 配列を準備。初期化せず。各セルには値を入れるところと、添え字を入れるところ、2つを割当てる・ ・ あと、もうひとつ、添え字の配列と、書き込まれた配列の数を覚えるカウンタを準備。カウンタは 0 に設定

配列

添え字配列

・・ 配列は、普通、確保したら初期化( 0 などを代入)してから使う    初期化しないで使えるかな???

・ ・ 実はうまい方法がある

・・ 配列を準備。初期化せず。各セルには値を入れるところと、添え字を入れるところ、2つを割当てる・ ・ あと、もうひとつ、添え字の配列と、書き込まれた配列の数を覚えるカウンタを準備。カウンタは 0 に設定

配列

添え字配列

Page 77: いいプログラムは コーディング技術だけではない

閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列閑話休題:初期化のいらない配列

配列

添え字配列カウンタ

・・ 配列の i 番目に値を代入するときは、添え字配列のカウンタの場所に、 i を書き込み、配列の添え字側に、カウンタを書き込む。カウンタを 1 進める。

・・ 配列 i 番目の値を参照するときは、添え字側の数字 p を見て、 p がカウンターより大きい、あるいは添え字配列の p 番目が i でないなら、代入されてない、と答える

配列

添え字配列カウンタ

・・ 配列の i 番目に値を代入するときは、添え字配列のカウンタの場所に、 i を書き込み、配列の添え字側に、カウンタを書き込む。カウンタを 1 進める。

・・ 配列 i 番目の値を参照するときは、添え字側の数字 p を見て、 p がカウンターより大きい、あるいは添え字配列の p 番目が i でないなら、代入されてない、と答える

01

2 0

Page 78: いいプログラムは コーディング技術だけではない

類似項目の発見類似項目の発見類似項目の発見類似項目の発見

Page 79: いいプログラムは コーディング技術だけではない

データベースから類似する項目を見つけるデータベースから類似する項目を見つけるデータベースから類似する項目を見つけるデータベースから類似する項目を見つける

・・ データベースの項目の中で、似た項目のペアを全て見つけたい(項目のペア全てについて、2項関係が成り立つかを調べる)

・・ 類似している項目の検出は、 データベース解析の基礎的な手法

    基礎的なツールがあれば、使い方しだいでいろいろなことができる(大域的な類似性、データの局所的な関連の構造・・・)

Page 80: いいプログラムは コーディング技術だけではない

類似項目発見の計算時間類似項目発見の計算時間類似項目発見の計算時間類似項目発見の計算時間

・・ 似たもののペアを全て見つけるさい、項目のペア全てについて、単純に全対比較を行うと項目数の2乗の時間がかかる    項目数が 100 万を越えるころか現実的には解けなくなる    100 万 ×100 万 ÷100 万(演算 per秒) = 100 万秒

・ ・ 類似検索を使う手もあるが、 100 万回のクエリを実行しなければならない。類似検索は完全一致より大幅に時間がかかる  1秒間にクエリが 1000回できるとして、 1000秒問題が大きいので、平均的な意味でよいので、

計算オーダーの小さいアルゴリズムがほしい問題が大きいので、平均的な意味でよいので、計算オーダーの小さいアルゴリズムがほしい

Page 81: いいプログラムは コーディング技術だけではない

応用1:似ている応用1:似ている webwebページの発見ページの発見応用1:似ている応用1:似ている webwebページの発見ページの発見

・・ web 検索を行うと、よく似た内容、あるいは引用しているものを多量に見つけることがある    ニュース記事、レビューの記事の一部など

・ ・ あらかじめ、類似しているページをグループのように検出できれば、こういった似たものをひとくくりにでき、検索エンジンの効率化にもつながる(検索結果を出してから似たものを見つける、という方法もあり)

・ ・ さらに、例えば、最近のホットな話題は何ですか、   というような検索もできるかもしれない

Page 82: いいプログラムは コーディング技術だけではない

応用2:リンクが似ている応用2:リンクが似ている webwebページページ応用2:リンクが似ている応用2:リンクが似ている webwebページページ

・・ リンク先、あるいはリンク元が、集合として似ているページは、よく似ていると考えられる    サッカーのページ、料理のページ、地域のページ

・ ・ グループ化すれば、コミュニティー発見、著名なトピック、 web の構造の解析など、いろいろなことがやりやすくなる

・ ・ さらに、例えば、「スパムサイト」の検出にも使えるかも (レポート課題のコピーの検出、とか)

Page 83: いいプログラムは コーディング技術だけではない

応用3:長い文章の比較応用3:長い文章の比較応用3:長い文章の比較応用3:長い文章の比較

・・ (文庫本のような)長い文章がいくつかあるときに、類似する部分がどことどこにあるかを検出したい   長い文章の比較はそれ自体が大変(時間がかかる)ので、複数あると手が出ない

・ ・ 長い文章を、短い文字列にスライスし、全体を比較する   大域的に似た部分は、局所的に似ている    ところを多く含むと思われる   つまり、似ている短い文字列のペアを多く含む

・ ・ 短い文字列の全対比較からアプローチできる

Page 84: いいプログラムは コーディング技術だけではない

応用4: ゲノムの比較応用4: ゲノムの比較応用4: ゲノムの比較応用4: ゲノムの比較

・・ 異なる種のゲノムを比較して、類似するところを見つけ出したい

 -   -  2つの染色体の比較( 1億文字以上) -  - 複数の、短い染色体の比較(バクテリアなど: 400 万程度) -   -  両方とも、ゲノムをスライスして全対比較する

ATGCCGCGGCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

ATGCCGCGGCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

Page 85: いいプログラムは コーディング技術だけではない

応用5: 特異的な部分を見つける応用5: 特異的な部分を見つける応用5: 特異的な部分を見つける応用5: 特異的な部分を見つける

・・ 似ているものがない項目は、データの中で特異的な部分と考えられる  - - 携帯電話・クレジットカードの不正使用  - - 制御システムの故障・異常の発見  - - 実験データから新しいものを発見  - - マーカーの設計 (「宇野毅明のホームページは、”助教授,宇野毅明の研究”で検索するとユニークに定まる)

・ ・ 比較的大きなデータが複数あるような場合でも、特異な項目を多く含むもの、他のどのデータとも、似ている部分が少ないものは、特異なデータだと考えられる

・ ・ 「似ている項目の数」は、データがエラーを含む際の統計量として使えるかも知れない

Page 86: いいプログラムは コーディング技術だけではない

応用5: マイクロアレイのデザイン応用5: マイクロアレイのデザイン応用5: マイクロアレイのデザイン応用5: マイクロアレイのデザイン

・・ マイクロアレイは調べたい DNA に、ある特定の短い文字列( 20 文字程度)が含まれているかどうかを検出する実験装置(いっぺんにたくさん実験できる)

・・ 特定の遺伝子(あるいは変化)が含まれているか、たくさんの微生物が含まれているコロニーの中に、特定の生物種がいるか、といったことを調べる際に使われる

・・ 短い文字列が、他の場所にも含まれていると、検出が効率良くできない 固有の短い文字列があらかじめわかっているとうれしい

Page 87: いいプログラムは コーディング技術だけではない

問題設定:短い文字列の比較問題設定:短い文字列の比較問題設定:短い文字列の比較問題設定:短い文字列の比較

・ ・ 具体的に見るため、扱うデータベースと問題を具体化する

問題:問題: 各項目が同じ長さ l の短い文字列( 50 文字程度)であるデータベースを入力したときに、文字列のペアで異なり数が d 文字以下である組を全て見つけよ (ハミング距離が d 以下)

・ ・ 長くて、ある程度似ている文字列は、このような似ている部分列をある一定数以上含むATGCCGCG

GCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

ATGCCGCGGCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

Page 88: いいプログラムは コーディング技術だけではない

問題の難しさ問題の難しさ問題の難しさ問題の難しさ

・・ 全ての項目が同じだと、およそ項目数 2) 個の出力がある  l を定数だと思えば、単純な全対比較のアルゴリズムが     計算量の意味では最適になる  計算量理論的には面白くない問題

・・ 現実には、やたらと似てるものがあるものを比較しても意味が無い  出力は少ないと仮定する

ATGCCGCGGCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

ATGCCGCGGCGTGTACGCCTCTATTGCGTTTCTGTAATGA  ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

・・ ATGCCGCG と AAGCCGCC・・ GCCTCTAT と GCTTCTAA・・ TGTAATGA と GGTAATGG     ...

Page 89: いいプログラムは コーディング技術だけではない

基本のアイディア:文字列の分割基本のアイディア:文字列の分割基本のアイディア:文字列の分割基本のアイディア:文字列の分割

・・ 各文字列を、 k ( >d ) 個のブロックに分割する・・ k-d 個のブロックの場所を指定したときに、そこがまったく等しくて、かつハミング距離が d 以下となるようなペアを全て見つけよ、という部分問題を考える

各文字列の k-d 個のブロックをつなげてキーにし、ソートをする。同じものはグループになる。それを総当りで比較すればよい・ ・ k-d 個のグループ数が大きければ、平均的にグループのメンバー数は小さくなるので、総当りで比較してもたいしたことない

Page 90: いいプログラムは コーディング技術だけではない

全ての場合を尽くす全ての場合を尽くす全ての場合を尽くす全ての場合を尽くす

・・ 先の部分問題を、全ての場所の組合せについて解く 2つの文字列が似てれば、必ずどこか k-d 個のブロックが同じ 必ずどれかの組合せで見つかる

・・ 部分問題は、バケツソートや Radixソートで速く解ける・ ・ 組合せの数は kCd 。の k=5 で d=2 なら 10通り

     ソート 10回 + α で解ける。全対比較よりもかなり高速

・・各文字の数から、1文字比較した場合に等しくなる確率を求め、適切な分割数 k を使用する

Page 91: いいプログラムは コーディング技術だけではない

例題例題例題例題

・ ・ ABC 、 ABD 、 ACC 、 EFG 、 FFG 、 AFG 、 GAB のペアでハミング距離が 1以下のものを求めよ

G A BA B CA B DA C CE F GF F GA F G

G A BA B CA B DA C CE F GF F GA F G

A B CA B DA C CE F GF F GA F GG A B

A B CA B DA C CE F GF F GA F GG A B

A B CA C CA B DA F G E F GF F GG A B

A B CA C CA B DA F G E F GF F GG A B

A B CA B DA C CA F GE F GF F GG A B

A B CA B DA C CA F GE F GF F GG A B

Page 92: いいプログラムは コーディング技術だけではない

重複の回避重複の回避重複の回避重複の回避

・ ・ まったく同じ文字列があると、全てのブロックの組合せで見つかるので、 kCd 。回出力される

   重複を回避する必要がある

・ ・ 各見つかったペアについて、選択されていないブロックが選択したブロックの間にあったら出力しないようにする   等しいブロックが一番左端によっている場合にのみ出力

メモリに解を保持せずとも、重複が回避できるメモリに解を保持せずとも、重複が回避できる

Page 93: いいプログラムは コーディング技術だけではない

イメージ的にはイメージ的にはイメージ的にはイメージ的には

・・ 似ているもののペアを探す問題は、マトリクスのセルの中で必要なものを全て見つける問題・・ 全対比較は、マトリクスのセルをすべて見ていることに対応・・ 分類によるアルゴリズムは、分類を順々にしていると思えば、木構造の探索を行っていることに対応

Page 94: いいプログラムは コーディング技術だけではない

実験:長さ実験:長さ 2020 文字で異なり数文字で異なり数 d d を変化を変化実験:長さ実験:長さ 2020 文字で異なり数文字で異なり数 d d を変化を変化

0.1

1

10

100

1000

10000

200

700

2000

7000

2295

3(1000 )長さ 文字

()

計算

時間秒

d=0d=1d=2d=3

Page 95: いいプログラムは コーディング技術だけではない

ゲノムの比較ゲノムの比較ゲノムの比較ゲノムの比較

染色体と染色体を比較する -  - 1億以上の文字列の比較になるので、非常に時間がかかる -  - アラインメントでは部分が入れ替わった構造が見つけられない

・ ・ 比較するゲノムを、オーバーラップするようにスライスし、全対比較

・ ・ 縦横に比較するゲノムをおきマトリクスを作って類似するペアがあるセルの色を白くする(実際は細長い四角でいい)

類似する構造が見える

Page 96: いいプログラムは コーディング技術だけではない

ゲノムの比較 ゲノムの比較 (1)(1)ゲノムの比較 ゲノムの比較 (1)(1)

ヒト 21番染色体とチンパンジー 22番染色体の比較・・長さ 3000 万の配列 ×2 から、 30 文字の切片を 3000 万個取る・ ・ 似ている部分配列のペアの数に応じて、各ドットの明るさを変える

・ ・ 白い部分が「似ている可能性のある部分」・ ・ 黒い部分が「 (絶対に ) 似ていない部分」

・ ・ 格子模様は、繰り返し  配列を拾っている

ヒト 21番染色体

チンパンジー

22

番染色体

PC で 1 時間で可能

Page 97: いいプログラムは コーディング技術だけではない

ゲノムの比較 ゲノムの比較 (2)(2)ゲノムの比較 ゲノムの比較 (2)(2)

ヒト X染色体とマウス X染色体の比較・・ 30 文字で間違い 2 文字以下のペアを列挙・ ・ 長さ 3000 、幅 300の領域に 3つペアがあれば点を打つ

・ ・ ノイズをかなり除去できている

PCPC でで 11 時間で可時間で可能能

ヒト X番染色体

マウス

X

染色体

Page 98: いいプログラムは コーディング技術だけではない

ゲノムの比較 ゲノムの比較 (3)(3)ゲノムの比較 ゲノムの比較 (3)(3)

バクテリアを 30 種ABC順の取得しつなげて比較

PC で 1 時間で可能

Page 99: いいプログラムは コーディング技術だけではない

(マイクロアレイ用の)(マイクロアレイ用の)固有な配列のデザイン固有な配列のデザイン(マイクロアレイ用の)(マイクロアレイ用の)固有な配列のデザイン固有な配列のデザイン

・ ・ マイクロアレイの設計には、ゲノム配列中でなるべく他の部分と似ていない配列が使えるとありがたい

・・ 配列の長さは20文字、のように決まっているので、対象となるゲノムの全て20文字の部分配列を比較し、似ているものがないもの、を見つければよい

・・ 似ている文字列の数、はある種の統計量として利用できるかもしれない

100M ベース、 25 文字、間違い 2 文字まで、くらいなら

PC で 1 時間で可能

Page 100: いいプログラムは コーディング技術だけではない

ゲノムの読み取りゲノムの読み取りゲノムの読み取りゲノムの読み取り・ ・ ゲノム配列は、そのままひも状のものを一度に読むことはできない。通常、一度に 500 文字程度しか読めない。

・ ・ そこで、染色体を 10 万文字程度の長さにぶつ切りにし、大腸菌に移植して増殖させる・ ・ 増殖したものをさらにぶつ切りにし、 500 文字程度ずつ読み、つなげる(できたものを BAC配列と言う)・ ・ BAC配列をさらにつなげて、もとの染色体を作る

Page 101: いいプログラムは コーディング技術だけではない

重なり部分の検出重なり部分の検出重なり部分の検出重なり部分の検出

・ ・ 短い配列を読んだとき、あるいは BAC配列を作ったとき、それがもとの染色体、 BAC配列のどの位置にあったかはわからない 配列を構成する際に使える情報は「どことどこが重なるか」

・ ・ 機械の読み取りエラーや大腸菌が増殖する際のコピーミスも起こりうるので、「完全に重なる」ではなく「だいたい重なる」でなければいけない・ ・ BAC1つ作るのに、 100-1000 万文字の比較が必要

Page 102: いいプログラムは コーディング技術だけではない

BACBAC配列の比較配列の比較BACBAC配列の比較配列の比較

・ ・ ゲノム全体の配列を決める際には、 BAC 同士がどのようにつながるかを調べる必要がある・・ しかし、どの配列とどの配列がオーバーラップしているか調べるのは、大変。(前述のアセンブリをミスしていると、微妙に異なるところが出て、重ならなくなる)

・・ 既存の手法は、直接的でない手段を使って比較をしていて、ときどきオーバーラップしそうなところを落としてしまう

・ ・ この手法なら全対比較可能

PC で 1ペア 1秒

Page 103: いいプログラムは コーディング技術だけではない

課題点課題点課題点課題点・ ・ マウス 13番染色体の未解読領域に対して、この相同検索アルゴリズムの適用を行っている 既にいくつかの空白部分が埋まった

・ ・ 比較は高速にできるようになった。しかし、比較した結果をどう使うか、どのような点に留意する必要があるか、といった点は、まだまだ明らかでない- - 実験の指針を出すためには、  何を出力する必要があるか- - どの程度の精度が必要か- - どこまで処理を自動化すべきか- - エラーをどのように扱うべきか 既存のアセンブリングソフトでは見つからない、特殊な重なり方をしている相同領域が見つかる。どう解釈すべきか?

Page 104: いいプログラムは コーディング技術だけではない

類似部分(アイテム)集合の列挙類似部分(アイテム)集合の列挙類似部分(アイテム)集合の列挙類似部分(アイテム)集合の列挙

Page 105: いいプログラムは コーディング技術だけではない

問題の定義問題の定義問題の定義問題の定義

入力: 部分集合族(トランザクションデータベース) D = {T1,…,Tn}

( ただし、各 Ti はアイテム集合 E = {1,…,n} の部分集合)  + 閾値 θ

出力: |Ti∩Tj| が θ より大きいような、

     全ての Ti 、 Tj のペア

例: 閾値 θ=2 のとき、(A,B), (A,C), (A,D), (A,E)

(C,D), (C,E), (D,E)

A: 1,2,5,6,7B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

DD ==

D が巨大かつ疎で(各 Ti が平均的に小さい)、出力の数がそれほど多くない( ||D|| の数倍)状況での高速化を考え

D が巨大かつ疎で(各 Ti が平均的に小さい)、出力の数がそれほど多くない( ||D|| の数倍)状況での高速化を考え

Page 106: いいプログラムは コーディング技術だけではない

単純に全対比較すると単純に全対比較すると単純に全対比較すると単純に全対比較すると

・ ・ 単純に全対比較するアルゴリズムを考える

for i=1 to |D|-1

for j=i to |D|

if |Ti∩Tj| ≧ θ then output (Ti, Tj )

・ ・ 共通部分の計算は、各 Ti をアイテム順でソートしておき、Ti 、 Tj をマージソートのように並行してスキャンすればよい。  時間は O(|Ti |+ | Tj|)

・ ・ 全体の計算時間は ∑ i,j(|Ti |+ | Tj|) = 2n ||D||

A: 1,2,5,6,7B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

DD ==

かなり時間がかかると見てよいかなり時間がかかると見てよい

Page 107: いいプログラムは コーディング技術だけではない

振り分けによる高速化振り分けによる高速化振り分けによる高速化振り分けによる高速化

・・各 Ti に対し、 |Ti∩Tj| が θ以上になるものを見つける問題を考える

・ ・ 各アイテム e に対して、 e を含む部分集合の集合を D(e) とする・ ・ Ti が含む各 e に対して、 D(e) の各 T に対して、カウントを1つ増やす、という作業をする 全ての e∈Ti についてこの作業をすると、各 Tj のカウントは |Ti∩Tj| になる

for each e∈Ti

for each Tj ∈ D(e), j>i, do c(T)++

・ ・ D(e) を添え字順にソートしておくと、 j>i である    Tj ∈ D(e) を見つけるのも簡単

A: 1,2,5,6,7B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

DD ==

Page 108: いいプログラムは コーディング技術だけではない

振り分けの計算時間振り分けの計算時間振り分けの計算時間振り分けの計算時間

for each e∈Ti

for each Tj ∈ D(e), j>i, do c(T)++

・・ 計算時間は ∑j ∑e Ti∈ |{ Tj∈D(e), i<j}| = ∑ e |D(e)|2

|D(e)| が平均的に小さければ、かなり速いA: 1,2,5,6,7B: 2,3,4,5C: 1,2,7,8,9D: 1,7,9E: 2,7,9F: 2

DD ==

Page 109: いいプログラムは コーディング技術だけではない

11再帰呼び出しの計算時間のイメージ再帰呼び出しの計算時間のイメージ11再帰呼び出しの計算時間のイメージ再帰呼び出しの計算時間のイメージ

・・ 普通に頻出度の計算をすると各 X+ e に対してデータを一回スキャンする

・・ 共通部分による計算はD(e) と D(e) のをスキャンする   D(X) を n-t 回スキャンし、データベースの t より大きなアイテムをスキャンする

・・ 振り分けは D(X) に含まれるトランザクションの t のをスキャンする t より大きなアイテムをスキャンする

(n-t)個

(n-t)個t

t

Page 110: いいプログラムは コーディング技術だけではない

計算実験計算実験計算実験計算実験

・・ web リンクのデータの一部を使用   -    - ノード数 550 万、枝数 1300 万   -    - Pentium4 3.2GHz 、メモリ 2GB

・・ リンク先 20個以上 288684個、 20個以上共有する ペア数が 143683844個、計算時間、約 8 分・ ・ リンク元 20個以上が 138914個、 20個以上共有する ペア数が 18846527個、計算時間、約 3 分・ ・ 方向を無視して、リンクが 100個以上あるものが 152131個、 100個以上共有するペア数が 32451468個、計算時間、約 7分・・方向を無視して、リンクが 20個以上あるものが 370377 個、 20個以上共有するペア数が 152919813個、計算時間、約14 分

Page 111: いいプログラムは コーディング技術だけではない

簡単に追加できる条件簡単に追加できる条件簡単に追加できる条件簡単に追加できる条件

・・ |A∩B| が、 |A| の α倍以上 、 (and/or) |B| の α倍以上・・ |A∩B| / |A B| ∪ ≧ α

・・ |A B|∪ - |A∩B| ≦ θ

など。この手の、共通部分や和集合の大きさから計算できる評価値であれば、簡単に評価できる

・・ 計算時間は、ほぼ線形で増えていくと思われるので、多少大きなデータでも大丈夫

Page 112: いいプログラムは コーディング技術だけではない

まとめまとめまとめまとめ

・ ・ 速いプログラムを作るための理論、アルゴリズム理論・ ・ 計算の構造・デザインを工夫することで、コーディング技術では届かないくらいの高速化を行う

- - 頻出集合を列挙するアルゴリズム  計算構造に着目して、解1つあたりの計算時間を短縮

- - 類似する項目のペアを列挙する出力数依存型のアルゴリズム  異なりの場所に注目し、分類による絞込みを行う

これからも、より質の高いプログラム作りを目指してがんばってください

これからも、より質の高いプログラム作りを目指してがんばってください