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

第3回 ツリーマップによる木構造の可視化(前編)

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

色データに特化したノードクラスの導入

次回のツリーマップの実践では,入力として大量の色データを使用します。そこであらかじめ,色データに特化した末端ノードクラスを用意しておくことにしましょう。Itemクラスを継承したColorItemクラスを,以下のように作成します。

リスト4 ColorItem.java

public class ColorItem extends Item {
    private Color color;

    public ColorItem(Color color, double area) {
        super(color.toString(), colorToVector(color), area);
        this.color = color;
    }

    private static MultiVector colorToVector(Color c) {
        return new MultiVector(c.getRed(), c.getGreen(), c.getBlue());
    }

    public Color getColor() { return color; }
}

ColorItemクラスでは,前回の実践に倣って,色が持つ赤・緑・青の3つの成分をベクトル化しています。

Ward法の導入

前回は,階層的クラスタリングの距離関数として「最短距離法」を採用しました。しかし,最短距離法は極めて単純な戦略であることから,データの分類感度がそれほど高くありません。もっと優秀なクラスタリング結果を得るために,より洗練された距離関数である「Ward法」を実装することにしましょう。

Ward法では,以下の式で定義されるd(C1, C2)がクラスタ間の距離となります。

d(C1, C2) = E(C1 | C2) - {E(C1) + E(C2)}
C1: クラスタ1
C2: クラスタ2
C1 | C2: C1とC2を統合したクラスタ
E(X): クラスタXの重心と,Xに含まれる各点の距離の二乗和

式や言葉で説明するよりも,実際のコードを読んだ方が理解は早いでしょう。以下が,Ward法の距離関数を実装したWardDistanceEvaluatorクラスになります。

リスト5 WardDistanceEvaluator.java

public class WardDistanceEvaluator implements DistanceEvaluator {
    public double distance(Node n1, Node n2) {
        double s12 = sumCentroidDistanceSq(new Cluster(n1, n2));
        double s1 = sumCentroidDistanceSq(n1);
        double s2 = sumCentroidDistanceSq(n2);
        return s12 - (s1 + s2);
    }

    private double sumCentroidDistanceSq(Node n) {
        List vectors = n.getVectors();
        // ノードに含まれる全ベクトルの平均値を求め,クラスタの重心とする
        MultiVector center = new MultiVector(vectors.get(0).dimension());
        for (MultiVector vector : vectors) {
            center.add(vector);
        }
        center.divide(vectors.size());

        // ノードに含まれる各ベクトルと重心の距離の二乗の総和を計算
        double sum = 0;
        for (MultiVector vector : vectors) {
            sum += vector.distanceSq(center);
        }
        return sum;
    }
}

後編に続く

今回は,ツリーマップの概要と,そのアルゴリズムの基本的な考え方を説明しました。また,ツリーマップを実践する準備段階として,前回作成した階層的クラスタリングのプログラムに機能追加を行いました。

後編となる次回は,これまでのプログラムを元にして,いよいよツリーマップの描画へと入っていきます。お楽しみに!

著者プロフィール

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

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

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