我需要生成随机索引向量(具有大约1000的大量维度),这将主要是稀疏的(大多数为零值)。向量可以包含1(正维度),-1(负维度)和0的值。这些向量是为文本语料库中的每个单词生成的。什么是在Java中实现这一目标的最佳方法,同时确保结果向量的随机性?
谢谢
答案 0 :(得分: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个单词的向量。
此外,向量必须是正交的这一事实意味着它们不能完全随机,因为真正的随机向量可能恰好是非正交的。
答案 1 :(得分:0)
如果你想尝试一种低成本的方法(编程方式),那么HashMap<Integer, Byte>
或者近似的东西可以产生一个不错的稀疏向量。