入力データを用意する
サンプルデータを確認する
前回はセグメンテーション分析の理論編として、
今回は、
なお、
今回利用するサンプルデータは、
今回のデータは、
- 1行が顧客1人のデータを意味する
 - カンマ区切りで、
左から 「R (最終購買日)」「F (購買頻度)」「M (購入金額)」を表す  
(省略) @DATA 顧客1の最終購買日, 顧客1の購買頻度, 顧客1の購買金額 顧客2の最終購買日, 顧客2の購買頻度, 顧客2の購買金額 顧客3の最終購買日, 顧客3の購買頻度, 顧客3の購買金額 (省略)
今回のデータはR、
ARFF形式をVector形式へ変換する
MahoutでK-Meansを実行する場合、
サンプルデータはARFF形式なので、
hadoop fs -put gihyo-mahout-kmeans-sample.arff . mahout arff.vector --input gihyo-mahout-kmeans-sample.arff --output gihyo-mahout-kmeans-sample.vector --dictOut gihyo-mahout-kmeans-sample.dict
arff.
- --input ⇒ 入力ファイル
 - --output ⇒ 出力ファイル
 - --dictOut ⇒ dictionaryファイルの出力先
 
生成されたVectorファイルは、
mahout seqdumper -i gihyo-mahout-kmeans-sample.vector mahout vectordump -i gihyo-mahout-kmeans-sample.vector
なお、
K-Meansをコマンドラインから実行する
kmeansコマンドを実行する
それでは、
MahoutのK-Means実装は、
mahout kmeans
kmeansコマンドのおもなパラメータとして以下があります。
- --input(-i) ⇒ 入力元
 - --output(-o) ⇒ 出力先
 - --distanceMeasure(-dm) ⇒ 距離計算方法の指定。デフォルト値はユークリッド平方距離
 - --numCluster(-n) ⇒ 生成するクラスタの数
 - --clusters(-c) ⇒ 初期クラスタ
 - --convergenceDelta ⇒ 収束閾値。クラスタ重心の1回の移動距離が閾値以下になった場合、
計算を終了する  - --maxIter ⇒ クラスタ重心点の最大計算回数
 - --overwrite(-ow) ⇒ 出力先にファイルがすでにあった場合に上書きを行う
 - --clustering ⇒ clusteredPointsの出力。clusteredPointsには、
各要素がどのクラスタに属するかが記載されている  - --method ⇒ mapreduceを指定した場合はMapReduceによる計算、
sequentialを指定した場合はローカルマシンによる計算を行う。デフォルト値はmapreduce  
今回は、
- クラスタ重心点の最大計算回数 ⇒ 50回
 - 生成するクラスタの数 ⇒ 10個
 - クラスタの初期座標 ⇒ ランダム
 - clusteredPointsの出力 ⇒ 有り
 - 距離計算方法 ⇒ ユークリッド距離
 
以下のコマンドを入力してみてください。
mahout kmeans --input gihyo-mahout-kmeans-sample.vector --output gihyo-kmeans-output --maxIter 50 --numClusters 10 --clusters gihyo-kmeans-null-cluster --clustering -dm org.apache.mahout.common.distance.EuclideanDistanceMeasure
今回は出力先にhdfsを利用しているので、
hadoop fs -lsr gihyo-kmeans-output
以下のような出力が表示されたでしょうか?
-rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/_policy drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusteredPoints -rw-r--r-- 1 yamakatu supergroup 46560 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusteredPoints/part-m-0 drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0 -rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/_policy -rw-r--r-- 1 yamakatu supergroup 359 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/part-00000 (省略) -rw-r--r-- 1 yamakatu supergroup 359 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/part-00009 (省略) drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final -rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final/_policy -rw-r--r-- 1 yamakatu supergroup 332 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final/part-00000 (省略)
MahoutのKmaensコマンドは、
最終結果には、
--clusteringパラメータにより生成されるgihyo-kmeans-output/
K-Meansの実行結果を確認する
次に、
生成されたクラスタは、
mahout clusterdump
clusterdumpコマンドのおもなパラメータとして、
- --input(-i) ⇒ 入力元
 - --output(-o) ⇒ 出力先
 - --outputFormat(-of) ⇒ 出力フォーマット。デフォルトのTEXT以外にCSV、
