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