Как использовать центры Kmean, для тестирования новых данных?

Это то, что я собираюсь сделать! (возможно, этот метод неправильный, скажите мне, если я ошибаюсь) У меня есть набор данных из 300 изображений, я извлекаю 36 объектов из каждого изображения и создаю матрицу объектов 300*36, затем я использую K-среднее кластеризация для кластеризации этих функций

kmeans(feature, ClusterNumber , lables,TermCriteria(CV_TERMCRIT_ITER&CV_TERMCRIT_EPS, 10000, 0.0001),10,KMEANS_PP_CENTERS ,centers);

Теперь у меня есть центр кластеров (который представляет собой ClusterNumber*36 Mat). Итак, я собираюсь сделать для новых изображений (невидимых данных), я вычисляю вектор объектов и нахожу расстояние между этим вектором и центрами моих кластеров., новое изображение принадлежит кластеру с минимальным расстоянием.

Я написал эту функцию для расчета расстояния:

 void calculateDistance( )
    {

        if (features.cols==centers.cols)
        {

            vector<float> resvec;
            for (int i=0;i<centers.rows;i++)
            {
                double res =  norm(features,centers.row(i), cv::NORM_L2SQR );
                resvec.push_back(res);

            }
            int minElementIndex = std::min_element(resvec.begin(),resvec.end()) - resvec.begin();
            cerr<<minElementIndex<<endl;

        }
        else
        {
            cerr<<"vector size mismatch!\n";
        }


    }

Удивительно, но для всех векторов объектов (даже данных о поездах) эта функция дает одинаковый результат! (minElementIndex всегда 2)
Я даже проверил свою теорию с некоторыми случайными точками (размер (500*2)), и она сработала как шарм, новые данные правильно распределены по кластерам. Так что же происходит, когда вектор объектов увеличивается до 36 столбцов? я что-то пропустил?!

0 ответов

Другие вопросы по тегам