GRAPH_ ML (GraphML形式) を指定可能  - --pointsDir(-p) ⇒ clusteredPointsの指定
 - --dictionary(-d) ⇒ dictionaryファイル指定
 
今回は、
mahout clusterdump --input gihyo-kmeans-output/clusters-20-final --output ~/gihyo-kmeans-dump.text
次に、
cat ~/gihyo-kmeans-dump.text
VL-959{n=103 c=[22.165, 82.806, 27.854] r=[12.907, 11.927, 15.057]}
VL-969{n=98 c=[73.776, 85.929, 26.561] r=[14.760, 9.117, 15.672]}
(省略)
ここで表示される出力結果は、
- VL-x ⇒ クラスタ
 - n ⇒ そのクラスタに属する要素の数
 - c ⇒ そのクラスタの重心
 - r ⇒ そのクラスタの半径
 
クラスタ数を10で実行していますので、
各クラスタに属する要素を同時に出力したい場合は、
mahout clusterdump --input gihyo-kmeans-output/clusters-20-final --output ~/gihyo-kmeans-dump.text -p gihyo-kmeans-output/clusteredPoints
clusteredPointsの内容だけを確認したい場合は、
mahout seqdumper --input gihyo-kmeans-output/clusteredPoints
CanopyクラスタリングをK-Meansの前処理として実行する
canopyコマンドを実行する
前回でもとりあげたように、
Mahoutでは、
mahout canopy
canopyコマンドのおもなパラメータとして、
- --input(-i) ⇒ 入力元
 - --output(-o) ⇒ 出力先
 - --distanceMeasure(-dm) ⇒ 距離計算方法の指定。デフォルト値はユークリッド平方距離
 - --t1 ⇒ t1値
 - --t2 ⇒ t2値
 - --overwrite(-ow) ⇒ 出力先にファイルが既にあった場合に上書きを行う
 - --clustering ⇒ clusteredPointsファイルの出力。clusteredPointsファイルには各要素がどのクラスタに所属するか記載されている
 - --method ⇒ mapreduceを指定した場合はMapReduceによる計算、
sequentialを指定した場合はローカルマシンによる計算を行う。デフォルト値はmapreduce  
以下のコマンドを入力し、
mahout canopy --input gihyo-mahout-kmeans-sample.vector --output gihyo-canopy-output --t1 33 --t2 40 --clustering -dmorg.apache.mahout.common.distance.EuclideanDistanceMeasure
今回の入力データは、
K-Means同様、
mahout clusterdump --input gihyo-canopy-output/clusters-0-final --output ~/gihyo-canopy-dump.text
今回の著者の環境では、
ただし、
Canopyクラスタリングの結果を利用してK-menasを実行する
次に、
Canopyクラスタリングの結果をK-Meansの初期値とする場合、
mahout kmeans --input gihyo-mahout-kmeans-sample.vector --output gihyo-kmeans-canopy-output --maxIter 50 --clusters gihyo-canopy-output/clusters-0-final --clustering -dmorg.apache.mahout.common.distance.EuclideanDistanceMeasure
これまでと同様、
このように、
ライブラリ呼び出しでK-MeansとCanopyクラスタリングを実行するには
ライブラリを利用してMahoutのK-MeansとCanopyクラスタリングを実行するには、
- K-Means
 - ⇒org.
apache. mahout. clustering. kmeans. KMeansDriverクラス  - Canopyクラスタリング
 - ⇒org.
apache. mahout. clustering. canopy. CanopyDriverクラス  
これらは、
次回は、