@@ -275,6 +275,70 @@ extract_fit_summary.dbscan <- function(object, ...) {
275275 summary
276276}
277277
278+ # ' @export
279+ extract_fit_summary.hdbscan <- function (object , ... ) {
280+ clusts <- extract_cluster_assignment(object , ... )$ .cluster
281+ n_clust <- dplyr :: n_distinct(clusts )
282+ training_data <- attr(object , " training_data" )
283+
284+ overall_centroid <- colMeans(training_data )
285+
286+ by_clust <- training_data %> %
287+ tibble :: as_tibble() %> %
288+ dplyr :: mutate(
289+ .cluster = clusts
290+ ) %> %
291+ dplyr :: group_by(.cluster ) %> %
292+ tidyr :: nest()
293+
294+ centroids <- by_clust $ data %> %
295+ map(dplyr :: summarize_all , mean ) %> %
296+ dplyr :: bind_rows()
297+
298+ outlier_idx <- which(unique(clusts ) == " Outlier" )
299+
300+ sse_within_total_total <- map2_dbl(
301+ by_clust $ data ,
302+ seq_len(n_clust ),
303+ ~ sum(
304+ philentropy :: dist_many_many(
305+ as.matrix(centroids [.y , ]),
306+ as.matrix(.x ),
307+ method = " euclidean"
308+ )
309+ )
310+ )
311+
312+ clust_names <- unique(clusts )[c(outlier_idx , setdiff(1 : n_clust , outlier_idx ))]
313+ summary <- list (
314+ cluster_names = clust_names ,
315+ centroids = centroids ,
316+ n_members = unname(as.integer(table(clusts ))),
317+ sse_within_total_total = sse_within_total_total ,
318+ sse_total = sum(
319+ philentropy :: dist_many_many(
320+ t(overall_centroid ),
321+ as.matrix(training_data ),
322+ method = " euclidean"
323+ )
324+ ),
325+ orig_labels = NULL ,
326+ cluster_assignments = clusts
327+ )
328+
329+ if (length(outlier_idx ) > 0 ) {
330+ summary $ centroids [outlier_idx , ] <- rep(NA , ncol(summary $ centroids ))
331+ summary $ sse_within_total_total [outlier_idx ] <- NA
332+ }
333+
334+ # reorder centroids
335+ summary $ centroids <- summary $ centroids [
336+ c(outlier_idx , setdiff(1 : n_clust , outlier_idx )),
337+ ]
338+
339+ summary
340+ }
341+
278342# ' @export
279343extract_fit_summary.ms <- function (
280344 object ,
0 commit comments