BanditPAM:通过多臂老虎机进行几乎线性时间的 k-medoids 聚类

TL;DR想要比 \(k\)-means 更好的东西吗?我们最先进的 NeurIPS \(k\)-medoids 算法 BanditPAM 现已公开!\(\texttt{pip install banditpam}\),您就可以开始了!与 \(k\)-means 问题一样,\(k\)-medoids 问题是一个聚类问题,我们的目标是将数据集划分为不相交的子集。然而,在 \(k\)-medoids 中,我们要求聚类中心必须是实际数据点,这允许对聚类中心进行更好的解释。\(k\)-medoids 还可以更好地处理任意距离度量,因此如果您使用 \(L_1\) 之类的度量,您的聚类可以对异常值更具鲁棒性。尽管有这些优势,但大多数人不使用 \(k\)-medoids,因为之前的算法太慢了。在我们的 NeurIPS 论文 BanditPAM 中,我们将最知名的算法从 \(O(n^2)\) 加速到 \(O(n\text{log}n)\)。我们发布了我们的实现,可通过 pip 安装。它以 C++ 编写,速度快,支持并行化和智能缓存,不会给最终用户带来额外的复杂性。它的接口也与 \(\texttt{sklearn.cluster.KMeans}\) 接口相匹配,因此只需对现有代码进行最小程度的更改。有用的链接:3 分钟视频摘要 PyPIGithub 存储库全文 \(k\)-means vs. \(k\)-medoids 如果您是 ML 从业者,您可能熟悉 \(k\)-means 问题。事实上,您可能知道 \(k\)-means 问题的一些常见算法。然而,您不太可能熟悉 \(k\)-medoi

来源:斯坦福人工智能实验室博客

tl; dr

想要比\ \(k \)更好的东西 - 意味着?我们的最先进的(K \) - Banditpam Neurips的Medoids算法现已公开使用! \(\ texttt {pip install banditpam} \),你很高兴!

类似于\(k \) - 表示问题,\(k \) - Medoids问题是一个聚类问题,我们的目标是将数据集划分为不相交子集。但是,在\(k \)中 - 但是,我们要求群集中心必须是实际数据点,这允许更大的群集中心解释性。 \(k \) - Medoids在任意距离指标中也可以更好地工作,因此,如果您使用\(L_1 \)之类的指标,则聚类对离群值可能更强大。

尽管有这些优势,但大多数人不使用\(k \) - Medoids,因为先前的算法太慢。在我们的神经纸(Banditpam)中,我们从\(o(n^2)\)加速了最著名的算法到\(o(n \ text {log} n)\)。

我们发布了可以安装的实现。它以C ++的速度编写,并支持并行化和智能缓存,对于最终用户而言,它没有额外的复杂性。它的界面还匹配\(\ texttt {sklearn.cluster.kmeans} \)接口,因此现有代码需要最小的更改。

有用的链接:

\(k \) - 表示vs. \(k \)-Medoids

如果您是ML从业者,则可能熟悉\(k \) - 意味着问题。实际上,您可能知道\(k \)的一些常见算法 - 意味着问题。但是,您熟悉\(k \) - 医疗问题的可能性要小得多。

Medoids

\(k \) - Medoids问题是类似于\(k \) - 含义的聚类问题。给定一个数据集,我们希望将数据集划分为每个集群中的点比所有其他\(k-1 \)群集中心更接近单个群集中心的子集。与\(k \)中 - 表示\(k \) - Medoids问题需要集群中心是实际数据点。

实际数据点 图1: 图2: 任何成对差异函数

banditpam:几乎是线性时间\(k \) - 通过多武器匪徒聚类

匹配 图3: 全部 样品