29
Introduction to Fuzzy kmeans on Mahout (Fuzzy c-means) lawmn 12th Jun. 2011 #TokyoWebmining

Introduction to fuzzy kmeans on mahout

Embed Size (px)

Citation preview

Page 1: Introduction to fuzzy kmeans on mahout

Introduction toFuzzy kmeans on Mahout

(Fuzzy c-means)

lawmn12th Jun. 2011

#TokyoWebmining

Page 2: Introduction to fuzzy kmeans on mahout

始めに

この知識は個人的なものであり会社とは関係ありません。

Page 3: Introduction to fuzzy kmeans on mahout

Agenda

1. 自己紹介2. Clustering overview3. kmeans on Mahout4. Fuzzy kmeans on Mahout5. Mahout上でのFuzzy kmeans実行6. Reference

Page 4: Introduction to fuzzy kmeans on mahout

自己紹介

● 名前○ lawmn

● 出身○ 新潟県

● 使用言語○ Python, C#

● 大学のときの専攻○ 素粒子物理学専攻、博士号取得(仕事とはなんの関係もあり

ません)● 趣味

○ 旅行■ 今のところ行ったことがあるところは20カ国■ 南米に行ってみたい

Page 5: Introduction to fuzzy kmeans on mahout

MahoutJP

● MahoutJPのお手伝い

Page 6: Introduction to fuzzy kmeans on mahout

Clustering overview

● Clustering○ 教師データなしでデータを分類

● Classification○ 教師データありでデータを分類

データの分類方法

Page 7: Introduction to fuzzy kmeans on mahout

Clustering overview

データの分類方法

● Clustering○ 教師データなしでデータを分類

● Classification○ 教師データありでデータを分類

Page 8: Introduction to fuzzy kmeans on mahout

@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9

Clustering overview

Page 9: Introduction to fuzzy kmeans on mahout

Clustering overview

@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9

Page 10: Introduction to fuzzy kmeans on mahout

Clustering overview

@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9

Page 11: Introduction to fuzzy kmeans on mahout

kmeans on Mahout

以下の評価関数を最小化するクラスタリング(n個のデータ点をk個のクラスタに分割する)

:データ点

:クラスタ中心

:ユークリッド距離

Page 12: Introduction to fuzzy kmeans on mahout

kmeans on Mahoutアルゴリズム

1. 全データから初期中心を選ぶ2. クラスタ中心と各データとの距離を求め、距離が最も近い中心のクラスタにデータ

を割り当てる3. クラスタ中心の変化が閾値以下だった場合は処理を終了する4. 各クラスタの中心を計算する5. 2の処理へ

@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9

Page 13: Introduction to fuzzy kmeans on mahout

kmeans vs Fuzzy kmeanskmeans

● 一つのデータを一つのクラスタに割り当て● 利点

○ アルゴリズムが単純● 欠点

○ データを無理にでも一つのクラスタに割り当てないといけない○ はずれ値に影響を受けやすい(クラスタ中心が引っ張られる)

● 適用例○ 画像減色処理○ http://opencv.jp/opencv2-x-samples/k-means_clustering

fuzzy kmeans● 一つのデータを複数のクラスタに割り当て● 割り当て方は各クラスタへの帰属度で指定● 利点

○ 完全に分割できないデータで有効○ はずれ値に影響を受けにくい

● 欠点○ kmeansに比べてアルゴリズムが複雑

● 適用例○ 遺伝子発現データのクラスタ解析(バイオインフォマティクス)○ http://www.sbj.or.jp/wp-content/uploads/file/sbj/8407_tokusyu_03.

pdf

Page 14: Introduction to fuzzy kmeans on mahout

Fuzzy kmeans on Mahout

以下の評価関数を最小化するクラスタリング(n個のデータ点をk個のクラスタに分割する)

:データ点

:クラスタ中心

:ユークリッド距離

:fuzziness(m > 1)

:クラスタへの帰属度

Page 15: Introduction to fuzzy kmeans on mahout

Fuzzy kmeans on Mahoutアルゴリズム

