Count-Min Sketch Library

Introduction

Madoka は Count-Min sketch というデータ構造のライブラリであり,大規模なデータに含まれるアイテムの頻度を求めたいときなどに有用です.Madoka は Conservative update という手法を使ってスケッチの精度を高めています.また,不要なカウントを抑える手法や近似的なカウンタなどの導入により,高い空間効率を実現しています.詳細については,以下のサイトを参照してください.

Madoka は Groonga プロジェクト( Groonga - カラムストア機能付き全文検索エンジン )の一環として開発されました.

Installation

$ wget https://github.com/downloads/s-yata/madoka/madoka-0.0.2.tar.gz
$ tar zxf madoka-0.0.2.tar.gz
$ cd madoka-0.0.2/
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig

ソースコードのアーカイブ をダウンロードして展開した後,configuremake を実行すればビルド・インストールできます.環境によっては ldconfig が必要になるかもしれません.

ソースコードを GitHub 上のリポジトリから得たときは,configuremake の前に autoreconf -i を実行して configure ファイルを生成する必要があります.

Madoka は Ubuntu 11.10 においてテストされています.ビルド・インストールにおいて問題が起きたときは, GitHub から報告していただけると助かります.

Example

#include <iostream>
#include <madoka.h>

int main() {
  madoka::Sketch sketch;
  sketch.create();

  sketch.inc("Madoka", 6);
  sketch.inc("Homura", 6);
  sketch.inc("Homura", 6);

  std::cout << "Madoka: " << sketch.get("Madoka", 6) << std::endl;
  std::cout << "Homura: " << sketch.get("Homura", 6) << std::endl;
  std::cout << "Mami: " << sketch.get("Mami", 4) << std::endl;

  return 0;
}

Madoka の基本的な使い方を示した C++ のサンプルコードです.この例では,デフォルトの設定を使ってスケッチを作成し,"Madoka""Homura" の頻度をカウントした後で,結果を出力しています.実行結果は "Madoka: 1", "Homura: 2", "Mami: 0" となります.

Interface

Count-Min sketch の基本機能はアイテムの頻度を求めることですが,スケッチ同士の内積を推定できることから,スケッチを特徴ベクトルとして使うことも可能です.さらに,Madoka ではスケッチの合成や縮小をサポートしています.詳細については,以下のドキュメントを参照してください.

Implementation

License

Madoka は二条項 BSD ライセンス( The BSD 2-Clause License )を採用しています.

Copyright (c) 2012, Susumu Yata. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.