Skip to content

Commit

Permalink
C++: Address lists by names instead of positions
Browse files Browse the repository at this point in the history
  Had to rename internal slots for internal consistency reason:
    - bst_sample_silhouette_matrix -> silhouette_matrix
    - bst_dissimilarity -> best_dissimilarity
    - bst_sample_dissimilarity_matrix -> dissimilarity_matrix

  This is also consistent with user level fields names.
  • Loading branch information
vspinu committed Oct 13, 2021
1 parent 39ce9bd commit a40c69d
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 24 deletions.
6 changes: 3 additions & 3 deletions R/clustering_functions.R
Original file line number Diff line number Diff line change
Expand Up @@ -1226,7 +1226,7 @@ Clara_Medoids = function(data, clusters, samples, sample_size, distance_metric =

if (clusters > 1) {

dsm = data.frame(medoids_mat$bst_sample_silhouette_matrix)
dsm = data.frame(medoids_mat$silhouette_matrix)

colnames(dsm) = c('clusters', 'neighbor_clusters', 'intra_clust_dissim', 'outer_clust_dissim', 'silhouette_widths', 'diameter', 'separation')

Expand All @@ -1245,12 +1245,12 @@ Clara_Medoids = function(data, clusters, samples, sample_size, distance_metric =
medoids = medoids_mat$medoids,
medoid_indices = as.vector(medoids_mat$medoid_indices) + 1,
sample_indices = as.vector(medoids_mat$sample_indices) + 1,
best_dissimilarity = medoids_mat$bst_dissimilarity,
best_dissimilarity = medoids_mat$best_dissimilarity,
clusters = as.vector(medoids_mat$clusters) + 1,
silhouette_matrix = dsm,
fuzzy_probs = medoids_mat$fuzzy_probs,
clustering_stats = cs,
dissimilarity_matrix = medoids_mat$bst_sample_dissimilarity_matrix,
dissimilarity_matrix = medoids_mat$dissimilarity_matrix,
distance_metric = distance_metric),
class = c("MedoidsCluster", "cluster medoids silhouette")))
}
Expand Down
49 changes: 28 additions & 21 deletions inst/include/ClusterRHeader.h
Original file line number Diff line number Diff line change
Expand Up @@ -818,9 +818,13 @@ namespace clustR {
fuzzy_mat.row(i) = norm_fuzzy(arma::conv_to< arma::rowvec >::from(lst_fuzzy_out.row(i)), eps);
}

return Rcpp::List::create(Rcpp::Named("clusters") = lst_out, Rcpp::Named("fuzzy_clusters") = fuzzy_mat, Rcpp::Named("centers") = centers_out, Rcpp::Named("total_SSE") = tmp_sse,

Rcpp::Named("best_initialization") = end_init, Rcpp::Named("WCSS_per_cluster") = bst_WCSS, Rcpp::Named("obs_per_cluster") = bst_obs);
return Rcpp::List::create(Rcpp::Named("clusters") = lst_out,
Rcpp::Named("fuzzy_clusters") = fuzzy_mat,
Rcpp::Named("centers") = centers_out,
Rcpp::Named("total_SSE") = tmp_sse,
Rcpp::Named("best_initialization") = end_init,
Rcpp::Named("WCSS_per_cluster") = bst_WCSS,
Rcpp::Named("obs_per_cluster") = bst_obs);
}

