頻出パターンの高速計算 宇野 毅明 Joint work with 国立情報学研究所 有村 博紀 (北大) 佐藤 健 (情報研) 牧野 和久 (阪大) 中野 眞一 (群馬大) 清見 礼 (情報研) 浅井 達哉 (富士通研) 内田 雄三 (九州大) 2004年 12月10日 コンピューテーション研究会 本日の内容 ・ 頻出集合列挙問題の紹介 ・ 既存アルゴリズム・新規アルゴリズムの紹介 ・ プログラミングコンテスト(FIMI04)の結果紹介 実際にプログラムを作るときに、 アルゴリズム的な知見はどのように役立つか (3乗時間のアルゴリズムは動かない世界で) FIMI03優勝: FP-growth (Grahne, Zhu ) FIMI04優勝: LCM ver2 (宇野,清見,有村) トランザクションデータベース トランザクションデータベース: 各トランザクション T がアイ テム集合 E の部分集合になっているようなデータベース 1,2,5,6,7 つまり、 T , ∀T ∈T , T ⊆ E 2,3,4,5 T = 1,2,7,8,9 1,7,9 ・ POSデータ(各項目が、客1人の購入品目) 2,7,9 ・ アンケートのデータ(1人がチェックした項目) 2 ・ web log (1人が1回のwebサーフィンで見たページ) ・ オプション装備 (車購入時に1人が選んだオプション) 実際のデータは、大きくて疎なものが多い 集合の出現 集合K に対して: K の出現: K を含むT のトランザクション K の出現集合 I(K): K を含むT のトランザクション全ての集合 K の頻出度 frq(K): K の出現集合の大きさ 1,2,5,6,7,9 2,3,4,5 T = 1,2,7,8,9 1,7,9 2,7,9 2 {1,2}の出現集合 = { {1,2,5,6,7,9}, {1,2,7,8,9} } 頻出集合 ・ 頻出集合:T の定数α個以上のトランザクションに含まれる集合 (頻出度がα以上の集合)(αを最小サポートとよぶ) 例) データベースT の3つ以上のトランザクションに含まれる集合 1,2,5,6,7,9 2,3,4,5 T = 1,2,7,8,9 1,7,9 2,7,9 2 3つ以上に含まれるもの {1} {2} {7} {9} {1,7} {1,9} {2,7} {2,9} {7,9} {1,7,9} {2,7,9} バスケット分析 ・ スーパーなどの小売店舗で、同時に購入される事の多い品物 の組を知りたい ・ 客が購入した品目 ⇒ トランザクション ・ 品目の組で、多くの客が購入したもの ⇒ 多くのトランザクションに含まれるアイテム集合 ⇒ (あるαに対する)頻出集合 「おむつとビールの組合せが良く売れる」 という解析結果が有名 その他、分類ルールなどを見つけるなどに使われる 頻出集合の問題点 ・ 面白そうなアイテムの組を見つけようとすると、 αを小さくする必要がある ⇒ 大量の頻出集合が出てくる ・ 情報を失わずに、頻出集合的な、数の少ないものを 見つけるようにモデルを変えたい 極大頻出集合:他の頻出集合に含まれない頻出集合 飽和集合:次に解説 飽和集合 (closed itemset) ・ アイテム集合を頻出集合が等しいものでグループ分けする (各グループを同値類と見なす) 123…n ・ 飽和集合: グループ(同値類)の中の極大元 (= 出現集合の共通部分) 1,2,4,5 ⇒ ユニークに定まる 1,2,5,6,7,9 2,3,4,5 T = 1,2,7,8,9 1,7,9 2,7,9 2 3つ以上に含まれるもの {1} {2} {7} {9} {1,7} {1,9} {2,7} {2,9} {7,9} {1,7,9} {2,7,9} 3,5,7,9 φ 飽和集合 (closed itemset) ・飽和集合 ⇔ あるαに対して 極大頻出集合となる 123…n ・ アイテム集合Pの、出現集合の 共通部分をPの閉包という 1,2,4,5 3,5,7,9 ・ Pの閉包 ⇔ Pを含む極小(最小)な 飽和集合 極大頻出集合 頻出飽和集合 φ 問題 ・ 本発表で扱う問題: 与えられたデータベース T と α に対して、その 1.頻出集合を全て見つける 2.頻出飽和集合を全て見つける 3.極大頻出集合を全て見つける ・それぞれ多くの研究がある ・実装の研究も多くある これらの問題の既存研究と、我々のアルゴリズム LCM (Linear time Closed itemset Miner)を解説 問題の困難さ(頻出集合) ・ 頻出集合の部分集合は頻出集合 ⇒ 頻出集合は、アイテム束上で 空集合を含む連結な領域を構成する ⇒ 空集合を出発地点とし、 アイテムを1つずつ加える、 という方法で、任意の頻出集合が 頻出集合しか通らずに作れる 頻出集合は、バックトラックなどのグラフ探索手法で、 1つあたり入力の多項式時間で列挙できる 問題の困難さ(頻出飽和集合) ・ 飽和集合は、アイテム束上で連結な領域を作らない ⇒ 単純なバックトラックでは(効率良く)列挙できない ・ 飽和集合は、2部グラフの 極大2部クリークと等価 ⇒ 築山らのアルゴリズムで列挙できる ・ この列挙アルゴリズムの列挙木は 葉のほうが頻出度が小さい 頻出飽和集合は極大2部クリーク列挙アルゴリズム で、1つあたり入力の多項式時間で列挙できる 大 小 問題の困難さ(極大頻出集合) ・ 極大頻出集合は、アイテム束上で連結な領域を作らない ⇒ 単純なバックトラックでは(効率良く)列挙できない ⇒ 現在、多項式時間で 列挙できるかどうか不明 ・ 実際には、枝狩りなどのヒューリ スティックがうまくいくので、 実験上は1つあたり多項式時間 問題の困難さ(実際には) ・ 実際の計算では、頻出、飽和、極大、どれも1つ当たり入力多 項式時間で列挙できる ・ 計算コストがかかっているところは、むしろ多項式時間ででき る頻出度の計算 ・ その他、メモリ使用量の減少も課題 アルゴリズム技術の解説 ・ 列挙法 -アプリオリ (apriori) -バックトラック -枝狩り (pruning) (飽和・極大) -prefix保存飽和拡張 (飽和) -省メモリ枝狩り (極大) ・ データベース管理 - ビットマップ - FP-tree - データベース縮約 - 反復型 データベース縮約 ・ 極大・飽和性判定 ・ 頻出度計算 - 解の保存 -アプリオリ型 - データベース縮約 -ダウンプロジェクト (down project) -出現配布 頻出集合列挙 ・ 列挙法 ・ データベース管理 -アプリオリ (apriori) - ビットマップ -バックトラック - FP-tree ・ 頻出度計算 - データベース縮約 -アプリオリ型 - 反復型 -ダウンプロジェクト (down project) データベース縮約 -出現配布 列挙法:バックトラック ・ 空集合から出発し、分枝限定法的に探索するアルゴリズム ・ 現在の解に、1つアイテムを加えた各解に対し、再帰呼び出し ・ 重複を避けるため、現在の 1,2,3 1,2,4 1,3,4 2,3,4 解の末尾より大きな アイテムのみ追加 1,4 2,3 2,4 3,4 1,3 1,2 Backtrack (P) 1 1 Output P 2 For each e > P の末尾(P の最大のアイテム) If P ∪{e}が頻出 call Backtrack (P ∪{e}) 計算時間 = O( 頻出度計算×|E| ) メリット: メモリ使用量が小さい 2 3 φ 4 頻出度計算:ダウンプロジェクト ・ 集合 P∪{e} の出現集合を求める際、素直に行うと、 データベースの全ての項目を調べる必要がある ・ I (P∪{e}) ⊆ I (P) という性質を用いる ⇒ P の出現で e を含むものを見つければよい ⇒ I (P) ∩ I ({e}) を計算すればよい 123 ⊆ A,B,C,D 4 ⊆ B,D,E,F ↓ 1234 ⊆ B,D O( |I(P)| + |I({e})|) 時間 メリット:密すぎず、疎す ぎないデータで速い 列挙法:アプリオリ ・ 最初に大きさ1の頻出集合を全て見つけ、メモリに蓄える ・ 次に大きさ2の頻出集合を、大きさ1の頻出集合を 組合せて全て見つけ、メモリに蓄える ・ 以後、1つずつ大きさを増やす 計算時間 = O( 頻出度計算×|E| ) ・ 出現集合計算の工夫 123 ⊆ A,B,C,D ⇒ 124 ⊆ B,D,E,F 234 ⊆ B,D 1234 ⊆ B,D メリット: 出現集合計算の高速化 デメリット: メモリを大量消費&既発見解検索に手間がかかる 頻出度計算:出現配布 ・各 e = P の末尾, …, |E| について、I (P∪{e}) を 一度に全て計算する P = {1,2} のオカレンス A{1,2,4,5} B{1,2,3} C{1,2,3,4} ・バックトラック法は、末尾以降のアイテムを追加 ⇒ {1,2,3}, {1,2,4}, {1,2,5} の出現集合を計算 ⇒ 疎な行列の転置を求めているのと同じ ⇒ 非ゼロ要素数の線形時間で求められる 各 e について O( |I(P∪{e}|) ) 時間 A B C 3 4 5 4 5 5 3 3 A B C 1,2,3 B C 1,2,4 A 1,2,5 A B 実際の計算では ・ ダウンプロジェクトは、出現配布よりも計算量が大きいが、 キャッシュヒット効率が良いので、場合によっては(密なら)速い ・ アプリオリ頻出度計算が省略できる計算は、実験的には1/4 程度(ただし、アイテムを含まれる項目の少ない順にソート) P∪ 3 4 5 6 7 8 9 α AD ELM ABCEFGH JKLN ABDEFGI JKLMSTW BEGILT MTW ABCDFGH IKLMNST どっちもどっち??? データ保持:データベース縮約 ・ 入力したデータべースを縮小して、 メモリの節約と計算の高速化を行う ◆ e を含むトランザクションがα個未満 or 全てのトランザクションに含まれる ⇒ e をデータベースから削除 ◆ 等しいトランザクションは1つにまとめる ・サポートが大きいと劇的に小さくなる(データベース縮約とよぶ) データ保持:反復的縮約 ・ バックトラック法の各反復は、現在の解 P に e = P の末尾, …, |E| を追加 ⇒再帰呼び出しで呼び出される反復の中では、 P を含むトランザクションの末尾以降の部分しか必要でない ・ 必要な部分のみ取り出したデータベースを作り、 それを再帰呼び出しに渡す ・ さらにこれに、データベース縮約を適用すると 再帰呼び出し内の計算が高速化される データ保持:ビットマップ ・ 通常、トランザクションデータベースは巨大なので、データの保 持に工夫を加えると、省メモリ&高速化が行える ・ データベースを行列だと考え、それをビットマップ形式で保持 A B C D 1 1 0 0 0 2 0 1 1 0 3 0 1 0 0 4 1 0 0 1 5 0 1 1 1 メリット: ・ 密な場合効率が良い ・ 32個ずつ共通部分を取れる デメリット: ・ 疎な場合、効率が悪い データ保持:FP-tree FP-tree: prefix tree、trie とよばれるものと同じ ・ さらに、同一のアイテムをポインタで結ぶ (アイテムを1つ加えたときの頻出度計算のため) 1 /|\ 2 3 5 || 4 5 | 5 2 /|\ 2 3 4 /| 4 5 | 5 3 | 5 4 5 | 5 ・共有されるprefixの分だけ、 圧縮される ・圧縮率は通常1/2-1/3倍、 最良でも1/6倍程度 (ポインタ部分を除く) ・2分木操作のため、 計算時間は増大 ・反復型縮約操作が速い 頻出集合列挙:まとめ 列挙法と頻出度計算: ・ アプリオリは頻出度計算を1/4程度省略できる ・ バックトラックはメモリ使用量が小さい - ダウンプロジェクトは中間の密度に強い - 出現配布は疎なデータに強い ● 多くの実装は、バックトラック+ダウンプロジェクト ● LCMは、バックトラック+出現配布 データベース保持: ・ ビットマップは密なデータに強い ・ FP-treeは密な部分があるデータに強い ● 多くの実装は、データベース縮約+(ビットマップ or FP-tree) ● LCMは、反復型データベース縮約+配列 極大頻出集合列挙 ・ 列挙法 -アプリオリ (apriori) -バックトラック -枝狩り (pruning) (飽和・極大) -省メモリ枝狩り (極大) ・ 極大・飽和性判定 - 解の保存 - データベース縮約 極大列挙:解保存法 限定操作: 現在の解 P に対して、P ∪ {i,i+1,...,|E|} を含む頻出 集合がすでに見つかっていたら、 i 以降のアイテムを加えた再 帰呼び出しでは極大頻出集合は見つからない ・ メモリに暫定の極大解を全て保持する メモリを消費する & 包含関係の検索に時間がかかる ⇒ P を含む既発見解のみからなるデータベースを随時保持 ⇒ P の末尾以降のアイテムを頻出度順でソート 1,2,3 1,2 1,2,4 1,3 1 1,3,4 1,4 2,3,4 2,3 2,4 2 3 φ 3,4 4 極大列挙:バックトラック型枝狩り ・ バックトラック法による頻出集合列挙を考える P : 現在の解 ⇒ 1 2 3 4 5 Q: P を含む極大解 ⇒ ・ Q に含まれるアイテムが 最後に来るよう、並び替える 6 7 8 9 10 並び替え 6 8 10 4 5 7 9 ・ Q のアイテムを追加した再帰呼び出しでは、 極大頻出集合は見つからない メリット: メモリ使用量が小さい ⇒ 再帰呼び出しを省略 デメリット: 解保存法の枝狩りより 効率が悪い? 極大性判定 ・ 極大性の判定を素直に行うと、データベース縮約を用いない 頻出度計算以上の手間がかかる ・ 現在の解 P が極大頻出集合 ⇔ 任意の e に対して P∪ {e} が非頻出集合 ⇒ 最大 |E| 回の頻出度計算が必要 ・ 解保存法の場合は、包含関係の検索だけですむ 極大性判定:重みつきデータベース ・ 極大性判定にも縮約したデータベースを使う ただし、各要素に重みをつける ・ 縮約操作は、末尾以降が等しい トランザクションを合併する ・ このとき、末尾以前の 各アイテム e に対しても、 e を包むトランザクション数 を記録(これが重み) 1 A1 B 0 C 0 2 0 1 1 3 0 1 0 4 1 0 0 5 1 1 1 6 0 0 0 7 1 1 1 8 0 0 0 9 1 1 1 1 2 3 4 5 6 7 8 9 A 1 2 1 1 3 0 3 0 3 ’ 極大性判定:重みつきデータベース ・ 重みが合計が α 以上になるアイテムが存在 ⇔ 極大頻出集合ではない ⇒ 縮約データベースを作り、 各アイテムの重み和を 計算することで 極大性が判定できる 1 2 3 4 A’ 1 2 1 1 B 0 1 4 0 ’ C 0 1 0 0 ’ 5 6 7 8 9 3 0 3 0 3 3 0 4 4 0 1 0 1 1 1 メリット:解保存用のメモリ使用量が小さい デメリット: データベース保持用のメモリ使用量が大きい 計算速度はどっこいどっこい?? 極大頻出集合列挙:まとめ ・ 解保存 + 枝狩り (既存手法) - 計算効率は良い - 解保存のためにメモリを使用するが、頻出集合列挙 ほどは計算時間に対するメモリ使用量が大きくない ・ バックトラック型枝狩り + データベース縮約 (LCM) - 計算効率はまあまあ - 解保存用のメモリは不要だが、 重みつきデータベースが2倍のメモリを要する 飽和集合列挙 ・ 列挙法 -アプリオリ (apriori) -バックトラック -枝狩り (pruning) (飽和・極大) -prefix保存飽和拡張 (飽和) ・ 極大・飽和性判定 - 解の保存 - データベース縮約 飽和集合列挙:解保存法 ・ 頻出集合列挙を列挙し、解集合を保持する ただし、頻出度が同じスーパーセットが存在したら、消去する ⇒ アルゴリズム終了後、解集合は飽和集合の集合になる ・ さらに枝狩りを加える -例えば、バックトラック法で、 124 の閉包が1234 であり、飽和集合でないなら 任意のアイテム集合 124*** は飽和集合にならない メリット:枝狩りが比較的良く効く デメリット:メモリを大量に使用、包含関係の検索が重い 飽和集合列挙:飽和拡張 ・ 飽和集合 P に対して、 P の飽和拡張 = (P + アイテム) の閉包 閉包 飽和集合 + アイテム - 任意の飽和集合は、他の飽和集合の飽和拡張になる - ( P の頻出度) >( P の飽和拡張の頻出度) ⇒ 飽和拡張が導出する関係は、閉路を含まず、全ての飽 和集合を張る 飽和拡張の関係図 ・飽和拡張は非閉路的な関係を導出する ・出次数は高々 |E| frequent ・グラフ探索で(頻出飽和集合数の)線形時間で列挙できる メリット: 線形時間列挙 デメリット: 閉包の計算が重い、メモリを大量に使用 Prefix保存飽和拡張 ・ prefix保存飽和拡張は、飽和拡張のバリエーション 定義: 飽和集合P の閉包末尾 ⇔ P =閉包 (P ∩{1,…,j}) が成り立つ最小の j 定義: 飽和拡張 H = 閉包 (P ∪{i})が P のprefix保存飽和拡張 ⇔ i > j かつ H ∩{1,…,i-1} = P ∩{1,…,i-1} が成立 ・ prefix保存飽和拡張には閉包の操作のみ必要 (既発見解は不 要) ・ 任意の飽和集合は、他の唯一の飽和集合のPrefix保存飽和拡張 ⇒ メモリを使うことなく、飽和集合を重複なく探索できる 飽和拡張・prefix保存飽和拡張の例 φ ・ 飽和拡張 ⇒ 非閉路グラフ ・ prefix保存飽和拡張 ⇒ 木 2 7,9 1,2,5,6,7,9 2,3,4,5 T = 1,2,7,8,9 1,7,9 2,7,9 2 飽和拡張 prefix保存飽和拡張 1,7,9 2,5 1,2,7,9 1,2,7,8,9 2,3,4,5 1,2,5,6,7,9 2,7,9 頻出飽和集合列挙:まとめ ・ 解保存 + 枝狩り (既存手法) - 計算効率はまあまあ - 解保存のためにメモリを使用する 頻出集合列挙ほどではないが、極大よりは多い ・ バックトラック型枝狩り + データベース縮約 - 計算効率が良い - 解保存用のメモリが不要 (LCM) 計算機実験:FIMI04 ・ FIMI: Frequent Itemset Mining Implementations ICDM (International Conference on Data Mining) サテライト ワークショップで、頻出/頻出飽和/極大頻出集合列挙のプ ログラムコンテストを行った。去年・今年で2回目。 ・去年は15、今年は8個の投稿があった ・ルール:ファイルを読み、列挙してファイルに書くこと Time コマンドで時間を計測(メモリも他のコマンドで計測) CPUを制御する命令(パイプラインなど)は使用禁止 計算機実験:FIMI04 ・計算機環境:CPU、メモリ: Pentium4 3.2GHz、1GB RAM OS、言語、コンパイラ: Linux 、C言語、gcc ・ データセット: - 実データ: 疎、アイテム数大 - 機械学習用データ: 密、アイテム数小、規則的 - 人工データ: 疎、アイテム数大、ランダム - 密な実データ: 超蜜、アイテム数小 賞状と賞品 賞品は {ビール, 紙おむつ} “Most Frequent Itemset” だそうです 実データ(超疎) BMS-WebView2 飽和:LCM 頻出:LCM 極大:afopt 実データ(疎) kosarak 飽和:LCM 頻出:nonodrfp&LCM 極大: LCM 機械学習データ pumsb 頻出:いろいろ 飽和:LCM&DCI-closed 極大: LCM& FP-growth 密な実データ acidents 飽和:LCM&FP-growth 頻出:nonodrfp &FP-growth 極大: LCM &FP-growth メモリ使用量 pumsb 頻出 飽和 極大 観察と考察 ・ 頻出集合列挙には、apriori はそれほど効果がないようだ ・ FP-tree、データベースの縮小はαが大きいとき効く ・ 出現配布は、αが小さいとき効く ・ 極大性の判定は、他のアルゴリズムも優秀 ・ prefix保存飽和拡張・同値類が大きいと効果的 ・ 飽和性判定用データベース縮小は効果的 LCMは実データのような疎で構造があり解が多い場合に強い 今後の課題 ・ 密なデータベースを効率良く扱う ・ radix sort の高速化 ・ 極大列挙での効率の良い枝狩り ・ IOの改良 周りの評価はというと... ・ 頻出集合列挙をしている人々からの反応は今ひとつ ← 今までの流れにぜんぜん乗っていない 「君のはわけがわからないけど速いね」 ・ LCMは本質でないところで速くしている、という感触 ・ データマイニングの人からは、 - 仕事としては良い - FIMIは重箱の隅をつついている (現実問題への取り組みを前進させていない) ・ εペーパーの集まり??? (どこの分野もそうだけど) 今後の目標は ・ 列挙問題は、一般化された問題がない ☆ 数理計画 ⇒ LP、IP ☆データベース検索 ⇒ 2分木、SQL ☆ 全張木の列挙は、木の列挙では時間がかかりすぎ ・ 新しい問題に対して、列挙アルゴリズムを*簡単に*作れる ような知見が必要 ☆ 簡単・シンプル・速いアルゴリズム ☆ 問題構造の直感的解析 ☆ 実際の計算でのアルゴリズム技術やデータ構造 ・ FIMIも、こういう知見を得たいからやっているのだと思う 最後に ・ 今後、CPUの速度は以前のように劇的には向上しないようだ 今後はアルゴリズムの時代 (並列計算???) 頻出集合の列挙 ・ 頻出集合列挙のボトルネックは、頻出度計算 ・ 同値類内は、オカレンス集合が等しい ⇒ 頻出度計算が省略できる ・ 閉包を取らない解と閉包を取った解を保持 ⇒ 両者は、同値類中の超立方体を導出 ⇒ 超立方体内の解を列挙 同値類が大きければ効率が良い
© Copyright 2024 ExpyDoc