8 #ifndef CENTER_CHOOSER_H_
9 #define CENTER_CHOOSER_H_
16 template <
typename Distance,
typename ElementType>
24 template <
typename ElementType>
31 template <
typename ElementType>
38 template <
typename ElementType>
46 template <
typename ElementType>
54 template <
typename ElementType>
62 template <
typename Distance>
65 typedef typename Distance::ElementType ElementType;
73 template <
typename Distance>
95 virtual void operator()(
int k,
int* indices,
int indices_length,
int* centers,
int& centers_length) = 0;
104 template <
typename Distance>
117 void operator()(
int k,
int* indices,
int indices_length,
int* centers,
int& centers_length)
122 for (index=0; index<k; ++index) {
123 bool duplicate =
true;
129 centers_length = index;
133 centers[index] = indices[rnd];
135 for (
int j=0; j<index; ++j) {
144 centers_length = index;
153 template <
typename Distance>
167 void operator()(
int k,
int* indices,
int indices_length,
int* centers,
int& centers_length)
169 int n = indices_length;
172 assert(rnd >=0 && rnd < n);
174 centers[0] = indices[rnd];
177 for (index=1; index<k; ++index) {
181 for (
int j=0; j<n; ++j) {
183 for (
int i=1; i<index; ++i) {
194 if (best_index!=-1) {
195 centers[index] = indices[best_index];
201 centers_length = index;
210 template <
typename Distance>
224 void operator()(
int k,
int* indices,
int indices_length,
int* centers,
int& centers_length)
226 int n = indices_length;
228 double currentPot = 0;
233 assert(index >=0 && index < n);
234 centers[0] = indices[index];
238 for (
int i = 0; i < n; i++) {
240 closestDistSq[i] = ensureSquareDistance<Distance>( closestDistSq[i] );
241 currentPot += closestDistSq[i];
245 const int numLocalTries = 1;
249 for (centerCount = 1; centerCount < k; centerCount++) {
252 double bestNewPot = -1;
253 int bestNewIndex = 0;
254 for (
int localTrial = 0; localTrial < numLocalTries; localTrial++) {
259 for (index = 0; index < n-1; index++) {
260 if (randVal <= closestDistSq[index])
break;
261 else randVal -= closestDistSq[index];
266 for (
int i = 0; i < n; i++) {
268 newPot +=
std::min( ensureSquareDistance<Distance>(
dist), closestDistSq[i] );
272 if ((bestNewPot < 0)||(newPot < bestNewPot)) {
274 bestNewIndex = index;
279 centers[centerCount] = indices[bestNewIndex];
280 currentPot = bestNewPot;
281 for (
int i = 0; i < n; i++) {
283 closestDistSq[i] =
std::min( ensureSquareDistance<Distance>(
dist), closestDistSq[i] );
287 centers_length = centerCount;
289 delete[] closestDistSq;
306 template <
typename Distance>
320 void operator()(
int k,
int* indices,
int indices_length,
int* centers,
int& centers_length)
322 const float kSpeedUpFactor = 1.3f;
324 int n = indices_length;
330 assert(index >=0 && index < n);
331 centers[0] = indices[index];
333 for (
int i = 0; i < n; i++) {
340 for (centerCount = 1; centerCount < k; centerCount++) {
343 double bestNewPot = -1;
344 int bestNewIndex = 0;
346 for (index = 0; index < n; index++) {
349 if( closestDistSq[index] > kSpeedUpFactor * (
float)furthest ) {
353 for (
int i = 0; i < n; i++) {
355 , closestDistSq[i] );
359 if ((bestNewPot < 0)||(newPot <= bestNewPot)) {
361 bestNewIndex = index;
362 furthest = closestDistSq[index];
368 centers[centerCount] = indices[bestNewIndex];
369 for (
int i = 0; i < n; i++) {
371 , closestDistSq[i] );
375 centers_length = centerCount;
377 delete[] closestDistSq;
double Distance(const Point3D< Real > &p1, const Point3D< Real > &p2)
virtual void operator()(int k, int *indices, int indices_length, int *centers, int ¢ers_length)=0
Distance::ElementType ElementType
const std::vector< ElementType * > & points_
void setDataSize(size_t cols)
Distance::ResultType DistanceType
CenterChooser(const Distance &distance, const std::vector< ElementType * > &points)
Distance::ResultType DistanceType
Distance::ElementType ElementType
GonzalesCenterChooser(const Distance &distance, const std::vector< ElementType * > &points)
void operator()(int k, int *indices, int indices_length, int *centers, int ¢ers_length)
Distance::ResultType DistanceType
Distance::ElementType ElementType
GroupWiseCenterChooser(const Distance &distance, const std::vector< ElementType * > &points)
void operator()(int k, int *indices, int indices_length, int *centers, int ¢ers_length)
Distance::ResultType DistanceType
Distance::ElementType ElementType
KMeansppCenterChooser(const Distance &distance, const std::vector< ElementType * > &points)
void operator()(int k, int *indices, int indices_length, int *centers, int ¢ers_length)
Distance::ElementType ElementType
Distance::ResultType DistanceType
RandomCenterChooser(const Distance &distance, const std::vector< ElementType * > &points)
void operator()(int k, int *indices, int indices_length, int *centers, int ¢ers_length)
static double dist(double x1, double y1, double x2, double y2)
Distance::ResultType ensureSquareDistance(typename Distance::ResultType dist)
double rand_double(double high=1.0, double low=0)
int rand_int(int high=RAND_MAX, int low=0)
Accumulator< T >::Type ResultType
Accumulator< T >::Type ResultType
Accumulator< T >::Type ResultType
Accumulator< T >::Type ResultType
Accumulator< T >::Type ResultType
ChiSquareDistance< ElementType >::ResultType ResultType
ResultType operator()(ResultType dist)
ResultType operator()(ResultType dist)
HellingerDistance< ElementType >::ResultType ResultType
L2< ElementType >::ResultType ResultType
ResultType operator()(ResultType dist)
L2_3D< ElementType >::ResultType ResultType
ResultType operator()(ResultType dist)
L2_Simple< ElementType >::ResultType ResultType
ResultType operator()(ResultType dist)
Distance::ResultType ResultType
ResultType operator()(ResultType dist)