Skip to content

Commit 1709e82

Browse files
initial git import, more .cxx than necessary :TODO: cleanup
0 parents  commit 1709e82

File tree

71 files changed

+12519
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+12519
-0
lines changed

include/feats/clustering/gkmeans.hxx

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#ifndef FEATS_CLUSTERING_KMEANS_HXX
2+
#define FEATS_CLUSTERING_KMEANS_HXX
3+
4+
#include <iterator
5+
#include <algorithm>
6+
7+
#include "feats/segmentation/models.hxx"
8+
9+
/**
10+
This class template is primary used by CROEUC algorithms
11+
for efficiency reasons, data is not copied.
12+
Also for efficiency reasons, prototypes will be interlaced in next version for better memory transversal.
13+
14+
Prototypes are in a twofold structure
15+
1) prototypes values used for computing distance
16+
2) prototypes models used for aggregating values
17+
18+
I could use only one structure of models but initial case would be more complex and prototype value would be computed over and over again.
19+
20+
21+
22+
*/
23+
template <typename ValItPairsItPair>
24+
struct kmeans{
25+
typedef typename boost::tuples::element<0, ValItPairsItPair>::type it_iterator;
26+
typedef typename std::iterator_traits<it_iterator>::difference_type size_type;
27+
typedef typename std::iterator_traits<it_iterator>::value_type serie_iterators_pair;
28+
typedef typename boost::tuples::element<0, serie_iterators_pair>::type serie_iterator;
29+
typedef typename std::iterator_traits<serie_iterator>::value_type value_type;
30+
31+
typedef linear0_model<value_type> proto_model_type;
32+
typedef std::vector<value_type> proto_values;
33+
typedef std::vector<proto_model_type> proto_models; // they are not interlaced
34+
typedef std::vector<proto_models > proto_models_sequence; // they are not interlaced
35+
typedef typename proto_models_sequence::iterator proto_models_seq_iterator;
36+
37+
// first constructor only gives the number of prototypes
38+
// they will be chosen at random
39+
kmeans( const ValItPairsPair& vipp, size_type init):seriesBegin_(boost::get<0>(vipp)), seriesEnd_(boost::get<1>(vipp)), seriesLength_(std::distance(boost::get<0>(*seriesBegin_), boost::get<1>(*seriesBegin_))), protosVals(seriesLength_*init) {
40+
std::vector<it_iterator> protosIt(init);
41+
std::random_sample(seriesBegin_, seriesEnd_, protosIt.begin(), protosIt.end());
42+
init(boost::make_tuple(protosIt.begin(), protosIt.end()));
43+
}
44+
template<typename InitIt>
45+
kmeans( const ValItPairsPair& vipp, boost::tuple<InitIt,InitT> initP):seriesBegin_(boost::get<0>(vipp)), seriesEnd_(boost::get<1>(vipp)), seriesLength_(std::distance(boost::get<0>(*seriesBegin_), boost::get<1>(*seriesBegin_))), protosVals(seriesLength_*init) { init(initP); }
46+
47+
48+
49+
compute(){}
50+
private:
51+
// takes a pair of iterators over pairs of iterators
52+
// I will interlace
53+
template<typename InitItTuple>
54+
void init(const InitItTuple& initP){
55+
set_proto_values();
56+
// clear protoModels
57+
proto_model_type emptyModel;
58+
for(typename proto_models_sequence::iterator it(protoModels.begin()); it != protoModels.end(); ++it){
59+
for(typename proto_models::iterator innerIt(it->begin()); innerIt!=it->end();++innerIt)
60+
{ *innerIt=emptyModel;}
61+
}
62+
}
63+
64+
void set_proto_values(const InitItTuple& initP){
65+
typedef typename boost::tuples::element<0, InitItTuple>::type proto_it_iterator;
66+
// init protoValues must make a fonction of it, to call it later with a focntion iterator over models to update the values.
67+
size_type nbProtos(std::distance(boost::get<0>(initP),boost::get<1>(initP)));
68+
protos_vals_iterator protosValsIt(protosVals_.begin()), protoValsInitIt(protoVals_.begin());
69+
for(proto_it_iterator it(boost::get<0>(initP)); it != boost::get<1>(initP)
70+
; ++it, ++protoValsInitIt, protoValsIt=protoValsInitIt){
71+
for(serie_iterator sit(boost::get<0>(*it)); sit!= boost::get<1>(*sit); ++sit, protoValsIt+=nbProtos){
72+
*protoValsIt=*sit;
73+
}
74+
}
75+
}
76+
77+
proto_models_seq_iterator nearest( const serie_iterators_pair& serie)const{
78+
const size_type nbP(protoModels.size());
79+
std::vector<value_type> distances(nbP,0.);
80+
protos_vals_iterator protosValsIt(protosVals_.begin());
81+
for(serie_iterator it(boost::get<0>(serie)); it != boost::get<1>(serie); ++it){
82+
for(typename std::vector<value_type>::iterator distIt(distances.begin()); distIt!=distances.end(); ++distIt, ++protoValsIt)
83+
{ const value_type delta(*protoValsIt-*it); distIt+=delta*delta;}
84+
}
85+
return protoModels.begin()+(std::distance(distances.begin()
86+
,std::max_element(distances.begin(),distances.end())));
87+
}
88+
89+
void one_run(){
90+
for(it_iterator it(seriesBegin_); it!= seriesEnd_; ++it)
91+
{ updateProto(*it, nearest(*it));}
92+
for(
93+
94+
};
95+
96+
#endif

0 commit comments

Comments
 (0)