opencv多维kmeans

时间:2016-04-18 12:26:26

标签: opencv k-means

我试图在n维数据上运行kmeans算法。

我有N分,每个分数都有{ x, y, z, ... , n }个功能。

我的代码如下:

cv::Mat points(N, n, CV_32F);

// fill the data points

cv::Mat labels; cv::Mat centers;

cv::kmeans(points, k, labels, cv::TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 0.001), 10, cv::KMEANS_PP_CENTERS, centers);

问题是kmeans算法遇到了分段错误。

感谢任何帮助

更新

Miki和Micka如何说上面的代码是正确的!

我在"填写数据点"所以我破坏了记忆

1 个答案:

答案 0 :(得分:1)

代码看起来不错。您必须选择每列1维的数据。

你能尝试运行这个例子吗?

// k-means
int main(int argc, char* argv[])
{

    cv::Mat projectedPointsImage = cv::Mat(512, 512, CV_8UC3, cv::Scalar::all(255));

    int nReferenceCluster = 10;
    int nSamplesPerCluster = 100;

    int N = nReferenceCluster*nSamplesPerCluster; // number of samples
    int n = 10; // dimensionality of data

    // fill the data points
    // create n artificial clusters and randomly seed 100 points around them

    cv::Mat referenceCenters(nReferenceCluster, n, CV_32FC1);

    //std::cout << referenceCenters << std::endl;
    cv::randu(referenceCenters, cv::Scalar::all(0), cv::Scalar::all(512));
    //std::cout << "FILLED:" << "\n" << referenceCenters << std::endl;

    cv::Mat points = cv::Mat::zeros(N, n, CV_32FC1);
    cv::randu(points, cv::Scalar::all(-20), cv::Scalar::all(20)); // seed points around the center

    for (int j = 0; j < nReferenceCluster; ++j)
    {
        cv::Scalar clusterColor = cv::Scalar(rand() % 255, rand() % 255, rand() % 255);
        //cv::Mat & clusterCenter = referenceCenters.row(j);
        for (int i = 0; i < nSamplesPerCluster; ++i)
        {
            // creating a sample randomly around the artificial cluster:
            int index = j*nSamplesPerCluster + i;
            //samplesRow += clusterCenter;
            for (int k = 0; k < points.cols; ++k)
            {
                points.at<float>(index, k) += referenceCenters.at<float>(j, k);
            }

            // projecting the 10 dimensional clusters to 2 dimensions:
            cv::circle(projectedPointsImage, cv::Point(points.at<float>(index, 0), points.at<float>(index, 1)), 2, clusterColor, -1);

        }
    }


    cv::Mat labels; cv::Mat centers;
    int k = 10; // searched clusters in k-means

    cv::kmeans(points, k, labels, cv::TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 1000, 0.001), 10, cv::KMEANS_PP_CENTERS, centers);

    for (int j = 0; j < centers.rows; ++j)
    {
        std::cout << centers.row(j) << std::endl;
        cv::circle(projectedPointsImage, cv::Point(centers.at<float>(j, 0), centers.at<float>(j, 1)), 30, cv::Scalar::all(0), 2);
    }

    cv::imshow("projected points", projectedPointsImage);
    cv::imwrite("C:/StackOverflow/Output/KMeans.png", projectedPointsImage);
    cv::waitKey(0);
    return 0;
}

我在那里围绕人工聚类中心创建10维数据。为了显示我将它们投影到2D,得到这个结果:

enter image description here