OpenCV 4.5.3(日本語機械翻訳)
列挙型 | 関数
Clustering

列挙型

enum cv::KmeansFlags { cv::KMEANS_RANDOM_CENTERS = 0 , cv::KMEANS_PP_CENTERS = 2 , cv::KMEANS_USE_INITIAL_LABELS = 1 }
k-Means フラグ[【詳解】(英語]

関数

CV_EXPORTS_W double cv::kmeans (InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray())
クラスタの中心を見つけ,入力サンプルをそのクラスタの周りに集めます.[【詳解】(英語]
template<typename _Tp , class _EqPredicate >
int partition (const std::vector< _Tp > &_vec, std::vector< int > &labels, _EqPredicate predicate=_EqPredicate())
要素集合を同値クラスに分割します.[【詳解】(英語]

詳解

列挙型詳解

KmeansFlags

k-Means フラグ

列挙値
kmeans_random_centers

各試行において、ランダムな初期センターを選択します。

kmeans_pp_centers

ArthurとVassilvitskii[Arthur2007]によるkmeans++センター初期化を使用する。

kmeans_use_initial_labels

最初の(そしておそらく唯一の)試行では、初期センターから計算する代わりに、ユーザーが提供したラベルを使用する。2回目以降の試行では、ランダムまたはセミランダムな中心を使用します。KMEANS_*_CENTERS フラグの1つを使って,正確な方法を指定してください。

関数詳解

kmeans()

CV_EXPORTS_W double cv::kmeans ( InputArray data,
int K,
InputOutputArray bestLabels,
TermCriteria criteria,
int attempts,
int flags,
OutputArray centers = noArray()
)

クラスタの中心を見つけ,入力サンプルをそのクラスタの周りに集めます.

関数 kmeans は, cluster_count 個のクラスタの中心を見つけ,そのクラスタの周りに入力サンプルをグループ化する k-means アルゴリズムを実装しています.出力として$\texttt{bestLabels}_i$には,samples行列の行に格納されたサンプルの,0ベースのクラスタインデックスが含まれます.$i^{th}$行に格納されています.

覚え書き
  • (Python) K-means クラスタリングの例は、opencv_source_code/samples/python/kmeans.py にあります。
引数
data クラスタリングの対象となるデータ。float座標のN次元点の配列が必要です。この配列の例は,次のようになります.
  • Matpoints(count, 2, CV_32F);
  • Matpoints(count, 1, CV_32FC2);
  • Matpoints(1, count, CV_32FC2);
  • std::vector<cv::Point2f> points(sampleCount).
K セットを分割するクラスタの数.
bestLabels 各サンプルのクラスタインデックスを格納する,整数型の配列を入出力します.
criteria アルゴリズムの終了基準,つまり,最大反復回数および/または希望する精度を指定します.精度はcliteria.epsilonとして指定されます.ある反復において、各クラスタ・センターの移動量がcliteria.epsilonよりも小さくなると、アルゴリズムは停止します。
attempts 異なる初期ラベリングを使用してアルゴリズムを実行する回数を指定するフラグ。アルゴリズムは、最適なコンパクト性をもたらすラベルを返します(最後の関数パラメータを参照)。
flags 以下の値を取ることができるフラグです.cv::KmeansFlags
centers クラスタ・センターの出力行列,各クラスタ・センター毎に1行です.
戻り値
この関数は,各試行の後に次式で計算されるコンパクトネス指標を返します

\[\sum _i \| \texttt{samples} _i - \texttt{centers} _{ \texttt{labels} _i} \| ^2\]

として計算されます.最適(最小)な値が選ばれ,対応するラベルとコンパクトネス値が関数から返されます.基本的には,この関数のコア部分のみを利用し,試行回数を1に設定し,カスタムアルゴリズムを用いて毎回ラベルを初期化し,それを( flags =KMEANS_USE_INITIAL_LABELS) フラグで渡し,最適な(最もコンパクトな)クラスタリングを選択します.

partition()

template<typename _Tp , class _EqPredicate >
int partition ( const std::vector< _Tp > & _vec,
std::vector< int > & labels,
_EqPredicate predicate = _EqPredicate()
)

要素集合を同値クラスに分割します.

汎用関数 partition は,要素集合を$O(N^2)$アルゴリズムを実装しており,要素の集合を$N$で説明されているように,要素の集合を1つまたは複数の同値クラスに分割するアルゴリズムを実装しています.http://en.wikipedia.org/wiki/Disjoint-set_data_structure. この関数は,同値クラスの数を返します.

引数
_vec ベクトルとして格納されている要素のセット.
labels ラベルの出力ベクトル.vecと同じ数の要素を含みます.各ラベル labels[i]は,0ベースのクラスタインデックスです.vec[i].
predicate 同等性の述語(2つの引数のブール関数へのポインタ,あるいは, bool operator()(const _Tp& a, const _Tp& b) というメソッドを持つクラスのインスタンス).この述語は、要素が確実に同じクラスである場合には真を返し、同じクラスであるかもしれないし、そうでないかもしれない場合には偽を返します。