具体例で学ぶ!情報可視化のテクニック

第2回 階層的クラスタリングによる特徴抽出

この記事を読むのに必要な時間:およそ 6 分

色集合の階層的クラスタリング

それでは,ClusterBuilderに実際にデータを入力して,動作を確認してみることにしましょう。テストデータとして,私たちに馴染みの深い「色」を使用します。モニタの表示色は,赤・緑・青の3つの成分を持っていますので,これを3次元のベクトルとして表現することが可能です。ここでは,次に示す6色をそれぞれベクトル化し,クラスタリングを実行してみます。なお,各色の色見本は図4の通りです。

図4

図4 color

  • ブルー(java.awt.Color.BLUE)
  • シアン(java.awt.Color.CYAN)
  • マゼンタ(java.awt.Color.MAGENTA)
  • オレンジ(java.awt.Color.ORANGE)
  • ピンク(java.awt.Color.PINK)
  • レッド(java.awt.Color.RED)

クラスタリングの実行結果は,何らかの形で画面上に表示する必要があります。今回は視覚的表現にはこだわらず,クラスタのツリー構造をそのままコンソールへ出力することにします。

以上を行うDemoクラスは,次のようになります。

リスト8

public class Demo {
    public static void main(String[] args) {
        new Demo().run();
    }

    public void run() {
        // 入力データを作成
        List<Item> input = new ArrayList<Item>();
        input.add(new Item("BLUE", colorToVector(Color.BLUE)));
        input.add(new Item("CYAN", colorToVector(Color.CYAN)));
        input.add(new Item("MAGENTA", colorToVector(Color.MAGENTA))); 
        input.add(new Item("ORANGE", colorToVector(Color.ORANGE)));
        input.add(new Item("PINK", colorToVector(Color.PINK)));
        input.add(new Item("RED", colorToVector(Color.RED)));

        // 最短距離法に基づく階層的クラスタリングを準備
        DistanceEvaluator evaluator = new NearestDistanceEvaluator();
        ClusterBuilder builder = new ClusterBuilder(evaluator);

        // クラスタリングを実行
        Node result = builder.build(input);

        // クラスタリング結果を表示
        output(result, 0);
    }

    private MultiVector colorToVector(Color c) {
        // 色成分を3次元のベクトルに変換
        return new MultiVector(c.getRed(), c.getGreen(), c.getBlue());
    }

    private void output(Node node, int depth) {
        // インデントを表示
        for (int i = 0; i < depth; i++) {
            System.out.print("  ");
        }
        if (node instanceof Item) {
            // 末端ノードなら項目名を表示
            System.out.println(((Item) node).getName());
        } else if (node instanceof Cluster) {
            // クラスタなら"+"を表示し,子ノードを再帰的に表示
            System.out.println("+");
            Cluster cluster = (Cluster) node;
            output(cluster.getLeft(), depth + 1);
            output(cluster.getRight(), depth + 1);
        }
    }
}

Demoクラスを実行すると,以下の出力が得られます。

図5

+
    +
        RED
        +
            MAGENTA
            +
                ORANGE
                PINK
    +
        BLUE
        CYAN

いかがでしょうか。ブルーとシアン,オレンジとピンクがそれぞれ統合され,オレンジとピンクのクラスタはさらにマゼンタと統合されています。類似性の強い色同士がグルーピングされている様子が良く分かると思います。

今回作成した階層的クラスタリングのプログラムは,より次元数の多いベクトルデータにも,そのまま適用が可能です。本連載の最終回では,はてなブックマークのエントリーをベクトル化し,クラスタリングすることが目標になります。

まとめと次回予告

今回は,統計学的な観点からの情報可視化へのアプローチとして,階層的クラスタリングの手法を紹介しました。また,実際に階層的クラスタリングを行うプログラムを作成し,動作確認を行いました。

次回は視覚的な観点にフォーカスを移し,ツリー構造を平面上にマッピングして可視化する「ツリーマップ」の手法を取り上げる予定です。ご期待ください。

著者プロフィール

浜本階生(はまもとかいせい)

1981年生まれ。栃木県出身。東京工業大学情報工学科卒業。技術やアイデアの組み合わせから面白いソフトウェアを生み出したいと日々考えている。現在,ブログの解析および視覚化の試みとして「TopHatenar」「Blogopolis」を開発,運用中。

URLhttp://d.hatena.ne.jp/kaiseh/