我需要生成随机索引向量(维度大约为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个词创建向量。
此外,向量必须正交的事实意味着它们不能完全随机,因为真正的随机向量可能不正交。
HashMap<Integer, Byte>
或类似的东西可以作为一个不错的稀疏向量。