我有大量的上下文向量,我想找到它们的平均余弦相似度。但是,通过整套计算它并不高效。这就是为什么,我想从这个集合中随机抽样。
问题是每个上下文向量都解释了一个单词的含义,所以我想做一个平衡选择(根据向量值)。我搜索并发现我可以使用蒙特卡罗方法。我还在这里找到了一个Gibbs Sampler示例:https://darrenjw.wordpress.com/2011/07/16/gibbs-sampler-in-various-languages-revisited/
然而,我有点困惑。据我所知,该方法提供正态分布并生成双数。在我的情况下,我不明白如何实现这个方法。有人可以解释我如何解决这个问题?
提前致谢。
答案 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)。