稀疏向量,它们是什么?

Sparse Vectors, what are they?

我正在使用 Mahout API 作为朴素贝叶斯分类器。其中一个函数是 SparseVectorsFromSequenceFiles,虽然我已经尝试过旧的 Google 搜索,但我仍然不明白什么是稀疏向量。 最接近我的解释是 site 这并没有帮助我理解 tbh。

从概念上讲,向量表示数组的泛化,即允许使用索引任意访问其元素的数据结构。 Java 的内置数组 Vector<T>ArrayList<T> 是实现 "regular"(密集)向量概念的数据结构示例。

密集向量通过使用简单的公式 baseAddress + index * elementSize 将向量索引转换为内存地址,从而提供对其元素的恒定时间访问。这意味着内存中的大小与向量需要支持的最大索引成正比。

虽然在您希望放入向量的元素数量和可能的最高索引彼此相对接近的情况下,这是可以接受的。但是,如果您希望使用大范围的索引来索引相对较少的元素(例如,1,000 个元素分散在具有 100,000 个索引的向量中),分配 100,000 spaces 是浪费的。您可以通过实施公开向量接口的数据结构来节省内存,但以 CPU 周期为代价,但对其内部表示使用较少的内存。

您 link 中的示例显示了一种可能的实现方式。其他实现也是可能的,具体取决于数据中索引的分布。如果索引是随机分布的,您可以使用 HashMap<Integer,T> 作为稀疏向量的后备存储。如果索引聚集在一起,您可以将索引 space 拆分为 "pages",并仅将实际数组分配给您需要的页面。此实现类似于将物理内存分配给虚拟内存的方式 space.