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

时间:2016-01-15 23:07:42

标签: java random-sample montecarlo semantic-analysis

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

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

然而,我有点困惑。据我所知,该方法提供正态分布并生成双数。在我的情况下,我不明白如何实现这个方法。有人可以解释我如何解决这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:0)

该程序编译并运行正常。它需要一个jar文件或“Java Archive”才能编译和运行。具体来说,它需要ParallelColt库,“Colt的多线程版本 - 用于Java中高性能科学计算的库”。它可以在link找到。获得后,从Oracle获取java JDK(SE版本)。

将您引用的源和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%

如果有帮助,请选择此回复作为答案。

答案 1 :(得分:0)

您不需要随机示例,您需要代表性示例。一种相对有效的方法是按“强度”顺序对元素进行排序,然后取每个第n个元素,这将为您提供大小/ 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),空间复杂度为O(n)。