else {
Expand Down Expand Up @@ -2630,7 +2634,6 @@ namespace clustR {
//

Rcpp::List ClusterMedoids(arma::mat& data, int clusters, std::string method, double minkowski_p = 1.0, int threads = 1, bool verbose = false, bool swap_phase = false,

bool fuzzy = false, int seed = 1) {

#ifdef _OPENMP
Expand Down Expand Up @@ -2885,16 +2888,18 @@ namespace clustR {

double end_cost_vec_scalar = arma::accu(end_cost_vec);

return Rcpp::List::create(Rcpp::Named("medoids") = end_idxs, Rcpp::Named("cost") = end_cost_vec_scalar, Rcpp::Named("dissimilarity_matrix") = data,

Rcpp::Named("clusters") = end_indices_vec, Rcpp::Named("end_cost_vec") = end_cost_vec, Rcpp::Named("silhouette_matrix") = befout_silhouette_matrix,

Rcpp::Named("fuzzy_probs") = fuz_out, Rcpp::Named("clustering_stats") = befout_clustering_stats, Rcpp::Named("flag_dissim_mat") = flag_dissim_mat);
return Rcpp::List::create(Rcpp::Named("medoids") = end_idxs,
Rcpp::Named("cost") = end_cost_vec_scalar,
Rcpp::Named("dissimilarity_matrix") = data,
Rcpp::Named("clusters") = end_indices_vec,
Rcpp::Named("end_cost_vec") = end_cost_vec,
Rcpp::Named("silhouette_matrix") = befout_silhouette_matrix,
Rcpp::Named("fuzzy_probs") = fuz_out,
Rcpp::Named("clustering_stats") = befout_clustering_stats,
Rcpp::Named("flag_dissim_mat") = flag_dissim_mat);
}




// calculate global dissimilarities for claraMedoids
// the function can handle missing values by using pair-wise deletion
//
Expand Down Expand Up @@ -3088,9 +3093,9 @@ namespace clustR {

Rcpp::List clM_sblist = ClusterMedoids(tmp_dat, clusters, method, minkowski_p, threads, false, swap_phase, false);

double local_dissim = Rcpp::as<double> (clM_sblist[1]);
double local_dissim = Rcpp::as<double> (clM_sblist["cost"]);

arma::uvec local_medoids = Rcpp::as<arma::uvec> (clM_sblist[0]);
arma::uvec local_medoids = Rcpp::as<arma::uvec> (clM_sblist["medoids"]);

arma::mat tmp_glob = dissim_MEDOIDS(data, method, copy_dat.rows(local_medoids), minkowski_p , threads, 1.0e-6); // use all data to calculate global dissimilarity

Expand Down Expand Up @@ -3150,13 +3155,15 @@ namespace clustR {

fuz_st_mat = fuz_st_mat.t();

return Rcpp::List::create(Rcpp::Named("medoids") = subs_meds, Rcpp::Named("bst_dissimilarity") = dism, Rcpp::Named("medoid_indices") = out_medoid,

Rcpp::Named("sample_indices") = clr_split_out_rowvec, Rcpp::Named("clusters") = hard_clust,

Rcpp::Named("bst_sample_silhouette_matrix") = bst_sample_silh_mat, Rcpp::Named("fuzzy_probs") = fuz_and_stats_mt,

Rcpp::Named("clustering_stats") = fuz_st_mat, Rcpp::Named("bst_sample_dissimilarity_matrix") = bst_sample_dissm_mat);
return Rcpp::List::create(Rcpp::Named("medoids") = subs_meds,
Rcpp::Named("best_dissimilarity") = dism,
Rcpp::Named("medoid_indices") = out_medoid,
Rcpp::Named("sample_indices") = clr_split_out_rowvec,
Rcpp::Named("clusters") = hard_clust,
Rcpp::Named("silhouette_matrix") = bst_sample_silh_mat,
Rcpp::Named("fuzzy_probs") = fuz_and_stats_mt,
Rcpp::Named("clustering_stats") = fuz_st_mat,
Rcpp::Named("dissimilarity_matrix") = bst_sample_dissm_mat);
}


Expand Down Expand Up @@ -3211,7 +3218,7 @@ namespace clustR {

Rcpp::List split_rcpp_lst(Rcpp::List lst) {

arma::mat silh_mat = Rcpp::as<arma::mat> (lst[5]);
arma::mat silh_mat = Rcpp::as<arma::mat> (lst["silhouette_matrix"]);

arma::vec tmp_clust = arma::conv_to< arma::vec >::from(silh_mat.col(0));

Expand Down

0 comments on commit a40c69d

Please sign in to comment.