kmeansのテストコード

#include <iostream>
#include <eigen3/Eigen/Core>
#include <opencv2/core/core.hpp>
#include <opencv2/flann/flann.hpp>

int main() {
	int point_num = 100;
	cv::Mat points = cv::Mat::zeros(point_num, 1, CV_32FC2);
	for(int i=0 ; i<point_num ; ++i) {
		Eigen::Vector2f pt = Eigen::Vector2f::Random();
		points.at<cv::Vec2f>(0, i)[0] = pt.coeff(0);
		points.at<cv::Vec2f>(0, i)[1] = pt.coeff(1);
	}

	int cluster_num = 10;
	cv::Mat_<int> clusters(points.size(), CV_32SC1);
	cv::Mat centers;
	cv::kmeans(points, cluster_num, clusters, cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER, 10, 1.0), 1, cv::KMEANS_PP_CENTERS, centers);
	std::cout << clusters >> std::endl;
	return 0;
}
OpenCVを用いたk-meansクラスタリングの実行例 (参考URL opencv 2.2 documentation) OpenCVのmatrix.cppにkmeansのコードがあるので, そこを書き換えれば距離尺度を変えられる.
      #include <opencv2/opencv.hpp>
      
      int main(int argc, char** argv){
        cv::Mat_<float> samples(cv::Size(10, 1000));
        cv::Mat_<float> centroids;
        cv::Mat_<int> labels;
        cv::TermCriteria cri(cv::TermCriteria::MAX_ITER+cv::TermCriteria::EPS, 50, FLT_EPSILON);
        int clusterNum = 50;
        double compactness;
        
        /* samplesにデータを格納 */

        /* k-means++を使用 */
        compactness = cv::kmeans(samples, clusterNum, labels, cri, 1, cv::KMEANS_PP_CENTERS, centroids);

        /* 自分でラベルを初期化してk-measを実行 */
        compactness = cv::kmeans(samples, clusterNum, labels, cri, 1, cv::KMEANS_USE_INITIAL_LABELS, centroids);

        return 0;
      }
    
4行:
10次元のデータを1000個用意 (1行が1データに対応).
5行:
クラスタ中心のデータを格納するインスタンス.
6行:
クラスタリングの結果 (各データのラベル)を格納するインスタンス (1000行1列のデータで, 各行の値が各データのラベルに対応).
7行:
アルゴリズムの停止条件で, ここでは最大50イテレーションで終了する.
8行:
生成するクラスタの数で, ここでは1000個のデータを50クラスタに分ける.
9行:
cv::kmeansの戻り値である"クラスタリング結果のコンパクトさ"を格納する変数.
タグ:
,

コメント(0)

コメントを投稿する