Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中实现一组向量的随机采样?_Java_Random Sample_Montecarlo_Semantic Analysis - Fatal编程技术网

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

如何在java中实现一组向量的随机采样?,java,random-sample,montecarlo,semantic-analysis,Java,Random Sample,Montecarlo,Semantic Analysis,我有大量的上下文向量,我想找出它们的平均余弦相似性。然而,通过整个集合来计算它是不有效的。这就是为什么,我想从这个集合中随机抽取一个样本 问题是,每个上下文向量解释了一个单词的某种程度的含义,所以我想做出一个平衡的选择(根据向量值)。我搜索发现我可以使用蒙特卡罗方法。我还发现了一个Gibbs取样器示例: 然而,我有点困惑。据我所知,该方法提供了一个正态分布,并生成了两个数字。我不知道如何在我的案例中实现这个方法。有人能给我解释一下我怎样才能解决这个问题吗 提前感谢。该程序编译并运行良好。它需要一

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

问题是,每个上下文向量解释了一个单词的某种程度的含义,所以我想做出一个平衡的选择(根据向量值)。我搜索发现我可以使用蒙特卡罗方法。我还发现了一个Gibbs取样器示例:

然而,我有点困惑。据我所知,该方法提供了一个正态分布,并生成了两个数字。我不知道如何在我的案例中实现这个方法。有人能给我解释一下我怎样才能解决这个问题吗


提前感谢。

该程序编译并运行良好。它需要一个jar文件或“Java存档”来编译和运行。具体来说,它需要ParallelColt库,这是一个“Colt的多线程版本-Java中用于高性能科学计算的库”。一旦有了它,就可以从中获取JavaJDK(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%
如果这个回答对您有帮助,请选择它作为答案。

您不想要随机样本,而是想要有代表性的样本。一种相对有效的方法是按“强度”顺序对元素进行排序,然后取每个第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);
//给定
设置mySet;
整数折减系数=200;//样品中0.5%的元素
列表=新的ArrayList(mySet);
集合。排序(列表,新的比较器{
公共整数比较(矢量o1,矢量o2){
//然而你比较“力量”
}         
});
List randomSample=new ArrayList(List.size()/reductionFactor);
对于(int i=0;i

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

如何定义“平衡”?每种定义类型的数量相似?基于类型的选择概率?其他?我的意思是一些向量定义了目标词更强的含义,而另一些向量定义了较弱的含义。例如,如果我主要从较弱的向量中进行选择,那么在计算平均余弦相似度时,它将给出错误的结果。假设我将选择在2000个向量中,我想从强向量和弱向量中选取。强向量的例子:(100,43,80,15)和弱向量的例子:(2,0,10,0)。我已经将cern.jet.random包导入到我的项目中并应用该代码。正如我在问题中所说的,它会创建一个正态分布并返回两个数字。我不知道如何在我的案例中使用Gibbs sampler。我不知道如何将此代码应用到您的问题中,抱歉。非常感谢@Bohemian