Files
secondo/Algebras/ImageSimilarity/elkan_kernel_kmeans.h
2026-01-23 17:03:45 +08:00

79 lines
2.4 KiB
C++

/*
----
This file is NOT part of SECONDO.
* Authors: Greg Hamerly and Jonathan Drake
* Feedback: hamerly@cs.baylor.edu
* See: http://cs.baylor.edu/~hamerly/software/kmeans.php
* Copyright 2014
*
* A kernelized version of Elkan's algorithm. It would be nice to make this
* inherit from both KernelKmeans and ElkanKmeans, but for now we basically
* replicate code.
----
//paragraph [1] Title: [{\Large \bf \begin{center}] [\end{center}}]
//[TOC] [\tableofcontents]
[1] Declarations for the Eklan's' algorithm
1 Declarations for the Elkan's algorithm
*/
#ifndef ELKAN_KERNEL_KMEANS_H
#define ELKAN_KERNEL_KMEANS_H
/* Authors: Greg Hamerly and Jonathan Drake
* Feedback: hamerly@cs.baylor.edu
* See: http://cs.baylor.edu/~hamerly/software/kmeans.php
* Copyright 2014
*
* A kernelized version of Elkan's algorithm. It would be nice to make this
* inherit from both KernelKmeans and ElkanKmeans, but for now we basically
* replicate code.
*/
#include "kernel_kmeans.h"
class ElkanKernelKmeans : public KernelKmeans {
public:
ElkanKernelKmeans(Kernel const *k) : KernelKmeans(k),
centerCenterDistDiv2(NULL), s(NULL), upper(NULL), lower(NULL) {}
virtual ~ElkanKernelKmeans() { free(); }
virtual std::string getName() const {
std::ostringstream out;
out << "elkan_kernel(" << kernel.getName() << ")";
return out.str();
}
virtual void free();
virtual void initialize(Dataset const *aX, unsigned short aK,
unsigned short *initialAssignment, int aNumThreads);
protected:
int runThread(int threadId, int maxIterations);
void update_bounds(int startNdx, int endNdx);
void update_center_dists(int threadId);
void computeCenterMovement(int threadId);
// Matrix in an array of distance between each center, divided by 2.
double *centerCenterDistDiv2;
// Distance between center j and its closest other center, divided by 2.
double *s;
// Upper bound for each point.
double *upper;
// Matrix in an array of k lower bounds for each point.
double *lower;
// These are used to hold the new memberships and new squared center
// norms (Cc means <c,c>) from one iteration to the next.
std::vector<std::vector<unsigned int> > newMemberships;
std::vector<double> newCc;
};
#endif