Upload
takaya-imai
View
12.976
Download
2
Tags:
Embed Size (px)
Citation preview
Introduction toFuzzy kmeans on Mahout
(Fuzzy c-means)
lawmn12th Jun. 2011
#TokyoWebmining
始めに
この知識は個人的なものであり会社とは関係ありません。
Agenda
1. 自己紹介2. Clustering overview3. kmeans on Mahout4. Fuzzy kmeans on Mahout5. Mahout上でのFuzzy kmeans実行6. Reference
自己紹介
● 名前○ lawmn
● 出身○ 新潟県
● 使用言語○ Python, C#
● 大学のときの専攻○ 素粒子物理学専攻、博士号取得(仕事とはなんの関係もあり
ません)● 趣味
○ 旅行■ 今のところ行ったことがあるところは20カ国■ 南米に行ってみたい
MahoutJP
● MahoutJPのお手伝い
Clustering overview
● Clustering○ 教師データなしでデータを分類
● Classification○ 教師データありでデータを分類
データの分類方法
Clustering overview
データの分類方法
● Clustering○ 教師データなしでデータを分類
● Classification○ 教師データありでデータを分類
@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9
Clustering overview
Clustering overview
@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9
Clustering overview
@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9
kmeans on Mahout
以下の評価関数を最小化するクラスタリング(n個のデータ点をk個のクラスタに分割する)
:データ点
:クラスタ中心
:ユークリッド距離
kmeans on Mahoutアルゴリズム
1. 全データから初期中心を選ぶ2. クラスタ中心と各データとの距離を求め、距離が最も近い中心のクラスタにデータ
を割り当てる3. クラスタ中心の変化が閾値以下だった場合は処理を終了する4. 各クラスタの中心を計算する5. 2の処理へ
@hamadakoichiMahout Canopy Clustering - #TokyoWebmining 9http://www.slideshare.net/hamadakoichi/mahout-canopy-clustering-tokyowebmining-9
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.
Fuzzy kmeans on Mahout
以下の評価関数を最小化するクラスタリング(n個のデータ点をk個のクラスタに分割する)
:データ点
:クラスタ中心
:ユークリッド距離
:fuzziness(m > 1)
:クラスタへの帰属度
Fuzzy kmeans on Mahoutアルゴリズム
1. 全データから初期中心を選ぶ2. 初期中心を固定して、クラスタへの帰属度を計算する3. 2で計算した帰属度を用いて, 各クラスタの中心を計算する4. 3で計算した中心を用いて,帰属度を計算する5. 3~4を繰り返し、クラスタ中心の変化が閾値以下であれば終了
最終的に上図のようになる
kmeans
Fuzzy kmeans
Fuzzy kmeans on Mahout
パッと見、評価関数を以下で定義してもfuzzy kmeansが実行できるように見える。
しかし、この場合に帰属度の条件を満たし最小化しようとするとkmeansの評価関数と同じになってしまう。参考:http://www.cs.osakafu-u.ac.jp/hi/honda/mathematics.htm
このため、fuzziness: mを導入して、例えばm=2として実行する。
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がインストール済みであることを前提とする
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がインストール済みであることを前提とする
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
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がインストール済みであることを前提とする
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
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がインストール済みであることを前提とする
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を調整
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がインストール済みであることを前提とする
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
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]...
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 クラスタが確定した後にデータのクラスタリングを行う● 引数なし
Reference
● Mahout IN ACTION
● sequenceFile生成@hamadakoichihttp://d.hatena.ne.jp/hamadakoichi/20110112/p1
● fkmeans仕様https://cwiki.apache.org/MAHOUT/fuzzy-k-means.html
ご清聴ありがとうございました。