如何在java中实现一组向量的随机采样?

How to implement random sampling of a set of vectors in java?

我有大量的上下文向量,我想找到它们的平均余弦相似度。但是,通过整个集合计算它效率不高。这就是为什么,我想从这个集合中随机抽样。

问题是每个上下文向量都在一定程度上解释了一个词的含义,所以我想做出平衡的选择(根据向量值)。我搜索了一下,发现我可以使用 Monte Carlo 方法。我还在这里找到了一个 Gibbs Sampler 示例:https://darrenjw.wordpress.com/2011/07/16/gibbs-sampler-in-various-languages-revisited/

但是,我有点困惑。据我了解,该方法提供正态分布并生成双数。我不明白如何在我的案例中实施这种方法。有人可以解释一下我该如何解决这个问题吗?

提前致谢。

程序编译成功,运行没问题。它需要一个 jar 文件,或者 "Java Archive" 以便编译和 运行。具体来说,它需要ParallelColt库,一个"a multithreaded version of Colt - a library for high performance scientific computing in Java."可以在这个link. Once you have it, get the java JDK (SE version) from Oracle找到。

将您引用的源代码和 parallelcolt-0.9.4.jar 文件复制到一个目录中,然后使用以下命令进行编译和 运行:

javac -cp parallelcolt-0.9.4.jar Gibbs.java

java -cp parallelcolt-0.9.4.jar;. Gibbs

请注意,您可能需要在路径中包含编译器。在 windows 我是这样做的:

path="c:\program files\java\jdk1.7.0_60\bin";%PATH%

如果对您有帮助,请select将此回复作为答案。

您不需要随机样本,您想要代表性样本。一种相对有效的方法是按 "strength" 顺序对元素进行排序,然后取每第 n 个元素,这将为您提供 size/n 元素的代表性样本。

试试这个:

// Given
Set<Vector> mySet;
int reductionFactor = 200; // eg sample 0.5% of elements

List<Vector> list = new ArrayList<>(mySet);
Collections.sort(list, new Comparator<Vector> {
    public int compare(Vector o1, Vector o2) {
        // however you compare "strength"
    }         
});
List<Vector> randomSample = new ArrayList<>(list.size() / reductionFactor );
for (int i = 0; i < list.size(); i += reductionFactor)
    randomSample.add(list.get(i);

由于排序操作,时间复杂度为O(n log n),space复杂度为O(n)。