18 #ifndef PIC_UTIL_K_MEANS_HPP 19 #define PIC_UTIL_K_MEANS_HPP 25 #include "../base.hpp" 26 #include "../util/array.hpp" 27 #include "../util/math.hpp" 28 #include "../util/std_util.hpp" 37 T*
getMean(T *samples, T *out,
int nDim, std::set<uint> *cluster)
42 for (
auto it = cluster->begin(); it != cluster->end(); it++) {
60 for(
uint i = 1; i <
k; i++) {
61 T *center_i = ¢ers[i * nDim];
74 virtual T*
initCenters(T *samples,
int nSamples,
int nDim, T* centers)
77 centers =
new T[
k * nDim];
82 T *tMin =
new T[nDim];
83 T *tMax =
new T[nDim];
85 for(
int j = 0; j < nDim; j++) {
91 for(
int i = 1; i < nSamples; i++) {
93 for(
int j = 0; j < nDim; j++) {
94 T s = samples[index + j];
96 tMin[j] =
MIN(tMin[j], s);
97 tMax[j] =
MAX(tMax[j], s);
101 for(
uint i = 0; i <
k; i++) {
102 int index = i * nDim;
103 for(
int j = 0; j < nDim; j++) {
104 centers[index + j] = T(
getRandom(m()) * (tMax[j] - tMin[j]) + tMin[j]);
128 T*
Process(T *samples,
int nSamples,
int nDim,
130 std::vector< std::set<uint> *> &labels)
137 for(
uint i = 0; i <
k; i++) {
138 labels.push_back(
new std::set<uint>);
141 centers =
initCenters(samples, nSamples, nDim, centers);
143 for(
uint i = 0; i < nSamples; i++) {
144 T *sample_i = &samples[i * nDim];
147 labels[label]->insert(i);
150 T *mean =
new T[
k * nDim];
153 bool bNoChanges =
true;
155 for(
uint j = 0; j <
k; j++) {
157 int index = j * nDim;
158 std::set<uint> *tmp = labels.at(j);
159 getMean(samples, &mean[index], nDim, tmp);
173 printf(
"Max iterations: %d\n", i);
180 for(
uint j = 0; j <
k; j++) {
185 for(
uint j = 0; j < nSamples; j++) {
186 T *sample_j = &samples[j * nDim];
188 labels[label]->insert(j);
198 static T*
execute(T *samples,
int nSamples,
int nDim,
200 std::vector< std::set<uint> *> &labels,
206 return km.
Process(samples, nSamples, nDim, centers, labels);
209 static T*
select(T *samples,
int nSamples,
int nDim,
210 std::vector< std::set<uint> *> &labels,
212 float threshold = 1e-2f,
223 printf(
"k: %d\n",
k);
232 for(
uint i = 0; i < labels.size(); i++) {
233 T *center_i = ¢ers[i * nDim];
235 std::set<uint> * cluster = labels.at(i);
236 for (std::set<uint>::iterator it = cluster->begin(); it != cluster->end(); it++) {
244 float relErr = fabsf(
float(err - prevErr)) / float(prevErr);
247 printf(
"%f %f %f\n", err, prevErr, relErr);
250 if(relErr < threshold) {
265 #endif // PIC_UTIL_K_MEANS_HPP T * getMean(T *samples, T *out, int nDim, std::set< uint > *cluster)
Definition: k_means.hpp:37
unsigned int uint
Definition: base.hpp:23
uint k
Definition: k_means.hpp:114
static T * select(T *samples, int nSamples, int nDim, std::vector< std::set< uint > *> &labels, uint &k, float threshold=1e-2f, uint maxIter=100)
Definition: k_means.hpp:209
uint maxIter
Definition: k_means.hpp:114
uint assignLabel(T *sample_j, int nDim, T *centers)
Definition: k_means.hpp:55
static T * execute(T *samples, int nSamples, int nDim, T *centers, int k, std::vector< std::set< uint > *> &labels, uint maxIter=100)
Definition: k_means.hpp:198
T * Process(T *samples, int nSamples, int nDim, T *centers, std::vector< std::set< uint > *> &labels)
Definition: k_means.hpp:128
T * delete_vec_s(T *data)
delete_vec_s
Definition: std_util.hpp:138
Definition: k_means.hpp:33
KMeans(uint k, uint maxIter)
Definition: k_means.hpp:118
static T distanceSq(T *data0, T *data1, int n)
distanceSq
Definition: array.hpp:195
virtual T * initCenters(T *samples, int nSamples, int nDim, T *centers)
Definition: k_means.hpp:74
#define MIN(a, b)
Definition: math.hpp:69
static void div(T *data, int size, T value)
div
Definition: array.hpp:353
Definition: bilateral_separation.hpp:25
void setup(uint k, uint maxIter=100)
Definition: k_means.hpp:123
PIC_INLINE float getRandom(unsigned int n)
Random returns a number in [0, 2^32 - 1] to a float in [0, 1].
Definition: math.hpp:138
static T * assign(T *data, int size, T *ret)
assign
Definition: array.hpp:464
#define MAX(a, b)
Definition: math.hpp:73
static T * add(T *data, int size, T *ret)
add
Definition: array.hpp:334