生成随机索引向量

4
我需要生成随机索引向量(维度大约为1000),其中大部分是稀疏的(大部分是零值)。向量可以包含1(正维度)、-1(负维度)和0的值。这些向量是为文本语料库中的每个单词生成的。在Java中实现此操作的最佳方式是什么,同时确保所得向量的随机性?
谢谢

返回翻译后的文本:1000个单词或每个单词? - Danny Varod
每个语料库中的单词都有1000个维度。 - rmenon
2个回答

1

为了存储一个向量,需要保留其非零位置和+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个词创建向量。

此外,向量必须正交的事实意味着它们不能完全随机,因为真正的随机向量可能不正交。


0
如果你想尝试一种低成本的方法(从编程角度来看),那么一个 HashMap<Integer, Byte> 或类似的东西可以作为一个不错的稀疏向量。

有没有更好的方法来做这件事?实际上,我还有一个额外的要求,即生成的每个向量都应该与其他向量正交? - rmenon
为了获得更好的稀疏向量,您可以查看这个问题 - Rom1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接