end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

Algorithm::KMeansを使ったk-meansによるカテゴライズ

cpanにはk-meansアルゴリズムを実装したmoduleがたくさん

http://search.cpan.org/search/?query=k-means&mode=all

search.cpan.orgで「k-means」をキーワードに検索すると、Algorithm::KMeans だけでなく、Text::Bayon や Algorithm::Cluster 等、約10個のモジュールが見つかりましたが、今回はなんとなく、検索結果の先頭に表示された Algorithm::KMeans を使用しました。

Algorithm::KMeansの使い方はpodよりも、examples 以下にあるsrcを読みましょう

http://search.cpan.org/perldoc?Algorithm::KMeans

Algorithm::KMeans には、当然、podによるドキュメントがありますが、ダウンロードファイルのexamples以下にサンプルコードがあるので、こちらも合わせて読むと、理解が速いと思います。

サンプルコードと実行結果

以下は、find_best_K_and_cluster.pl の抜粋と、その実行結果です。ポイントは、perl src内に記載しています。

#!/usr/local/bin/perl
use strict;
use Algorithm::KMeans;

#datafileは レコードを識別するidとデータを空白区切で記述
my $datafile = "mydatafile1.dat";
#maskでは、NはレコードID、1はデータとして利用するカラムということを意味します。
my $mask = "N111";

#引数:K
#  カテゴライズの数を指定しますが、K=0とするとカテゴリー数を
#  Algorithm::KMeansが勝手に決めてくれます。
#  tarコマンドのverboseオプションのようなものです。
#引数:terminal_output
#  terminal_output=1を指定すると、実行時のログを画面に出力します。
#  出力例は、以下の実行結果をご覧下さい。
#引数:write_clusters_to_files
#  write_clusters_to_files=1を指定すると、カテゴライズ結果を
#  ファイルに出力します。
my $clusterer = Algorithm::KMeans->new( datafile => $datafile,
                                        mask     => $mask,
                                        K        => 0,
                                        terminal_output => 1,
                                        write_clusters_to_files => 1);
$clusterer->read_data_from_file();

my ($clusters, $cluster_cters) = $clusterer->kmeans();
for my $cluster (@$clusters) {
#    print "Cluster:   @$cluster\n\n"
}

mydatafile1.dat

b24 4.70777611437551 2.88318615758548 0.906331328822535 
b4 -4.85692748356575 2.53017594823256 1.02026461037635 
b30 6.20883254580444 4.11986757494415 0.841734697610924 
b1 4.20872414313601 2.44099418454835 -0.267220839037002 
a0 11.0931423626348 0.992817544570446 4.58152268828654 
b7 -3.67904183610388 4.30040221978614 1.49814321153383 
a8 11.3962713072228 2.31444481071106 3.96073555174087 
a11 17.5706269327732 3.3850616961695 4.14806052622179 
c30 5.35520636345016 2.89761585173874 14.9115948155717 
b25 4.54070095390087 4.54556449467383 -1.8513757128377 

実行結果

$ ./find_best_K_and_cluster.pl 
data dimensionality:  3 
Value of Kmax is: 6
Clustering for K = 2
Clustering for K = 3
Clustering for K = 4
Clustering for K = 5
Clustering for K = 6

Displaying final clusters for best K (= 2) :


Cluster 1 (33 records):
  a0  a1  a10  a11  a12  a13  a14  a15  a16  a17  a18  a19  a2  a20  a21
  a22  a23  a24  a25  a26  a28  a29  a3  a4  a5  a6  a7  a8  a9  b13  b17
  b27  b8

Cluster 2 (57 records):
  a27  b1  b10  b11  b12  b14  b15  b16  b18  b19  b2  b20  b21  b22  b23
  b24  b25  b26  b28  b29  b3  b30  b4  b5  b6  b7  b9  c10  c11  c12  c13
  c14  c15  c16  c17  c18  c19  c2  c20  c21  c22  c23  c24  c25  c26  c27
  c28  c29  c3  c30  c31  c4  c5  c6  c7  c8  c9

Cluster 1 (33 records):
Cluster center 1: 12.4804 2.9648 3.6070

Cluster 2 (57 records):
Cluster center 2: 2.3759 2.6241 5.5357

Best clustering achieved for K=2 with QoC = 0.424403626757832
QoC values array for different K starting with K=2:
  0.424403626757832 0.454915875342538 0.542369026207561
  0.58724944835441 0.661041342701585
Writing cluster 1 to file Cluster1.dat
Writing cluster 2 to file Cluster2.dat

Algorithm::Cluster も試そうと思いましたが...

クラスタリングライブラリー(Cluster 3.0)のAPIであるAlgorithm::Clusterもありますが、今回はk-meansを触りだけを知りたかったので、やめておきましたが、また、機会があれば...

http://bonsai.hgc.jp/~mdehoon/software/cluster/
http://search.cpan.org/perldoc?Algorithm::Cluster
http://bonsai.hgc.jp/~mdehoon/software/cluster/cluster.pdf

その他、次のurlも気になる
http://d.hatena.ne.jp/download_takeshi/20100213/1266032005