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 中再次实现它之前,我希望有人可以给我一些想法从哪里开始或避免什么。