備忘録とか日常とかスマートフォン用の表示で見る備忘録とか日常とか学んだこととかを書きます。この広告は、90日以上更新していないブログに表示しています。教師なし学習の非階層的クラスタリング手法としてk-Meansが一般的であるが、その拡張であるk-Medoidsを実装した。SURFが使えないと知った。opencv-contrib-python==3.4.2.17これ以降のverでは以下のエラーが出て使用できない。オプション設定してビルドし直せば使えるらしい。'create'以下参考。Overflowpythonからopencvを使うときは大抵ビルド済みバイナリを取ってくるが、このページで履歴を追える。GitHub[追記終わり]-------------------------じゃあopencvでタダで使える特徴量はあるのか調べたところBRISKORBKAZEAKAZEあたりが候補らしい。KAZE以外はバイナリ特徴量ということで、何も考えずユークリッド距離によるk-meansに突っ込むと望まない結果になりそう。対策としては以下二つくらい。ユークリッド距離以外の基準を使用できるk-meansを実装するk-Medoidsを実装する距離の基準を変更したk-meansは探すといくつか実装が出てきたが、k-Medoidsを初めて聞いたのもあり、せっかくなので実装してみた。k-Medoidsの考え方の発展は以下のページがわかりやすかった。(実装もかなり参考にした)www.dskomei.com簡単にいうと、k-meansではサンプルの重心をクラスタ中心とするのに対し、k-Medoidsではサンプル自身をクラスタ中心とする。k-Medoidsではクラスタ中心をcentroidではなくmedoidと呼ぶ。繰り返すというのがざっくりした流れ。外れ値に強い重心を定義する必要がないということが挙げられる。二つ目は、k-meansでは距離尺度に応じて逐一重心(平均)を定めてやる必要があるが、k-Medoidsではその必要がなくなる。N)のループで済むのに対し、距離の総和が最小となるmedoidを選ぼうとすると二乗オーダの計算量となる。kが大きくなると使えない。初期値に関してはk-meansも同じ問題を抱えており、最初に選択されたクラスタセンタが近い距離にあるとうまくいかない。これの対策として、初期値のクラスタ中心がなるべく固まらないように選択するk-means++という方法が広く使われている。(詳細は上記サイトを参考に)scikit-learnのk-meansはこれに加え、初期値を複数計算してその中でもっともクラスタ中心の偏りがない(=クラスタ中心とサンプルの距離の総和が最小となる)初期値を選択する、という処理が行われている。小さいデータで何回か試して見たところ、この「最も良さげな初期値を選択する」という操作でクラスタリング結果がかなり向上することがわかった。大規模な実データではどうなるか不明だが、k-means++に加えて実用上では必須テクな気がする。そんなわけで、k-means++の初期化と初期値選択も実装した。初期値選択は並列演算で実施できるようにしたが、言うまでもなくメモリをバカ喰いするので実際に使う際はn_jobs=1にするしかない。自分で何回か試したところ、k-means++でも初期値選択を行わなければ良い結果にならないことが確認できた。確率分布にしたがって初期化しているため、一回の初期化だけでは十分に良い結果が得られない。BOW用ラッパーも書いたので、そちら方面で検証したいところである。中古車を対象としたなんちゃってデータ分析をしてみた。読んでいく...前回に引き続いて、機械学習の本を読んでいく。読んでいく...機械学習に関する色んな書籍が世の中には出回っている。(1)はてなブログをはじめよう!may46onezさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。