Как использовать центры 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 столбцов? я что-то пропустил?!