2015年12月12日土曜日

[C++]HKM勉強したい@そのいち


始まりました、「~したい」シリーズ。
今回はHKM階層的K平均法です。


話は変わるんですけど、ワタクシ大変なことに気づいてしまいました・・・。
「~したい」シリーズのタイトルの後ろについてる「@その~」っていうバックナンバー、


そのいち、そのにぐらいまでしか続かない(^p^)


バックナンバーつける意味あるのかってね。

BBCPマコトの紹介記事とかだと結構続いたんですけどね。

飽きっぽい性格の私は一つの物事に集中して取り組めないのですよ(^p^)

いっそバックナンバー制廃止にしようかな。





まあ、それはさておいて、今回のタイトル「HKM」についてです。

HKMとは本来ならクラスタ分析をする為に使われる手法です。

今回はこれを最近傍探索に使います。

最近傍探索にはいろいろな手法があるのですが、これはKDtreeに似ているかもしれません。

KDtreeという手法は簡単に言えば

  1. 空間を分割する。
  2. クエリが分割された空間のどこに属するか調べる。
  3. クエリが属する空間の中に最近傍がある。

という手法です。

それに対してHKMは

  1. データを2つのクラスタ(データの集合)に分ける。
  2. 分けられたクラスタの中のデータをさらに2つのクラスタに分ける。
  3. クラスタの中のデータが1つになるまで1.2.を繰り返す。
  4. クエリがどのクラスタに属するか調べる。
  5. クエリが属するクラスタがの中に最近傍がある。
という手法です。

詳しいことは 知 り ま せ ん 

詳しい人は私にご教授ください。

とりあえず今回HKMを使うために使ったアルゴリズムとその紹介。

KNN(k近傍法) 

クエリの近傍をk個求める手法。

アルゴリズム

  1. クエリとデータベース全点の距離を計算。
  2. 距離を昇順にソート。
  3. 上からk個をとる。

Kmeans(k平均法)

k個のクラスタを作る手法。

アルゴリズム
  1. 空のクラスタをk個作る。
  2. それぞれのクラスタにランダムにデータを割り当てる。
  3. クラスタに含まれるデータの座標の平均をクラスタの中心とする。
  4. 各データと各クラスタ中心の距離を計算し、各データを最近傍となる各クラスタに割り当てなおす。
  5. 割り当ての変化量が一定の閾値以内になるまで3.4.を繰り返す。

HKM(階層的k平均法)

階層的にk個のクラスタを作る手法。

アルゴリズム

  1. k個のクラスタを作る。
  2. クラスタの中でさらにk個のクラスタを作る。
  3. クラスタの中のデータが1個になるまで2.を繰り返す。


こんな感じです。

最初にKNNを作って、次にKNNを使ってKmeansを作って、次にKmeansを使ってHKMを作ります。

こういうの楽しいよね。

弱い武器を強化していって最強の武器を作るみたいな感じ。

テンションが上がりますね(^p^)

それでは以下ソース
量がやばい。
説明はきっといらないよね・・・?
アルゴリズムの紹介してるしね?

未来の俺はこう言う。
「コメント文ぐらい書けよ(#^p^)」

ってか、あれ、これ・・・

そのに、そのさんに分ければよかったんじゃね??

2015年12月9日水曜日

[C++]タブーサーチ作り直したい

なんかタブーサーチ改良することになったのでもう一度あげます。

~~変更点~~

・近傍生成方法を選べるようになったよ!
今のところ
・データを入れ替える
・bitを反転させる

の二つが選べます。

説明するのは面倒なので後日暇があったら画像付きで説明します。
まぢつかれたょ。。。

以下ソース
今回はナップサック問題(?)を解いてみました。だって友達がやれやれうるさいんだもん。
ちゃんと解けてるはず。たぶん。