聚类高维数据

数据挖掘 聚类 张量流 k-均值 无监督学习 特纳
2021-09-16 04:20:47

TL;DR:K给定一个包含未标记数据的大型图像数据集(大约 36 GiB 的原始像素),我如何在不知道开始的聚类数量的情况下对图像进行聚类(基于像素值) ?

我目前正在从事一个无监督学习项目来聚类图像;将其视为对具有 16x16x3 RGB 像素值的 MNIST 进行聚类,只是我有大约 4800 万个示例需要聚类。在不知道他们的身份的情况下,我知道其中一些图像肯定是相关的,因为它们来自同一个来源,但是 - 比如说 - 我也不知道合适K的“只是”在现场运行 K-means .

我正在考虑使用 t-SNE 进行一些手动 2D 嵌入,然后在嵌入空间中手动进行聚类(比在16x16x3-d 中手动进行更简单的任务),但我发现的所有 t-SNE 实现都需要将数据加载到内存中。我还考虑过首先运行 t-SNE,然后在 t-SNE 嵌入数据上运行 K-means,但是如果您查看 MNIST 的 t-SNE 的结果,很明显这些集群可能而且很可能会被扭曲和倾斜以非线性方式。因此,即使我知道 a K,集群也可能会被拆分。将 Mahalanobis 距离用于 K-means 可能是一件有趣的事情,但由于我一开始不知道协方差,这似乎也是一个死胡同。

目前,我正在尝试是否可以对示例运行 PCA 压缩以至少为 t-SNE 获得一些内存,但这可能会或可能不会起作用……现在还不能说。

有人可以给我一个正确方向的指针吗(理想情况下,但在 Python、TensorFlow 或 Apache Beam/Dataflow 上下文中绝对没有必要)?不久前我正在移植一个 Streaming/Ball K-means,它确实具有“按需”创建新集群的好特性,但在我开始在 Python/TensorFlow/Dataflow 中再次实现它之前,我希望有人可以给我一些想法从哪里开始或避免什么。

2个回答

我不认为任何集群技术“只是”在这样的规模上起作用。据说最具可扩展性的是 k-means(只是不要使用 Spark/Mahout,它们真的很糟糕)和 DBSCAN(有一些很好的分布式版本可用)。

但是您将面临除规模之外的许多其他挑战,因为集群很困难似乎仅仅运行算法就足够了,然后你就有了集群。聚类是一种探索性技术。没有“正确”的聚类。但是,您需要一次又一次地运行集群,并查看每个集群因为不会有一个单一的参数设置可以让一切都正确。相反,不同的集群可能只出现在不同的参数上。

但在您的情况下,主要挑战可能是距离函数。除了像 MNIST 这样的理想化设置,欧几里得距离根本不起作用。也不会对原始像素起作用。所以首先你需要做特征提取,然后定义一个相似度函数。

当涉及到聚类时,请使用 sample对样本进行聚类,识别有趣的聚类,然后想办法将标签推广到整个数据集。例如通过分类(您的标记数据点是您的训练集,预测未标记点的标签)。

如果你想进行降维,你应该使用 Mahout——它是同类中最好的,也是唯一一个提供真正分布式 PCA / SVD 版本的开源项目 afaik。

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/algorithms/linear-algebra/d-spca.html

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/algorithms/linear-algebra/d-ssvd.html

Mahout 还有 DBSCAN 实现,WIP 作为 Google Summer of Code 项目的一部分,值得关注。

我猜 Anony 的“Mahout is Bad”评论(我同意 Spark 是)与已弃用的 Mahout 的 MapReduce 版本相关(因为新版本还没有实现开箱即用的 K-Means,尽管有关于关于如何相当容易地做到这一点的邮件列表)。