我需要生成随机索引向量(大约 1000 维的大量维度),这将主要是稀疏的(大部分是零值)。向量可以包含 1(正维度)、-1(负维度)和 0 的值。这些向量是为文本语料库中的每个单词生成的。在确保结果向量的随机性的同时,在 Java 中实现这一目标的最佳方法是什么?
谢谢
要存储向量,请保留其非零位置和 +1/-1 位的列表。+1/-1 位需要一个字节。
如果你真的想尽可能多地节省内存,你可以保留一个长的BitSet,其中包含所有向量的 +1/-1 信息,每个向量都会记住它在 BitSet 中的起始索引。
要生成与其他向量正交的向量,您可以执行以下操作:
[0 1 0 0 -1 ...]
[1 0 1 0 0 ...] // zeros where the first vector is non-zero
...
保留所有可用 1000 个索引的链接列表。生成向量时,选择少量随机索引,生成这些索引非零的向量,然后从可用索引列表中删除索引。然而,这样你很快就会用完可用的索引。但是在 1000 维空间中只有 1000 个相互正交的向量,所以无论如何你最多可以为 1000 个单词创建向量。
此外,向量必须是正交的这一事实意味着它们不能完全随机,因为真正的随机向量可能碰巧是非正交的。
如果您想尝试一种低成本的方法(编程方式),那么 aHashMap<Integer, Byte>
或类似的东西可以制作一个不错的稀疏向量。