22 #ifndef CRNBASICCLASSIFY_HEADER
23 #define CRNBASICCLASSIFY_HEADER
63 typename ConstIterator,
64 typename std::enable_if<IsMetric<typename std::iterator_traits<ConstIterator>::value_type>::value,
int>::type = 0
69 auto mindist = std::numeric_limits<double>::max();
72 for (
auto it = begin; it != end; ++it)
101 typename std::enable_if<IsMetric<T>::value,
int>::type = 0
105 std::set<ClassifResult> knn;
106 std::set<ClassifResult>::iterator maxneighbor;
109 dataclass != database.
end(); ++dataclass)
111 String label = dataclass->first;
112 SVector samples = std::dynamic_pointer_cast<
Vector>(dataclass->second);
115 "kNearestNeighbors(const Object &obj, const Map &database, "
116 "int k): invalid database.");
117 for (Vector::const_iterator sample = samples->begin();
118 sample != samples->end(); ++sample)
120 auto d =
Distance(obj, dynamic_cast<const T&>(**sample));
121 if (knn.size() < (
unsigned int)k)
127 if (d < maxneighbor->distance)
130 knn.erase(std::max_element(knn.begin(), knn.end()));
133 maxneighbor = std::max_element(knn.begin(), knn.end());
137 return chooseClass(knn);
154 typename std::enable_if<IsMetric<T>::value,
int>::type = 0
158 std::set<ClassifResult> en;
161 dataclass != database.
end(); ++dataclass)
163 String label = dataclass->first;
164 SVector samples = std::dynamic_pointer_cast<
Vector>(dataclass->second);
167 "EpsilonNeighbors(const Object &obj, const Map &database, "
168 "double epsilon): invalid database.");
169 for (Vector::const_iterator sample = samples->begin();
170 sample != samples->end(); ++sample)
172 double d =
Distance(obj, dynamic_cast<const T&>(**sample));
180 return chooseClass(en);
193 static bool pairintintvalcmp(
const std::pair<int, int> &p1,
const std::pair<int, int> &p2)
195 return p1.second < p2.second;
201 class pairintintvaleq:
public std::unary_function<const std::pair<int, int> &, bool>
206 pairintintvaleq(
int v):val(v) {}
211 bool operator()(
const std::pair<int, int> &p)
213 return p.second == val;
226 static ClassifResult chooseClass(std::set<ClassifResult> &nn)
229 std::map<int, int> pop;
230 for (std::set<ClassifResult>::iterator it = nn.begin();
231 it != nn.end(); ++it)
233 pop[it->class_id] += 1;
236 int maxpop = std::max_element(pop.begin(), pop.end(),
237 pairintintvalcmp)->second;
240 std::map<int, int>::iterator popit = pop.begin();
241 pairintintvaleq sel(maxpop);
242 std::set<ClassifResult> sameclass;
243 while ((popit = std::find_if(popit, pop.end(), sel)) != pop.end())
246 ClassifResult::SelectId csel(popit->first);
247 std::set<ClassifResult>::iterator cit = nn.begin();
248 while ((cit = std::find_if(cit, nn.end(), csel)) != nn.end())
250 sameclass.insert(*cit);
255 return *std::min_element(sameclass.begin(), sameclass.end());
static ClassifResult EpsilonNeighbors(const T &obj, const Map &database, double epsilon)
Classify a sample using the k nearest neighbors.
static ClassifResult kNearestNeighbors(const T &obj, const Map &database, int k)
Classify a sample using the k nearest neighbors.
Basic classification tools.
A UTF32 character string class.
iterator begin()
Returns an iterator to the first element.
std::map< String, SObject >::const_iterator const_iterator
const_iterator on the contents of the container
A generic classification result.
double Distance(const Int &i1, const Int &i2) noexcept
static ClassifResult NearestNeighbor(const typename std::iterator_traits< ConstIterator >::value_type &obj, ConstIterator begin, ConstIterator end)
Finds the nearest neighbor in a set of objects.
iterator end()
Returns an iterator after the last element.
Invalid argument error (e.g.: nullptr pointer)