1. 全データから初期中心を選ぶ2. 初期中心を固定して、クラスタへの帰属度を計算する3. 2で計算した帰属度を用いて, 各クラスタの中心を計算する4. 3で計算した中心を用いて,帰属度を計算する5. 3~4を繰り返し、クラスタ中心の変化が閾値以下であれば終了

最終的に上図のようになる

kmeans

Fuzzy kmeans

Page 16: Introduction to fuzzy kmeans on mahout

Fuzzy kmeans on Mahout

パッと見、評価関数を以下で定義してもfuzzy kmeansが実行できるように見える。

しかし、この場合に帰属度の条件を満たし最小化しようとするとkmeansの評価関数と同じになってしまう。参考:http://www.cs.osakafu-u.ac.jp/hi/honda/mathematics.htm

このため、fuzziness: mを導入して、例えばm=2として実行する。

Page 17: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

1. Data converter(tsvからsequenceFileを生成)をMahoutに追加○ @hamadakoichiさんに感謝○ http://d.hatena.ne.jp/hamadakoichi/20110112/p1

2. クラスタリング対象データ(tsv)をHDFS上にアップ3.  sequenceFile生成4.  初期中心生成

○ Random○ Canopy

5. Fuzzy kmeans実行6.  クラスタリング結果確認

Mahout versionmahout-distribution-0.527 May 2011 - Apache Mahout 0.5 releasedmaven, Hadoop, Mahoutがインストール済みであることを前提とする

Page 18: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

1. Data converter(tsvからsequenceFileを生成)をMahoutに追加○ @hamadakoichiさんに感謝○ http://d.hatena.ne.jp/hamadakoichi/20110112/p1

2. クラスタリング対象データ(tsv)をHDFS上にアップ3.  sequenceFile生成4.  初期中心生成

○ Random○ Canopy

5. Fuzzy kmeans実行6.  クラスタリング結果確認

Mahout versionmahout-distribution-0.527 May 2011 - Apache Mahout 0.5 releasedmaven, Hadoop, Mahoutがインストール済みであることを前提とする

Page 19: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

Data converter(tsvからsequenceFileを生成)をMahoutに追加http://d.hatena.ne.jp/hamadakoichi/20110112/p1

1. javaファイル配置● $MAHOUT_HOME/examples/src/main/java/org/apache/mah

out/text● 元々org.apache.mahout.clustering.toolsだったが、都合上org.

apache.mahout.textに変更2. javaファイルのpackage記述を"org.apache.mahout.text"に変更3.  インストール

● $ cd $MAHOUT_HOME/examples/● $ mvn install

Page 20: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

1. Data converter(tsvからsequenceFileを生成)をMahoutに追加○ @hamadakoichiさんに感謝○ http://d.hatena.ne.jp/hamadakoichi/20110112/p1

2. クラスタリング対象データ(tsv)をHDFS上にアップ3. sequenceFile生成4.  初期中心生成

○ Random○ Canopy

5. Fuzzy kmeans実行6.  クラスタリング結果確認 Mahout version

mahout-distribution-0.527 May 2011 - Apache Mahout 0.5 releasedmaven, Hadoop, Mahoutがインストール済みであることを前提とする

Page 21: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

クラスタリング対象データ(tsv)をHDFS上にアップ

1. Rのデータセット「iris」からiris.tsvを作成2. 数値データのみになるようにSpeciesカラム削除

○ Sepal.Length, Sepal.Width, Petal.Length, Petal.Width3. HDFS上にアップ

○ $HADOOP_HOME/bin/hadoop dfs -put iris.tsv testdata

Page 22: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

1. Data converter(tsvからsequenceFileを生成)をMahoutに追加○ @hamadakoichiさんに感謝○ http://d.hatena.ne.jp/hamadakoichi/20110112/p1

2. クラスタリング対象データ(tsv)をHDFS上にアップ3. sequenceFile生成4. 初期中心生成

○ Random○ Canopy

5. Fuzzy kmeans実行6.  クラスタリング結果確認 Mahout version

mahout-distribution-0.527 May 2011 - Apache Mahout 0.5 releasedmaven, Hadoop, Mahoutがインストール済みであることを前提とする

Page 23: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

sequenceFile生成&初期中心生成

1. sequenceFile生成○ $MAHOUT_HOME/bin/mahout org.apache.mahout.text.

