色集合の階層的クラスタリング
それでは,
- ブルー(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
いかがでしょうか。ブルーとシアン,
今回作成した階層的クラスタリングのプログラムは,
まとめと次回予告
今回は,
次回は視覚的な観点にフォーカスを移し,