色データに特化したノードクラスの導入
次回のツリーマップの実践では,
リスト4 ColorItem.
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クラスでは,
Ward法の導入
前回は,
Ward法では,
d(C1, C2) = E(C1 | C2) - {E(C1) + E(C2)}
C1: クラスタ1
C2: クラスタ2
C1 | C2: C1とC2を統合したクラスタ
E(X): クラスタXの重心と,
式や言葉で説明するよりも,
リスト5 WardDistanceEvaluator.
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;
}
}
後編に続く
今回は,ツリーマップの概要と,そのアルゴリズムの基本的な考え方を説明しました。また,ツリーマップを実践する準備段階として,前回作成した階層的クラスタリングのプログラムに機能追加を行いました。
後編となる次回は,これまでのプログラムを元にして,いよいよツリーマップの描画へと入っていきます。お楽しみに!