1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 23:33:05 +04:00

KMeans improvement

- fixed returned compactness value
- added centers drawing to the example app
- added compactness test
This commit is contained in:
Maksim Shabunin
2017-01-31 12:05:08 +03:00
parent 74defefd61
commit b417b4dbee
3 changed files with 68 additions and 28 deletions
+19 -12
View File
@@ -165,11 +165,13 @@ public:
KMeansDistanceComputer( double *_distances,
int *_labels,
const Mat& _data,
const Mat& _centers )
const Mat& _centers,
bool _onlyDistance = false )
: distances(_distances),
labels(_labels),
data(_data),
centers(_centers)
centers(_centers),
onlyDistance(_onlyDistance)
{
}
@@ -183,6 +185,12 @@ public:
for( int i = begin; i<end; ++i)
{
const float *sample = data.ptr<float>(i);
if (onlyDistance)
{
const float* center = centers.ptr<float>(labels[i]);
distances[i] = normL2Sqr(sample, center, dims);
continue;
}
int k_best = 0;
double min_dist = DBL_MAX;
@@ -210,6 +218,7 @@ private:
int *labels;
const Mat& data;
const Mat& centers;
bool onlyDistance;
};
}
@@ -259,6 +268,7 @@ double cv::kmeans( InputArray _data, int K,
Mat centers(K, dims, type), old_centers(K, dims, type), temp(1, dims, type);
std::vector<int> counters(K);
std::vector<Vec2f> _box(dims);
Mat dists(1, N, CV_64F);
Vec2f* box = &_box[0];
double best_compactness = DBL_MAX, compactness = 0;
RNG& rng = theRNG();
@@ -430,19 +440,16 @@ double cv::kmeans( InputArray _data, int K,
}
}
if( ++iter == MAX(criteria.maxCount, 2) || max_center_shift <= criteria.epsilon )
break;
bool isLastIter = (++iter == MAX(criteria.maxCount, 2) || max_center_shift <= criteria.epsilon);
// assign labels
Mat dists(1, N, CV_64F);
dists = 0;
double* dist = dists.ptr<double>(0);
parallel_for_(Range(0, N),
KMeansDistanceComputer(dist, labels, data, centers));
compactness = 0;
for( i = 0; i < N; i++ )
{
compactness += dist[i];
}
parallel_for_(Range(0, N), KMeansDistanceComputer(dist, labels, data, centers, isLastIter));
compactness = sum(dists)[0];
if (isLastIter)
break;
}
if( compactness < best_compactness )