如何更快地运行 hdbscan 集群?

数据挖掘 聚类 表现
2022-02-28 23:43:57

我正在使用 hdbscan 对来自 BERT 的嵌入输出进行聚类,该输出接收了超过 15 万条聊天消息的数据文件。嵌入过程花费了 4 分钟多一点,但截至撰写本文时,hdbscan 聚类过程花费了超过 1 小时,而且看不到尽头。

对我来说也很奇怪的是,当我查看系统资源消耗(我在 Windows 10 上)时,我正在运行的脚本只占用 7% 的 CPU(i9-10850K)和 1.2GB 的内存(out 128GB)。所以我有几个问题,

  1. 为什么这不消耗更多的系统资源?
  2. 有什么方法可以让我并行化吗?

最后这里是代码仅供参考。

data = parseMessages('raw-data-150k-new-delim.txt', 'ð')
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

embeddings = model.encode(data, show_progress_bar=True, convert_to_tensor=True)

clusters = hdbscan.HDBSCAN(
    min_cluster_size=15,
    min_samples=15,
    metric='euclidean',
    cluster_selection_method='eom').fit(embeddings)

谢谢!!

1个回答

hdbscan 比 sentence-BERT 的输出更喜欢低维数据。最终,hdbscan 库希望使用 BallTrees 的 KDTrees 来进行高效的最近邻查询,并且这些在 50 维或更少维度上效果最佳。对于更高维度的数据,库默认使用更慢且更昂贵的代码路径。为了让这个运行更快,最好的方法是减少数据的维数。在我(高度偏见)看来, UMAP将是实现这一目标的好方法,但您也可以尝试 PCA 或其他降维技术。