java实现加权抽样_⽤Java替换加权采样
Java或类似Apache MATLAB Commons function randsample的库(例如Apache Commons Math)中是否存在函数?
更具体地说,我想到⼀个函数randSample,该函数根据我指定的概率分布返回⼀个独⽴且完全相同的随机变量的向量.
例如:
int[] a = randSample(new int[]{0, 1, 2}, 5, new double[]{0.2, 0.3, 0.5})
// { 0 w.p. 0.2
// a[i] = { 1 w.p. 0.3
// { 2 w.p. 0.5
输出与MATLAB代码randsample([0 1 2],5,true,[0.2 0.3 0.5])相同,其中true表⽰替换后的采样.
如果不存在这样的功能,该怎么写?
注意:我知道在堆栈溢出中已询问similar question,但不幸的是它尚未得到回答.
解决⽅法:
我敢肯定⼀个⼈不存在,但是创建⼀个可以产⽣这样的样本的函数很容易.⾸先,Java确实带有随机数⽣成器,特别是带有函数
import java.util.Random;
double someRandomDouble = Double();
// This will be a uniformly distributed
// random variable between 0.0 and 1.0.
如果您要进⾏替换采样,并且将输⼊的pdf转换为cdf,则可以使⽤Java提供的随机双精度数,通过查看CDf属于哪个部分来创建随机数据集.因此,⾸先您需要将pdf转换为cdf.
int [] randsample(int[] values, int numsamples,
boolean withReplacement, double [] pdf) {
if(withReplacement) {
double[] cdf = new double[pdf.length];
cdf[0] = pdf[0];
for(int i=1; i
cdf[i] = cdf[i-1] + pdf[i];
}
然后,您可以构建适当⼤⼩的整数数组来存储结果并开始查随机结果:
int[] results = new int[numsamples];
for(int i=0; i
int currentPosition = 0;
while(randomValue > cdf[currentPosition] && currentPosition < cdf.length) {
currentPosition++; //Check the next one.
}
if(currentPosition < cdf.length) { //It worked!
results[i] = values[currentPosition];
} else { //It didn't work.. let's fail gracefully I guess.
results[i] = values[cdf.length-1];
// And assign it the last value.
}
}
//Now we're done and can return the results!
java生成随机数的方法return results;
} else { //Without replacement.
throw new Exception("This is unimplemented!");
}
}
有⼀些错误检查(确保值数组和pdf数组的⼤⼩相同),以及⼀些其他功能,可以通过重载此功能以提供其他功能来实现,但希望这⾜以让您开始.⼲杯!
标签:random-sample,random,matlab,java
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论