HDBSCAN
Learn what HDBSCAN does, when to use it, and how to run HDBScan in JavaScript or TypeScript with @kanaries/ml for browser and Node.js applications.
View as MarkdownAlgorithm overview
HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) finds clusters of varying density and identifies noise points without forcing every observation into a cluster. Unlike DBSCAN, it does not depend on a single global eps radius: it builds a density hierarchy and extracts the most stable clusters from it, so a tight cluster and a sparse cluster can be recovered in the same run. Choose it when:
- Your clusters have significantly different densities (the classic DBSCAN failure mode).
- You do not know an exact cluster count in advance.
- Outlier/noise detection is important for your downstream workflow.
The HDBScan class in @kanaries/ml is a full implementation aligned with scikit-learn's sklearn.cluster.HDBSCAN:
- Core distances — the distance from each point to its
min_samples-th nearest neighbor (counting the point itself, as scikit-learn does). - Mutual reachability — pairwise distances
max(core_a, core_b, d(a, b)). - Minimum spanning tree — Prim's algorithm on the mutual reachability graph.
- Condensed tree and stability extraction — the single linkage hierarchy is condensed by
min_cluster_size, and flat clusters are selected with the Excess of Mass (EOM) stability criterion.
Interactive HDBSCAN playground
Change the minimum cluster size, neighborhood size, dataset, and noise level. This browser-side Clusters.HDBScan fit uses point opacity to show membership strength and gray to show observations left as noise.
Learn HDBSCAN by changing it
Change the minimum stable group and compare membership strength across clusters with uneven density. Click the chart to add a point and refit.
Clusters.HDBScanQuick start
HDBScan in Python vs JavaScript / TypeScript
If you searched for "HDBScan in JavaScript" or "HDBScan in TypeScript", this section maps the familiar scikit-learn call to the equivalent @kanaries/ml usage for browser and Node.js runtimes.
from sklearn.cluster import HDBSCAN
X = [[0, 0], [0.1, 0.2], [5, 5], [5.2, 5.1], [9, 0]]
model = HDBSCAN(min_cluster_size=2)
labels = model.fit_predict(X)import { Clusters } from '@kanaries/ml';
const X = [[0, 0], [0.1, 0.2], [5, 5], [5.2, 5.1], [9, 0]];
const model = new Clusters.HDBScan(2);
const labels = model.fitPredict(X);Quick JavaScript example
import { Clusters } from '@kanaries/ml';
const X = [[0, 0], [0.1, 0.2], [5, 5], [5.2, 5.1], [9, 0]];
const model = new Clusters.HDBScan(2);
const labels = model.fitPredict(X);
console.log(labels);Detailed API reference
constructor(
min_cluster_size: number = 5,
min_samples: number | null = null,
cluster_selection_epsilon: number = 0.0,
metric: Distance.IDistanceType = 'euclidean',
allow_single_cluster: boolean = false
)min_cluster_size— the smallest group of points that counts as a cluster. Splits producing a side smaller than this are treated as points falling out of the parent cluster. This is the main tuning knob.min_samples— controls how conservative the density estimate is (thekused for core distances, counting the point itself). Defaults tomin_cluster_size. Larger values declare more points noise.cluster_selection_epsilon— an extraction threshold (not a DBSCANeps): selected clusters born below this distance are merged upward until their parent's birth distance exceeds it. Leave at0.0(the default, matching scikit-learn) unless you want to prevent micro-clusters from splitting.metric— any distance supported by theDistancemodule.allow_single_cluster— whentrue, the hierarchy root may be selected, allowing the whole dataset to form one cluster.
fitPredict(samplesX: number[][]): number[] returns cluster labels. Noise points are marked as -1.
getLabels(): number[] returns the labels from the last fitPredict call.
getProbabilities(): number[] returns the cluster membership strength of each sample in [0, 1]; noise points have probability 0.
const hdb = new Clusters.HDBScan(8);
const labels = hdb.fitPredict(X);
const probabilities = hdb.getProbabilities();Implementation workflow
- Scale features so distance comparisons are meaningful.
- Fit the model and inspect cluster labels plus noise assignments.
- Tune
min_cluster_sizefirst; usemin_samplesto adjust how aggressively sparse points are declared noise.
JavaScript deployment notes
- Use this class when cluster count is unknown, densities vary across clusters, and you expect some observations to remain noise.
- The implementation builds a dense pairwise distance matrix (O(n²) memory and time), so it is suited to datasets up to a few thousand points. In browser workflows, run it off the main thread for larger inputs.
- Results match Python
sklearn.cluster.HDBSCANlabels on the same data and parameters.
DBScan
Discover density-based clusters and noise with the DBScan JavaScript and TypeScript implementation in @kanaries/ml for browser and Node.js applications.
Mean Shift
Learn what Mean Shift does, when to use it, and how to run MeanShift in JavaScript or TypeScript with @kanaries/ml for browser and Node.js applications.