技術的な話題この記事は公開されてから1年以上経過しており、情報が古い可能性があります。いじることが増えてきたように感じています。しておけばいいっしょ、くらいだったのですが、もっと奥深い色々が出てきて、クラスタリングわからないマンになりつつあります。そんなわけで、階層型クラスタリングを調べて、やってみたのでまとめておきます。クラスタリングとはクラスタリングとはデータを良い具合にまとめるという、教師なし学習の典型例です。何かしらの特徴量に沿って、データの流れや雰囲気をアルゴリズム的に見抜き、その様子でデータをまとめることができます。非階層型クラスタリングと呼ばれています。具体的には以下のようなアルゴリズムでクラスタリングを行います。元に、ランダム(※)にクラスタの中心を決定する各要素から一番近いクラスタの位置を探し、それを各要素のクラスタとして設定する各クラスタの重心を計算し、その重心位置をクラスタの中心として設定する各要素から一番近いクラスタの位置を探し、それを各要素のクラスタとして設定する各クラスタの重心を計算し、その重心位置をクラスタの中心として設定する...これを重心の移動がしきい値を下回るまで、あるいは指定の回数を超えるまで実施する最終的に、各要素から一番近いクラスタの位置が、その要素のクラスタとして決定される(イメージ図@雑)※ランダムにするか、程よい位置にするか(k-means++)などの初期位置決定の方法があります後述する階層型との比較でも挙げますが、初期位置によってある程度クラスタの別れ方が分岐することも往々にして発生します。クラスタリング結果が毎回異なる可能性もあり、厳密な分類がほしい、なんとなく纏めるでは嫌、といった場合の要望をかなえることはできません。事前にクラスタ数を設定する必要があるため、それが難しいような状況では大きな力を発揮することが難しいです。いう、クラスタ数を自動で設定できるものもあります。呼ばれるベイズ情報量規準が、設定したしきい値を下回るまで実行していくようなものになっています。詳しいことはぼくもあまりわからないので、その話が上がっている論文を見ると幸せになれると思います。http://www.rd.dnc.ac.jp/~tunenori/xmeans.html機械学習について触れていると、似たような「クラス分類」といったワードを見かけたこともあるかと思います。こちらはクラスタリングとは異なり、教師あり学習で「あるデータがどのクラスに属しているかを当てる」という全く別の問題になります。リンゴは果物、キャベツは野菜、というような、明確に正解があるようなデータを分類していくときには、クラス分類になります。階層型クラスタリングとは階層型クラスタリングは以下のようなアルゴリズムで処理されます。すべての要素に固有のクラスタを設定するクラスタを2つ取り上げていき、最も距離が近いもの(※)をくっつけて、新しいクラスタを作成するこれを再帰的に実行し、最終的にクラスタが1つになるまで実施する※「距離」の定義は設計次第です。ユークリッド距離、コサイン距離、など様々な計算方法があります。※くっつけて出来上がったクラスタ間の距離計算は設計次第です。クラスタが含む要素をそれぞれ比較し、最も近いものを距離とする(最近隣法)クラスタが含む要素をそれぞれ比較し、最も遠いものを距離とする(最遠隣法)クラスタが含む要素をそれぞれ比較し、平均的な距離とする(平均法)クラスタが含む要素をそれぞれ比較し、それぞれの距離について分散を利用して程よい値を取る(ウォード法、よく使われているらしい)(イメージ図@雑)そうして出来上がったクラスタリング結果ですが、このままでは木構造のようになっており、データとして扱うにはどれがどういうクラスタに属しているのかを明確に決定しにくいです。実際にあるタスクで利用したときには、最大距離の7割を基準にして、クラスタを分割していました。状況によってはパラメータの調整する必要がありそうな予感がしています。(k-means)のそれぞれの使いどころ階層型が活用できそうなところは以下のようなところではないでしょうか?データセットのうち、それぞれの距離に何かしらの特徴がありそうどれくらいのクラスタに分けたらいいかわからない階層型の場合。クラスタ間の距離で並べ替えることも容易にできるはずなので、しきい値の設定が小さいせいでクラスタを分けすぎてしまっても、ある程度までは前後関係もそれっぽく追いついてきます。出来上がった後に、人力でカバーすることも可能なのではないかなあと思います(それってどうなの感はありますが...)あるいはクラスタ数がいくつになるか想定できないような場合にも、全てのデータを一度まとめあげるので、自動で出てきた結果の様子を見つつ、手動でクラスタ分けしていくことができると思います。個のクラスタができあがります。非常に有効なのではないでしょうか。それぞれのクラスタ間で相関がないことや、中途半端な位置のデータはどちらとも言えないような結果になることは注意がいるかもしれません。どんなデータを入れても、なんとなくまとめてくれるので、人力で確認したときも、「ああーこういう見方もあるのね、なるほど」という謎の納得感が得られやすいとも思います。階層型クラスタリングをやっていきます。キレイに分かれましたね。非常に特徴的ってことがわかります。似ている、なんてところですね。いうわけで、階層型クラスタリングの話でした。欲しいって言われたのでそれはまた。技術的な話題この記事は公開されてから1年以上経過しており、情報が古い可能性があります。ように振る舞ってくれるならそれはとっても素敵だなーと思ったので、試してみたの巻。かのように一行ずつ実行したり、結果をグラフィカルに表示したりが出来ます。見えるように整形している、というものです。インストールしてやります。それでは、順番に環境を準備していきましょう。Atomとくに言うことはないです。公式サイトからどうぞ。準備こちらも同様に公式サイトからどうぞ。あたりで良いと思います。用インストーラを選ぶとよいでしょう。ファイルをダウンロードして、それを使って登録する必要があります。内のパッケージ管理からインストールできます。検索すれば一発でしょう。試してみるこれ以上の準備は不要です。上で動いているようにも見えます。つに色分けしてみた結果です。ないので、それが動く環境なら動作するはずです。境界が見えることはありませんしどうなっているのでしょう。公式ドキュメントにかかれていることとほぼおなじなので、そちらを見ている場合はこっちは見なくても良いです。Hydrogenコードの実行デフォルトでは以下のようなキーバインドがされています。いう形を使うのが良さそうです。100実際に試してる様子はこんな感じ。左からコード実行、セル実行、全実行。カーネルの再起動これはコマンドパレットから。なんか挙動がおかしいぞ?って時によく使いますよね。別途実行する必要があります。出力エリアのトグルデフォルトでは、コードのすぐ下に出力されます。これはこれで便利ではあると思うのですが、コード量が増えてくるとうっとうしく感じることもあるかもしれません。出力エリアが準備されていて、それを開くことで、そちらに全て出るようになります。ありましたっけ...?あったら知らない私がごめんなさいなんですけど。この機能めっちゃすごくないですか、変数を変えていくとリアルタイムで出力結果を確認できるんですよ...、どうなってんねん...。クラス、関数のインスペクションライブラリだったり、自分で実装したクラスや関数について、説明を見ることが出来ます。公式ドキュメント片手にコードを書くことが多い私的には便利に使えそうです。コード補完ライブラリの中、変数の中に結局こういうメソッドってあったっけ?をドキュメントに見に行ったり私には非常に嬉しい機能です。注意点としては、すぐ補完が効くわけではなく、その変数やクラスがカーネル側に認識されていないといけません。一度そのコードを実行して、認識させる必要があります。カーネル側に認識させています。使えるよ、って話でした。それ自体は非常に便利ですが、普段使うエディタを勝手が異なったりすると、それはそれで使いにくいですよね。ショートカットキーだとか、テーマだとか...。算術平均を逐次計算したい。技術的な話題この記事は公開されてから1年以上経過しており、情報が古い可能性があります。Supportまとめこんにちは、ごみばこです。