情報システム基礎論2:第 10 回 (担当: 古賀) Jaccard 係数と Min Hash 2014 年 6 月 24 日 レジュメ URL: http://sd.is.uec.ac.jp/koga/lecture/IF2/ 今回の講義では集合間の類似検索について講義する。とくに集合間の類似度である Jaccard 係数を用い た類似検索を取り扱う。 1 Jaccard 係数 3つの集合 C1 = { みかん、りんご、メロン、グレープフルーツ } C2 = { みかん、いちご、梨、ぶどう } C3 = { みかん、いちご、梨、桃 } の類似性を考えてみよう。 Jaccard 係数は集合間類似度の代表例であり、式 (1) により定義される。直観的には 2 集合の共通要素 の割合を表し、値域は 0 から 1 の間。 sim(Ci , Cj ) = |Ci ∩ Cj | . |Ci ∪ Cj | (1) 上の例では、 sim(C1 , C2 ) = sim(C2 , C3 ) = sim(C3 , C1 ) = 1 . 7 3 . 5 1 . 7 Jaccard 係数は文書間の類似性判定やマーケット分析など様々な分野で使われる。 • マーケット分析 商品 Ci に対して、「Ci を購入した客」の集合を考える。Ci と Cj の Jaccard 係数大 → Ci と Cj は 同時に買われる商品 • 文書間の類似性判定 文書 Ci に対して、「Ci に含まれる単語」の集合を考える。 2 集合の 2 値ベクトル表現 集合は要素の種類数を次元とする 2 値ベクトルとして表現できる。例えば、1 章の例では、各 Ci は 8 種 類の果物 { みかん、りんご、メロン、グレープフルーツ、いちご、梨、ぶどう、桃 } を含むかどうかで 8 次元ベクトルとして表現できる。 C1 = (1, 1, 1, 1, 0, 0, 0, 0), C2 = (1, 0, 0, 0, 1, 1, 1, 0), C3 = (1, 0, 0, 0, 1, 1, 0, 1)。 1 Jaccard 係数を用いた類似検索 3 • n: データ数 • d: ベクトルの次元 とする (図 1)。 クエリ q との Jaccard 係数が大きいデータを検索する問題。全てのデータとの Jaccard 係数を計算する と計算時間は O(nd)。しかも、一般に d は非常に大きい (1 万以上)。 また、Ci は疎ベクトル (多くの 0 を含む) になることが多い。 d C1 n Ci 1 1 0 0 ... 1 0 Cj 1 1 1 1 ... 0 0 Cn 図 1: データベース 4 Min Hash Min Hash は要素が 0,1 で構成されるベクトルに対する確率的なハッシュ関数で、Jaccard 係数に対する Locality-Sensitive Hashing である。 4.1 ハッシュ値 mh(Ci ) の計算 1. ランダムにベクトルの列を入れ替える規則 π を決定。 2. Ci の列の入れ替えたベクトルを Ci0 とする。 3. Ci0 を 1 列目から順に見て最初に非零要素が出てくる列を coli とする。 4. Ci のハッシュ値 mh(Ci ) = coli 例: 列の入れ替え規則が以下の時、 12345678 ↓π 23487165 2 • C20 = (0, 0, 0, 0, 1, 1, 1, 1). mh(C2 ) = 5. • C30 = (0, 0, 0, 1, 0, 1, 1, 1). mh(C3 ) = 4. 定理 1 Ci と Cj のハッシュ値 mh(Ci ) と mh(Cj ) が一致する確率は Jaccard 係数 sim(Ci , Cj ) と等しい。 P [mh(Ci ) = mh(Cj )] = |Ci ∩ Cj | = sim(Ci , Cj ). |Ci ∪ Cj | 定理 1 から Min Hash は locality sensitive hashing の 1 種。 Jaccard 係数の性質: 各列は Ci と Cj の値によって 4 タイプに分類できる。 タイプ A タイプ B タイプ C タイプ D sim(Ci , Cj ) = Ci 1 1 0 0 Cj 1 0 1 0 |A| . |A| + |B| + |C| タイプ D の列は Jaccard 係数とは関係ない。 定理 1 の証明: Min Hash では最初に非零要素が出てくる列まで飛ばす → Ci0 = 0 かつ Cj0 = 0 となる列は ハッシュ値が一致するかどうかと無関係。つまり、タイプ D の列は無視される。 結局、列をランダムに入れ替えた時、タイプ A,B,C の中でどのタイプが一番最初に出現するかでハッ シュ値が一致するかどうかが決まる。 • タイプ A → ハッシュ値一致する。 • タイプ B or C → ハッシュ値一致しない。 従って、 P [mh(Ci ) = mh(Cj )] = 5 |A| . |A| + |B| + |C| 実装 Min Hash の計算ではデータベースの列の入れ替えを行うが、ハードディスク上に存在するデータベー スに対しては処理が重く現実的ではない。 実際には列の入れ替えを行わない。その代わりに第 t 列 (1 ≤ t ≤ d) の入れ替え後の列番号 r(t) を記憶 しておく。Ci のハッシュ値は次のようにして計算できる。但し、Ci [t] は Ci の第 t 列の値。 mh(Ci ) = 4 章の例では、 min {t|Ci [t]==1} 12345678 ↓π 23487165 t r(t) 3 r(t); 1 6 2 1 3 2 4 3 5 8 6 7 7 5 8 4 C2 = (1, 0, 0, 0, 1, 1, 1, 0) なので、mh(C2 ) = min {6, 8, 7, 5} = 5。 利点: 集合を d 次元 2 値ベクトルではなく、持っている要素によって表現可能。例えば、C2 = {1, 5, 6, 7} と表現してもハッシュ値を計算できる。 6 Min Hash を用いた Jaccard 係数の近似計算 列の (ランダムな) 入れ替え規則を変えた k 個のハッシュ関数 mh1 , mh2 , · · · mhk を用意する。そして、 各 Ci に対して k 個のハッシュ値 mh1 (Ci ), mh2 (Ci ), · · · , mhk (Ci ) を得る。Ci と Cj の Jaccard 係数 sim(Ci , Cj ) を k 個のハッシュ値の内、何個が一致するかによって近似計 算できる。 アルゴリズム match = 0; for (1 ≤ t ≤ k){ if(mht (Ci )==mht (Cj )) match++; } return match ; k 定理 1 から 1 match = k · sim(Ci , Cj ) = sim(Ci , Cj ). E k k 本技術は大量の集合間で Jaccard 係数を計算する必要がある時に有用。集合数を n とすると、O(ndk+n2 k) で全ペア間の Jaccard 係数を近似計算できる。 • O(ndk): ダイジェストの生成 • O(n2 k): ダイジェストを用いた Jaccard 係数の近似計算 7 Min Hash を利用した類似検索 Min Hash を LSH として使用して、Jaccard 係数に対する類似検索が実現できる。Google News の recommendatation system で使われている。 • k 個のハッシュ値を連結して出力する関数を l 個用意する。g1 , g2 , · · · , gl とする。 for 1 ≤ j ≤ l, gj (Ci ) = (mhj1 (Ci ), mhj2 (Ci ), · · · , mhjk (Ci )) • l 個のハッシュテーブル T1 , T2 , · · · , Tl を作成する。各 Ci を l 個のハッシュテーブルに登録。テーブ ル Tj 内で Ci をバケツ b(gj (Ci )) に格納する。 q と類似するデータの検索: Tj (1 ≤ j ≤ l) のバケツ b(gj (q)) に格納されているデータを q の類似データの候補とする。類似データ候補 に対して、Jaccard 係数を計算し本当に類似しているデータを決定する。 4
© Copyright 2024 ExpyDoc