81 lines
2.7 KiB
C++
81 lines
2.7 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
|
|
*
|
|
* OriginalSpaceKmeans is a base class for other algorithms that operate in the
|
|
* same space as the data being clustered (as opposed to kernelized k-means
|
|
* algorithms, which operate in kernel space).
|
|
----
|
|
|
|
//paragraph [1] Title: [{\Large \bf \begin{center}] [\end{center}}]
|
|
//[TOC] [\tableofcontents]
|
|
|
|
[1] Declarations for the OriginalSpaceKmeans algorithm
|
|
|
|
|
|
1 Declarations for the OriginalSpaceKmeans algorithm
|
|
|
|
*/
|
|
|
|
#ifndef ORIGINAL_SPACE_KMEANS_H
|
|
#define ORIGINAL_SPACE_KMEANS_H
|
|
|
|
/* Authors: Greg Hamerly and Jonathan Drake
|
|
* Feedback: hamerly@cs.baylor.edu
|
|
* See: http://cs.baylor.edu/~hamerly/software/kmeans.php
|
|
* Copyright 2014
|
|
*
|
|
* OriginalSpaceKmeans is a base class for other algorithms that operate in the
|
|
* same space as the data being clustered (as opposed to kernelized k-means
|
|
* algorithms, which operate in kernel space).
|
|
|
|
*/
|
|
|
|
#include "kmeans.h"
|
|
|
|
/* Cluster with the cluster centers living in the original space (with the
|
|
* data). This is as opposed to a kernelized version of k-means, where the
|
|
* center points might not be explicitly represented. This is also an abstract
|
|
* class.
|
|
*/
|
|
class OriginalSpaceKmeans : public Kmeans {
|
|
public:
|
|
OriginalSpaceKmeans();
|
|
virtual ~OriginalSpaceKmeans() { free(); }
|
|
virtual void free();
|
|
virtual void initialize(Dataset const *aX, unsigned short aK,
|
|
unsigned short *initialAssignment, int aNumThreads);
|
|
|
|
virtual double pointPointInnerProduct(int x1ndx, int x2ndx) const;
|
|
virtual double pointCenterInnerProduct(int xndx,
|
|
unsigned short cndx) const;
|
|
virtual double centerCenterInnerProduct(unsigned short c1ndx,
|
|
unsigned short c2ndx) const;
|
|
|
|
protected:
|
|
// Move the centers to the average of their current assigned points,
|
|
// compute the distance moved by each center, and return the index of
|
|
// the furthest-moving center.
|
|
int move_centers();
|
|
|
|
virtual void changeAssignment(int xIndex, int closestCluster,
|
|
int threadId);
|
|
|
|
// The set of centers we are operating on.
|
|
Dataset *centers;
|
|
|
|
// sumNewCenters and centerCount provide sufficient statistics to
|
|
// quickly calculate the changing locations of the centers. Whenever a
|
|
// point changes cluster membership, we subtract (add) it from (to) the
|
|
// row in sumNewCenters associated with its old (new) cluster. We also
|
|
// decrement (increment) centerCount for the old (new) cluster.
|
|
Dataset **sumNewCenters;
|
|
|
|
};
|
|
|
|
#endif
|