TextToVectorConverter -i testdata -o testdata_seq2. 初期中心生成

○ Canopy使用○ Randomに選択したい場合はFuzzy kmeans実行時に-kでク

ラスタ数を指定○ $MAHOUT_HOME/bin/mahout canopy -i testdata_seq -o

clusters_fcm -dm org.apache.mahout.common.distance.EuclideanDistanceMeasure -xm mapreduce -t1 20 -t2 1

○ 必要な数の中心を得るためにt1,t2を調整

Page 24: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

1. Data converter(tsvからsequenceFileを生成)をMahoutに追加○ @hamadakoichiさんに感謝○ http://d.hatena.ne.jp/hamadakoichi/20110112/p1

2. クラスタリング対象データ(tsv)をHDFS上にアップ3.  sequenceFile生成4.  初期中心生成

○ Random○ Canopy

5. Fuzzy kmeans実行6. クラスタリング結果確認 Mahout version

mahout-distribution-0.527 May 2011 - Apache Mahout 0.5 releasedmaven, Hadoop, Mahoutがインストール済みであることを前提とする

Page 25: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

Fuzzy kmeans実行&クラスタリング結果確認

1. Fuzzy kmeans実行○ $MAHOUT_HOME/bin/mahout fkmeans -i testdata_seq -

c clusters_fcm/clusters-0 -x 10 -o output_fcm -m 2 -cl -dm org.apache.mahout.common.distance.EuclideanDistanceMeasure

2. クラスタリング結果確認○ output_fcmにあるsequenceFileはバイナリであるため、テキ

ストに変換○ $MAHOUT_HOME/bin/mahout clusterdump --seqFileDir

output_fcm/clusters-1 --pointsDir output_fcm/clusteredPoints/ --output $HOME/clusteranalyze-0.txt

Page 26: Introduction to fuzzy kmeans on mahout

Mahout上でのFuzzy kmeans実行

クラスタリング結果

SC-0{n=46 c=[3.025, 3.668, 1.146] r=[0.426, 1.585, 0.673]} Weight: Point: 0.9971797368342612: 5.1 = [3.500, 1.400, 0.200] 0.9879369220797811: 4.9 = [3.000, 1.400, 0.200] 0.993180497187098: 4.7 = [3.200, 1.300, 0.200]...SC-1{n=34 c=[3.083, 4.097, 1.365] r=[0.415, 1.884, 0.826]} Weight: Point: 0.9773007230993884: 7.0 = [3.200, 4.700, 1.400] 0.9661792609907912: 6.4 = [3.200, 4.500, 1.500] 0.9930659179177667: 6.9 = [3.100, 4.900, 1.500]...

Page 27: Introduction to fuzzy kmeans on mahout

Fuzzy kmeans実行パラメータ$MAHOUT_HOME/bin/mahout fkmeans-i 入力データディレクトリ

● 文字列で指定● データ型:sequenceFile

-c 初期中心データディレクトリ● 文字列で指定● データ型:sequenceFile

-o 出力データディレクトリ● 文字列で指定● すでに存在すると動作しない。-owを指定すると上書きする。

- dm 距離定義- m fuzziness● 数値で指定。m > 1

-x 繰り返し最大回数● 数値で指定

-k 初期中心のランダムサンプリング数● 数値で指定● これを指定すると-cで指定したディレクトリは上書きされる● ただし、Mahout 0.5でこれを指定するとエラーになる。バグ?http://search-lucene.

com/m/CMBEC2UENp&subj=Bug+in+fkmeans+-cd 収束閾値

● 数値で指定● デフォルト値は0.5

-xm 処理方法を指定● 文字列で指定● sequential (running on memory) or mapreduce

-cl クラスタが確定した後にデータのクラスタリングを行う● 引数なし

Page 28: Introduction to fuzzy kmeans on mahout

Reference

● Mahout IN ACTION

● sequenceFile生成@hamadakoichihttp://d.hatena.ne.jp/hamadakoichi/20110112/p1

● fkmeans仕様https://cwiki.apache.org/MAHOUT/fuzzy-k-means.html

Page 29: Introduction to fuzzy kmeans on mahout

ご清聴ありがとうございました。