集合知
プログラミング
#3 グループを見つけ出す
(前半)
2012.10.30 集合知プログラミング勉強会 #TokyoCI
@komiya_atsushi
https://github.com/komiya-atsushi/TokyoCI-study
Supervised
                        and
                    Unsupervised
                      learning
Photo by cybrarian77 http://www.flickr.com/photos/cybrarian77/6284181389/
教師あり学習
•「正解」が明らかになっている入力
 データをもとにモデルを構築する(学
 習)
•「正解」があるが、明らかになってい
 ないデータを入力として、「正解」を
 予測する
教師あり学習
•「正解」が明らかになっている入力
 データをもとにモデルを構築する(学
 習)
•「正解」があるが、明らかになってい
 ないデータを入力として、「正解」を
 予測する
   データを『分類』したり
    結果を『予測』する
教師なし学習
•「正解」が存在しない
•データをごにょごにょして「なにか」
 を見つける
教師なし学習
•「正解」が存在しない
•データをごにょごにょして「なにか」
 を見つける

   データ全体の『特徴』や
   『特性』を明らかにする
目的・問題に応じて使いわけよう
•「がく」の長さと幅、そして「花弁」
 の長さと幅から既知のアヤメの種類を
 判別してくれる高精度な分類器が欲し
 いなあ…
•うちの EC サイトで商品を買ってくれ
 る人たちって、どんな傾向の人が多い
 んだろう?
目的・問題に応じて使いわけよう
•「がく」の長さと幅、そして「花弁」
 の長さと幅から既知のアヤメの種類を
 判別してくれる高精度な分類器が欲し
 いなあ…
•うちの EC サイトで商品を買ってくれ
  教師あり学習向き
 る人たちって、どんな傾向の人が多い
 んだろう?
目的・問題に応じて使いわけよう
•「がく」の長さと幅、そして「花弁」
 の長さと幅から既知のアヤメの種類を
  教師なし学習向き
 判別してくれる高精度な分類器が欲し
 いなあ…
•うちの EC サイトで商品を買ってくれ
 る人たちって、どんな傾向の人が多い
 んだろう?
教師あり学習と教師なし学習の例
•教師あり
 •ニューラルネットワーク、決定木、サ
  ポートベクトルマシン、ベイジアンフィ
  ルタなど
•教師なし
 •クラスタリング、非負値行列因子分解、
  自己組織化マップなど
教師あり学習と教師なし学習の例
•教師あり
 •ニューラルネットワーク、決定木、サ
  ポートベクトルマシン、ベイジアンフィ
  ルタなど
•教師なし
 •クラスタリング、非負値行列因子分解、
  自己組織化マップなど
Clustering
Photo by tjuel http://www.flickr.com/photos/tjuel/5805997664/
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」



       色が同じ
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」
クラスタリング 概要
•「似たもの同士でグループにしてみま
 しょう」



       形が同じ
クラスタリングに必要な「もの」
•データをよく表現する「特徴」
 •【例】
  • 人:年齢、伸長、体重、性別…
•似ているかどうかを判断する/測る
 「ものさし」
 •「類似度」のこと
 •ピアソン相関係数、コサイン類似度、
  Jaccard 係数…
クラスタリングの手順
 どのように進めていくのか?

1. 個々のデータから「特徴ベクトル」
   を抽出する
2. ふたつの「特徴ベクトル」間の
   「距離・類似度」を計算する
3. 距離・類似度の近いものをまとめる
問題設定と準備

Photo by kakissel http://www.flickr.com/photos/kakissel/7182285229/
書籍中での問題設定(前半)
•「ブログサイト」を一つ一つのデータ
 と見立てる
•ブログ中で使われている単語の傾向で
 ブログをクラスタリングしてみる
 •ブログエントリ中に出てくる単語の
  「出現回数」からなる特徴ベクトルを
  用意する
準備
•feedparser を使って、100ほどのサイトの
 RSS フィードを取得する
•取得したフィードから単語を抽出し、かつ
 出現回数をカウントする
•ブログのサイト名とともに、出現回数を特
 徴ベクトルとしてファイル出力する
•ソースコード
 • http://goo.gl/Pn6aS (generatefeedvector.py)
Hierarchical
                     Clustering
Photo by pretendtious http://www.flickr.com/photos/27273053@N05/4646753786/
階層的クラスタリング
•そのときもっともよく似ているものを2つ
 くっつけましょう
 1. すべての2つの特徴ベクトルの組み合わせ
    について、
 2. 距離が最小となるものを選び、
 3. 一つの新たなグループとする
 4. 特徴ベクトルは二者の平均とする
 • 上記をグループがひとつになるまで繰り返す
階層的クラスタリング


           C   D


                   E
   A

       B


平面上の距離の近さを「類似度」とします
階層的クラスタリング


           C   D


                   E
   A

       B


平面上の距離の近さを「類似度」とします
階層的クラスタリング


           C   D


                   E
   A

       B


平面上の距離の近さを「類似度」とします
階層的クラスタリング


           C   D


                   E
   A

       B


平面上の距離の近さを「類似度」とします
階層的クラスタリング


           C   D


                   E
   A

       B


平面上の距離の近さを「類似度」とします
デンドログラム




   A       B   C       D   E




   A   B       C   D       E
階層的クラスタリングの実装
•距離関数を用意する
階層的クラスタリングの実装
•距離関数を用意する
階層的クラスタリングの実装
• 距離計算→最小距離の2つをマージ…を繰り返す
階層的クラスタリングの実装
 • 距離計算→最小距離の2つをマージ…を繰り返す



ソースコード
https://github.com/komiya-atsushi/TokyoCI-study/blob/master/chap.3/clusters.py
階層的クラスタリングのデモ




        demo
k-Means
Clustering
k-means(k平均法)
•クラスタの数 k を事前に決める
•最初にランダムに k 個の重心を配置する
1. データを最寄りの重心に割り当てる
2. 重心に割り当てられたデータの平均を、
   次の重心とする
•上記を重心が収束するか、一定回数繰り返
 したところで終了する
すばらしいオンラインデモが!




http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/
k-Means の実装




ソースコード
https://github.com/komiya-atsushi/TokyoCI-study/blob/master/chap.3/clusters.py
Thanks !
             &
       Any questions?
Photo by tjuel http://www.flickr.com/photos/tjuel/5805421265/
おまけ
Emacs で Python コードを書きたい方へ




https://github.com/komiya-atsushi/TokyoCI-study/blob/master/EmacsPythonEnvironment.md

第3回集合知プログラミング勉強会 #TokyoCI グループを見つけ出す