0

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

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

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

提前致谢。

4

2 回答 2

0

该程序编译并运行良好。它需要一个 jar 文件或“Java Archive”才能编译和运行。具体来说,它需要 ParallelColt 库,这是一个“Colt 的多线程版本——Java 中用于高性能科学计算的库”。可在此链接中找到。拥有它后,从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%

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

于 2016-01-16T04:04:48.550 回答
0

你不想要一个随机样本,你想要一个有代表性的样本。一种相对有效的方法是按“强度”顺序对元素进行排序,然后取每个第 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),空间复杂度为 O(n)。

于 2016-01-16T17:25:21.283 回答