クラスタ中心を求め,入力サンプルを各クラスタにグループ分けします.
パラメタ: |
|
---|
関数 kmeans は, clusterCount 個のクラスタの中心を求め,入力サンプルを各クラスタに分類する k-means アルゴリズムの実装です.出力として, samples 行列の 行目のサンプルが属するクラスタの(0基準の)インデックスが, に格納されます.
この関数は,次のように計算されるコンパクト尺度を返します.
全試行の終了後,最もよい(小さい)値が選択され,それに対応するラベルとコンパクト尺度が戻り値として返されます. また,基本的に次のようにして,ユーザはこの関数の基本機能だけを利用することができます.まず,試行回数を1にセットし,フラグ( flags = KMEANS_USE_INITIAL_LABELS )をセットして,独自アルゴリズムによりラベルを毎回初期化します そして,最良の(最もコンパクトな)クラスタリングを選択します.
要素の集合を同値クラス(同値類)に分割します.
パラメタ: |
|
---|
汎用関数 partition は, 個の要素の集合を1つまたは複数の同値類に分割する のアルゴリズムの実装です.これについては http://en.wikipedia.org/wiki/Disjoint-set_data_structure で説明されています.また,この関数は,同値類の個数を返します.
このセクションでは,OpenCV の FLANN ライブラリインタフェースについて説明します.FLANN(Fast Library for Approximate Nearest Neighbors)は,K-近傍探索の高速な近似計算アルゴリズムの集合体で,巨大なデータセットと高次元特徴量に対して最適化されています.FLANN についてさらに詳しく知りたい場合は, muja_flann_2009 を参照してください.
FLANN 最近傍インデックスクラス
namespace cvflann
{
class Index
{
public:
Index(const Mat& features, const IndexParams& params);
void knnSearch(const vector<float>& query,
vector<int>& indices,
vector<float>& dists,
int knn,
const SearchParams& params);
void knnSearch(const Mat& queries,
Mat& indices,
Mat& dists,
int knn,
const SearchParams& params);
int radiusSearch(const vector<float>& query,
vector<int>& indices,
vector<float>& dists,
float radius,
const SearchParams& params);
int radiusSearch(const Mat& query,
Mat& indices,
Mat& dists,
float radius,
const SearchParams& params);
void save(std::string filename);
int veclen() const;
int size() const;
};
}
与えられたデータセットの最近傍探索インデックスを作成します.
パラメタ: |
|
---|
選択できるパラメータの種類を以下に示します:
- LinearIndexParams この型のオブジェクトが渡されると,インデックスに対して,線形のブルートフォース探索が行われます.
struct LinearIndexParams : public IndexParams { };
- KDTreeIndexParams この型のオブジェクトが渡されると,ランダム kd-tree の集合でインデックスが表現され,これは並列に探索されます.
struct KDTreeIndexParams : public IndexParams { KDTreeIndexParams( int trees = 4 ); };
- trees 並列な kd-tree の個数.[1..16] の範囲が適切な値です
- KMeansIndexParams この型のオブジェクトが渡されると,階層型 k-means tree でインデックスが表現されます.
struct KMeansIndexParams : public IndexParams { KMeansIndexParams( int branching = 32, int iterations = 11, flann_centers_init_t centers_init = CENTERS_RANDOM, float cb_index = 0.2 ); };
- branching 階層型 k-means tree で利用される branching ファクタ
- iterations k-means tree を作成する際の,k-means クラスタリングステージでの反復数の上限.ここで -1 は,k-means クラスタリングが収束するまで続けられることを意味します
- centers_init k-means クラスタリングの初期中心を選択するアルゴリズム.CENTERS _ RANDOM(ランダムに初期クラスタ中心を選択), CENTERS _ GONZALES(Gonzalesのアルゴリズムを用いて初期クラスタ中心を選択), CENTERS _ KMEANSPP( arthur_kmeanspp_2007 で提案されたアルゴリズムを用いて初期クラスタ中心を選択)のいずれかです
- cb_index このパラメータ(クラスタ境界インデックス)は,階層的 k-means tree の探索方法に影響を与えます. cb_index が0の場合,最も近い中心のクラスタが,次に探索される k-means 領域になります.0より大きい値の場合も,領域サイズが考慮されます
- CompositeIndexParams この型のパラメータオブジェクトを利用すると,ランダム kd-tree と 階層的 k-means tree の組み合わせでインデックスが表現されます.
struct CompositeIndexParams : public IndexParams { CompositeIndexParams( int trees = 4, int branching = 32, int iterations = 11, flann_centers_init_t centers_init = CENTERS_RANDOM, float cb_index = 0.2 ); };
- AutotunedIndexParams この型のオブジェクトが渡されると,与えられたデータ集合に対して最適なインデックスの種類(ランダム kd-tree,階層的 k-means tree,線形)とパラメータが選択され,最も効率的になるように自動で調整されたインデックスが作成されます.
struct AutotunedIndexParams : public IndexParams { AutotunedIndexParams( float target_precision = 0.9, float build_weight = 0.01, float memory_weight = 0, float sample_fraction = 0.1 ); };
- target_precision どれだけ厳密な最近傍を返すかという,最近傍探索の近似の割合を指定する 0から1の間の値.このパラメータが大きくなると,より正確な結果が得られますが,探索時間が長くなります.最適な値は,アプリケーションに依存します
- build_weight 最近傍探索時間に対するインデックスの構築時間の重要度を指定します.その後のインデックス探索時間が高速になるならば,インデックスの構築時間が長くても良いというアプリケーションが存在する一方で,インデックスの探索時間が多少長くなっても,できるだけ高速にインデックスを構築する必要があるアプリケーションもあります
- memory_weight これは,(インデックスの構築時間と探索時間)とインデックスの占有メモリとの,トレードオフを指定するのに利用されます.1より小さい値は消費時間を重要視し,1より大きい値はメモリ使用量を重要視します
- sample_fraction パラメータの自動設定アルゴリズムにおけるデータ集合の比率を示す,0から1の間の値.全データ集合を用いてアルゴリズムを実行すると,最も正確な結果が得られますが,巨大なデータ集合に対しては長い計算時間がかかります.このような場合,データをある比率分だけ使うことでアルゴリズムを高速化し,なおかつ,最適なパラメータの良い近似となる結果を得ることができます
- SavedIndexParams この型のオブジェクトは,ディスクにあらかじめ保存されたデータを読み出すために利用されます.
struct SavedIndexParams : public IndexParams { SavedIndexParams( std::string filename ); };
- filename インデックスが保存されたファイル名
インデックスを用いてクエリ点に対するk-近傍探索を行います.
パラメタ: |
|
---|
struct SearchParams {
SearchParams(int checks = 32);
};
- checks インデックスの tree が再帰的に横断されるべき回数.このパラメータが大きくなると,より正確な探索が行われますが,探索時間も長くなります.インデックス作成時に自動設定が利用されると,指定精度を達成するために必要な checks 数も計算されます.その場合,このパラメータは無視されます
与えられたクエリ点に対するradius 最近傍探索を行います.
パラメタ: |
|
---|
インデックスをファイルに保存します.
パラメタ: |
|
---|
階層的 k-means tree を構築し,クラスタの分散を最小にするカットを選択することで,与え得られた点群を分類します.
パラメタ: |
|
---|
このメソッドは,求められたクラスタ数を返します.