1 #ifndef BRUTEFORCECLUSTERING_H
2 #define BRUTEFORCECLUSTERING_H
7 #include "../base/algorithm.h"
8 #include "../base/dissimilaritymeasure.h"
9 #include "../base/inputsetter.h"
10 #include "../base/measuresetter.h"
11 #include "../datastructure/proxysolution.h"
12 #include "../evaluation/kmeansevaluator.h"
14 #include "../exception/invalidruntimeconfigurationexception.h"
15 #include "../exception/invalidargumentexception.h"
39 virtual void setInput(std::vector<T*>
const*);
49 std::pair<std::vector<size_t>,
double>
bruteCompute(std::vector<size_t> centers);
52 std::unique_ptr<DissimilarityMeasure<T>>
measure;
59 measure(measure==0 ? 0 : measure->clone()),
61 numClusters(numOfCenters)
69 if(this->input->size() < numClusters)
71 if(this->measure == 0)
74 std::pair<std::vector<size_t>,
double> centersInd(bruteCompute(std::vector<size_t>()));
77 std::vector<T> centers;
78 centers.reserve(centersInd.first.size());
79 for(
size_t i = 0; i < centersInd.first.size(); ++i)
80 centers.push_back(*(*input)[centersInd.first[i]]);
88 if(centers.size() == numClusters)
90 std::vector<T*> centerPointers;
91 centerPointers.reserve(centers.size());
92 for(
size_t i = 0; i < centers.size(); ++i)
93 centerPointers.push_back((*input)[centers[i]]);
94 return std::pair<std::vector<size_t>,
double>(centers, eval.proxycost(*input, centerPointers));
98 std::pair<std::vector<size_t>,
double> min;
99 size_t lowerBound = centers.size()==0 ? 0 : centers[centers.size()-1] + 1;
100 size_t upperBound = input->size() - (numClusters-centers.size());
101 for(
size_t i = lowerBound; i <= upperBound; ++i)
103 std::vector<size_t> newCenters(centers);
104 newCenters.push_back(i);
105 std::pair<std::vector<size_t>,
double> tmp(bruteCompute(newCenters));
106 if(tmp.second < min.second || i == lowerBound)
115 this->numClusters = numOfClusters;
128 this->measure = std::unique_ptr<DissimilarityMeasure<T>>(measure->
clone());
std::pair< std::vector< size_t >, double > bruteCompute(std::vector< size_t > centers)
std::vector< std::vector< T > > proxysets
virtual ProxySolution< T > * compute()
void setNumberOfClusters(unsigned int number)
Sets the desired number of clusters.
std::unique_ptr< DissimilarityMeasure< T > > measure
Calculates the k-means weight.
virtual DissimilarityMeasure< T > * clone() const =0
Brute force k-median / k-means clustering.
Data structure for proxies.
virtual void setInput(std::vector< T * > const *)
Abstract base class for algorithms.
virtual void setMeasure(DissimilarityMeasure< T > const *measure)
Interface to propagate the ability to set a DissimilarityMeasure.
std::vector< T * > const * input
BruteForceClustering(DissimilarityMeasure< T > const *measure=0, std::vector< T * > const *input=0, unsigned int numOfCenters=1)
Abstract base class for dissimilarity measurement.
KMeansEvaluator< T > eval
Indicates that a computation entered an invalid configuration state.