23 using namespace shogun;
37 for (int32_t i=0; i<n; i++)
55 for (int32_t i=0; i<components.
vlen; i++)
67 for (int32_t i=0; i<components.
vlen; i++)
121 SG_ERROR(
"Specified features are not of type CDotFeatures\n");
131 SG_ERROR(
"No features to train on.\n");
141 init_k_means->
train(dotdata);
144 alpha=alpha_init(init_means);
164 while (iter<max_iter)
166 log_likelihood_prev=log_likelihood_cur;
167 log_likelihood_cur=0;
169 for (int32_t i=0; i<num_vectors; i++)
180 log_likelihood_cur+=logPx[i];
190 if (iter>0 && log_likelihood_cur-log_likelihood_prev<min_change)
203 return log_likelihood_cur;
209 SG_ERROR(
"No features to train on.\n");
212 SG_ERROR(
"Can't run SMEM with less than 3 component mixture model.\n");
231 while (iter<max_iter)
236 for (int32_t i=0; i<num_vectors; i++)
273 for (int32_t j=0; j<num_vectors; j++)
288 bool better_found=
false;
289 int32_t candidates_checked=0;
296 candidates_checked++;
299 candidate->partial_em(split_ind[i], merge_ind[j]/
m_components.vlen, merge_ind[j]%
m_components.vlen, min_cov, max_em_iter, min_change);
302 if (cand_likelihood>cur_likelihood)
304 cur_likelihood=cand_likelihood;
308 for (int32_t k=0; k<candidate->
get_comp().vlen; k++)
319 if (candidates_checked>=max_cand)
323 if (better_found || candidates_checked>=max_cand)
342 return cur_likelihood;
345 void CGMM::partial_em(int32_t comp1, int32_t comp2, int32_t comp3,
float64_t min_cov, int32_t max_em_iter,
float64_t min_change)
355 for (int32_t i=0; i<num_vectors; i++)
365 if (j!=comp1 && j!=comp2 && j!=comp3)
386 float64_t coef_sum=coefficients.vector[0]+coefficients.vector[1]+coefficients.vector[2];
388 int32_t dim_n=components.vector[0]->get_mean().vlen;
390 float64_t alpha1=coefficients.vector[1]/(coefficients.vector[1]+coefficients.vector[2]);
391 float64_t alpha2=coefficients.vector[2]/(coefficients.vector[1]+coefficients.vector[2]);
396 CMath::add(components.vector[1]->get_mean().vector, alpha1, components.vector[1]->get_mean().vector, alpha2,
397 components.vector[2]->get_mean().vector, dim_n);
399 for (int32_t i=0; i<dim_n; i++)
401 components.vector[2]->get_mean().vector[i]=components.vector[0]->get_mean().vector[i]+
CMath::randn_double()*noise_mag;
402 components.vector[0]->get_mean().vector[i]=components.vector[0]->get_mean().vector[i]+
CMath::randn_double()*noise_mag;
405 coefficients.vector[1]=coefficients.vector[1]+coefficients.vector[2];
406 coefficients.vector[2]=coefficients.vector[0]*0.5;
407 coefficients.vector[0]=coefficients.vector[0]*0.5;
409 if (components.vector[0]->get_cov_type()==
FULL)
416 components.vector[1]->set_u(c1);
421 for (int32_t i=0; i<dim_n; i++)
423 new_d+=
CMath::log(components.vector[0]->get_d().vector[i]);
424 for (int32_t j=0; j<dim_n; j++)
428 components.vector[0]->get_u().matrix[i*dim_n+j]=1;
429 components.vector[2]->get_u().matrix[i*dim_n+j]=1;
433 components.vector[0]->get_u().matrix[i*dim_n+j]=0;
434 components.vector[2]->get_u().matrix[i*dim_n+j]=0;
439 for (int32_t i=0; i<dim_n; i++)
441 components.vector[0]->get_d().vector[i]=new_d;
442 components.vector[2]->get_d().vector[i]=new_d;
445 else if(components.vector[0]->get_cov_type()==
DIAG)
447 CMath::add(components.vector[1]->get_d().vector, alpha1, components.vector[1]->get_d().vector,
448 alpha2, components.vector[2]->get_d().vector, dim_n);
451 for (int32_t i=0; i<dim_n; i++)
453 new_d+=
CMath::log(components.vector[0]->get_d().vector[i]);
456 for (int32_t i=0; i<dim_n; i++)
458 components.vector[0]->get_d().vector[i]=new_d;
459 components.vector[2]->get_d().vector[i]=new_d;
462 else if(components.vector[0]->get_cov_type()==
SPHERICAL)
464 components.vector[1]->get_d().vector[0]=alpha1*components.vector[1]->get_d().vector[0]+
465 alpha2*components.vector[2]->get_d().vector[0];
467 components.vector[2]->get_d().vector[0]=components.vector[0]->get_d().vector[0];
470 CGMM* partial_candidate=
new CGMM(components, coefficients);
481 while (iter<max_em_iter)
483 log_likelihood_prev=log_likelihood_cur;
484 log_likelihood_cur=0;
486 for (int32_t i=0; i<num_vectors; i++)
490 for (int32_t j=0; j<3; j++)
492 logPxy[i*3+j]=components.
vector[j]->compute_log_PDF(v)+
CMath::log(coefficients.vector[j]);
496 logPx[i]=
CMath::log(logPx[i]+init_logPx_fix[i]);
497 log_likelihood_cur+=logPx[i];
500 for (int32_t j=0; j<3; j++)
503 alpha.matrix[i*3+j]=
CMath::exp(logPxy[i*3+j]-logPx[i]+post_add[i]);
507 if (iter>0 && log_likelihood_cur-log_likelihood_prev<min_change)
521 delete partial_candidate;
522 alpha.destroy_matrix();
541 for (int32_t i=0; i<alpha.
num_cols; i++)
545 memset(mean_sum, 0, num_dim*
sizeof(
float64_t));
547 for (int32_t j=0; j<alpha.
num_rows; j++)
555 for (int32_t j=0; j<num_dim; j++)
556 mean_sum[j]/=alpha_sum;
565 memset(cov_sum, 0, num_dim*num_dim*
sizeof(
float64_t));
567 else if(cov_type==
DIAG)
570 memset(cov_sum, 0, num_dim*
sizeof(
float64_t));
578 for (int32_t j=0; j<alpha.
num_rows; j++)
587 1, (
double*) cov_sum, num_dim);
591 for (int32_t k=0; k<num_dim; k++)
598 for (int32_t k=0; k<num_dim; k++)
611 for (int32_t j=0; j<num_dim*num_dim; j++)
612 cov_sum[j]/=alpha_sum;
616 for (int32_t j=0; j<num_dim; j++)
624 for (int32_t j=0; j<num_dim; j++)
626 cov_sum[j]/=alpha_sum;
634 cov_sum[0]/=alpha_sum*num_dim;
643 alpha_sum_sum+=alpha_sum;
646 for (int32_t i=0; i<alpha.
num_cols; i++)
742 for (int32_t i=0; i<init_means.
num_cols; i++)
743 label_num.vector[i]=i;
752 for (int32_t i=0; i<num_vectors; i++)
768 if (cum_sum>=rand_num)
789 void CGMM::register_params()
bool has_property(EFeatureProperty p)
virtual float64_t get_likelihood_example(int32_t num_example)
virtual int32_t get_num_model_parameters()
SGVector< float64_t > m_coefficients
float64_t train_smem(int32_t max_iter=100, int32_t max_cand=5, float64_t min_cov=1e-9, int32_t max_em_iter=1000, float64_t min_change=1e-9)
virtual void set_features(CFeatures *f)
The class Labels models labels, i.e. class assignments of objects.
virtual void set_coef(SGVector< float64_t > coefficients)
virtual float64_t get_log_derivative(int32_t num_param, int32_t num_example)
static void add(T *target, T alpha, const T *v1, T beta, const T *v2, int32_t len)
target=alpha*vec1 + beta*vec2
virtual void destroy_matrix()
void max_likelihood(SGMatrix< float64_t > alpha, float64_t min_cov)
Gaussian distribution interface.
virtual int32_t get_num_vectors() const =0
virtual void set_nth_mean(SGVector< float64_t > mean, int32_t num)
static float64_t randn_double()
#define SG_NOTIMPLEMENTED
virtual SGVector< float64_t > get_coef()
Base class Distribution from which all methods implementing a distribution are derived.
virtual SGVector< float64_t > get_mean()
Features that support dot products among other operations.
virtual int32_t get_dim_feature_space() const =0
static T twonorm(T *x, int32_t len)
|| x ||_2
int32_t get_int_label(int32_t idx)
void add(bool *param, const char *name, const char *description="")
virtual void free_vector()
SGVector< float64_t > sample()
KMeans clustering, partitions the data into k (a-priori specified) clusters.
float64_t train_em(float64_t min_cov=1e-9, int32_t max_iter=1000, float64_t min_change=1e-9)
SGMatrix< float64_t > get_u()
virtual SGVector< float64_t > get_nth_mean(int32_t num)
virtual void set_comp(SGVector< CGaussian * > components)
virtual void destroy_vector()
static T max(T a, T b)
return the maximum of two integers
Class KNN, an implementation of the standard k-nearest neigbor classifier.
static double * compute_eigenvectors(double *matrix, int n, int m)
virtual SGVector< CGaussian * > get_comp()
virtual void set_nth_cov(SGMatrix< float64_t > cov, int32_t num)
SGVector< float64_t > cluster(SGVector< float64_t > point)
virtual float64_t get_log_likelihood_example(int32_t num_example)
virtual float64_t get_log_model_parameter(int32_t num_param)
The class Features is the base class of all feature objects.
virtual SGMatrix< float64_t > get_nth_cov(int32_t num)
static float64_t exp(float64_t x)
virtual bool train(CFeatures *data=NULL)
static float64_t log(float64_t v)
SGVector< float64_t > get_computed_dot_feature_vector(int32_t num)
SGVector< float64_t > get_d()
Class which collects generic mathematical functions.
SGVector< CGaussian * > m_components
static float32_t sqrt(float32_t x)
x^0.5
virtual bool train(CFeatures *data=NULL)
Gaussian Mixture Model interface.
#define SG_MALLOC(type, len)
virtual void free_matrix()
static void qsort_backward_index(T1 *output, T2 *index, int32_t size)
SGMatrix< float64_t > get_cluster_centers()