LoginSignup
0
2

More than 3 years have passed since last update.

教師なし学習2 非階層的クラスタリング

Last updated at Posted at 2020-10-28

Aidemy 2020/10/29

はじめに

 こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、教師なし学習の2つ目の投稿になります。どうぞよろしくお願いします。

*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・クラスタリングの種類
・k-means法
・DBSCAN法

クラスタリング

階層的クラスタリング

階層的クラスタリングとは、データの中から最も似ている(近い)データをクラスター化していく手法である。
・例えば、a=1,b=2,c=10,d=15,e=100のデータがあったとすると
「(a,b),c,d,e」=>「(a,b),(c,d),e」=>「((a,b),(c,d)),e」=>「(((a,b),(c,d)),e)」
のようにクラスター化し、最終的に全データがまとめられたら終了となる。
・この時、まとまりごとに階層を形成するので、階層的クラスタリングという。

非階層的クラスタリング

・非階層的クラスタリングも、階層的クラスタリングと同様、最も似ている(近い)データをクラスター化していく手法であるが、階層構造を作らない。
・非階層的クラスタリングでは、人が幾つクラスターを作るかを決め、それに従ってクラスターが生成される。
・非階層的クラスタリングは、階層的クラスタリングよりも計算量が少なくて済むので、データ量が多い時に有効である

クラスタリングに使うデータの構造

make_blobs()を使うことで、クラスター数などを指定してデータを生成できる。
・変数のうち、Xにはデータの点(x,y)が、Yにはクラスターのラベルが入る。
・各引数について
n_samples:データの総数
n_features:特徴量(次元数)
centers:クラスター数
cluster_std:クラスター内の標準偏差
shuffle:データをランダムに並べ替えるかどうか
random_state:seed設定

スクリーンショット 2020-10-28 23.10.58.png

k-means法

k-means法は非階層的クラスタリングの一つである。クラスタリングの仕方としては、分散の等しいクラスターに分けることで行われる。
・分け方は、SSEと呼ばれる指標を使う。SSEとは、クラスターごとの重心(セントロイド)とデータ点との差の二乗和(=分散)のことである。(詳細は後述)
・そして、この分散(SSE)が最小となるような重心(セントロイド)を学習、選択する。

・k_means法の具体的な流れは以下のようになる。
 ①データの中からk個のデータを抽出し、それらを初期のセントロイドとする。
 ②全てのデータ点を、最も近いセントロイドに割りふる。
 ③各セントロイドに集まったデータ群の重心を計算し、その重心を新しいセントロイドとしてセットする。
 ④元のセントロイドと新しいセントロイドの距離を計算し、近づくまで②③を反復する。
 ⑤距離が十分近づいたら終了。

k-means法の実行

・k-means法を実行するには、KMeans()を使う。引数は以下を参照。
n_clusters:クラスターの個数(make_blobの「centers」に合わせる)
init:初期セントロイドの設定方法("random"でランダムにセットされる)
n_init:上記①を何回行うか
max_iter:上記②③の反復の最大回数
tol:「収束」しているとみなす許容度
random_state:初期seed

・コード
スクリーンショット 2020-10-28 23.11.23.png

・結果スクリーンショット 2020-10-28 23.12.28.png

SSEについて

・SSEは「クラスターごとの重心(セントロイド)とデータ点との差の二乗和(=分散)のことである」と説明したが、この指標をクラスタリングの性能評価に使うこともできる。
・SSEからわかるのは「各データと重心がどれだけずれているか」であるため、値が小さいほどクラスターがまとまっている良いモデルと言える。

・SSEの値を表示させるには、
print("Distortion: %2f"% km.inertia_)
とすれば良い。(kmは前項で作ったKMeansインスタンス)

エルボー法

・k-means法ではクラスター数を自分で定める必要があるが、クラスター数決定の際に参考になる手法がある。これがエルボー法と呼ばれるものである。
・エルボー法は、「クラスター数を大きくして行った時のSSEの値」を図式化したものである。
・この図ではSSEの値が折れ曲がる点があり、この点を最適なクラスター数とみなして算出する。この折れ曲がり方が肘のようであることから、エルボー法と呼ばれる。

・コードスクリーンショット 2020-10-28 23.15.18.png

・結果スクリーンショット 2020-10-28 23.15.38.png

その他の非階層的クラスタリング

DBSCAN

・非階層的クラスタリングの一例としてk-means法を見てきたが、特徴としては、各クラスターの重心の周囲にデータが集まってくるので、クラスターは円形に近い形になる。そのため、クラスターの大きさや形に偏りがない時にはクラスタリングの精度が上がりやすいが、そうでないと良いクラスタリングにならない。

・このような時に使えるのが、DBSCANという方法である。
・DBSCANは、データが一定数以上集まっているところを中心とし、その周囲にあるデータとそれ以外のデータで切り分ける手法である。
・具体的には、「min_sample」「eps」という二つの指標を使って行う。手順は以下のとおり。
 ①データの半径「eps」内にデータが「min_sample」個以上ある場合は、その点をコア点とみなす。
 ②コア点から、半径「eps」内にあるデータをボーダー点とみなす。
 ③コア点でもボーダー点でもない点はノイズ点とみなす。
 ④コア点の集まりをクラスターとみなし、ボーター点を最も近いクラスターに組み込んで終了。

・このように、DBSCANではデータを三種類に分けて分類することから、偏ったデータでも良いクラスタリングが行える。

・DBSCANを実行するにはDBSCAN()を使えば良い。(以下のmetric="euclidean"はユークリッド距離を使うという宣言)

スクリーンショット 2020-10-28 23.17.16.png

まとめ

・クラスタリングには、階層的クラスタリングと、非階層的クラスタリングがある。アルゴリズム上、非階層的クラスタリングは手動でクラスター数を設定する必要がある。
・非階層的クラスタリングの一つにはk-means法がある。k-means法では重心の設定を反復させることでクラスターを生成する。
・k-means法の性能指標にはSSEが使える。値が小さいほどクラスタリングがうまく行っていると言える。
・クラスター数とSSEの関係をプロットしたエルボー法によって、最適なクラスター数を算出できる。
・非階層的クラスタリングのもう一つの手法として、DBSCANがある。DBSCANはある範囲のデータ数を参考にしてクラスターを生成するので、偏ったデータでもクラスタリングがうまく行きやすい。

今回は以上です。最後まで読んでいただき、ありがとうございました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2