分享

rdd sample()疑问

wjk_snail 发表于 2017-7-4 11:10:52 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 7952
withReplacement可以对多个元素进行多次采样(取样时更换)(can elements be sampled multiple times (replaced when sampled out))
fraction样本的预期大小作为该RDD大小的一部分,不需要替换:每个元素被选择的概率;分数必须为[0,1],替换:每个元素选择的预期次数;分数必须大于或等于0(expected size of the sample as a fraction of this RDD’s size without replacement: probability that each element is chosen; fraction must be [0, 1] with replacement: expected number of times each element is chosen; fraction must be greater than or equal to 0)
seed种子为随机数发生器(seed for the random number generator)
上面是sample() 三个参数的介绍,然后我用如下的例子进行测试:
rdd1 = sc.parallelize([1,2,3,4,5])
rdd1.sample(True,0.5,1).collect()


输出:[2, 5]

然后我通过改变上面的三个参数,但是发现还是不能理解 fraction和seed的作用,我想知道采样后的rdd的元素个数和什么有关,还有这个sample()在实际工作中的作用等等????????

已有(5)人评论

跳转到指定楼层
desehawk 发表于 2017-7-4 16:53:11
本帖最后由 desehawk 于 2017-7-4 16:59 编辑

个人理解:
[mw_shl_code=scala,true]List<Integer> data = Arrays.asList(1, 2, 4, 3, 5, 6, 7);
JavaRDD<Integer> javaRDD = javaSparkContext.parallelize(data);
//false   是伯努利分布  (元素可以多次采样);0.2   采样比例;100   随机数生成器的种子
JavaRDD<Integer> sampleRDD = javaRDD.sample(false,0.2,100);
System.out.println("sampleRDD~~~~~~~~~~~~~~~~~~~~~~~~~~" + sampleRDD.collect());
//true  是柏松分布;0.2   采样比例;100   随机数生成器的种子
JavaRDD<Integer> sampleRDD1 = javaRDD.sample(false,0.2,100);
System.out.println("sampleRDD1~~~~~~~~~~~~~~~~~~~~~~~~~~" + sampleRDD1.collect());[/mw_shl_code]
如上面两个例子:
首先true和false采用的是不同的算法。第二个应该是抽出的比例,猜测应该抽取多少样本。第三个,不太清楚,估计可能是在100个中,随机产生,如果中了就算一个样本。
至于他的用途,由于这个没有实际的场景,所以可能会不懂。比如我们检测产品的质量,可以采用上面算法。随机抽取,之后,看看质量如何,如果好,说明这个产品不错。

回复

使用道具 举报

sstutu 发表于 2017-7-7 15:46:01
下面图示,楼主可参考

是对RDD集合中进行采样的结果是:获取RDD的子集。
fraction =0.5 保留分片的50%也就是一半

和Sample的区别是:takeSample返回的是最终的结果集合。

来自
csdn snail_gesture
回复

使用道具 举报

sstutu 发表于 2017-7-7 15:55:49
上面seed解释似乎不太对。可以看下面例子:
seed是种子。
看下面例子
rand()函数可以生成随机数,其实是在种子的基础上做某种变换并返回生成的随机数。在默认情况下,种子是1。写一个小程序测试一下。
[mw_shl_code=c,true]main()  
{  
int i,j;  
for(i=0;i<10;i++)  
{  
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));  
cout<<j<<endl;  
}  
}   
   执行:9 4 8 8 10 2 4 8 3 6  [/mw_shl_code]

[mw_shl_code=c,true]main()  
{  
int i,j;  
for(i=0;i<10;i++)  
{  
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));  
cout<<j<<endl;  
}  
}   
   执行:9 4 8 8 10 2 4 8 3 6   [/mw_shl_code]
每次执行结果都是 9 4 8 8 10 2 4 8 3 6。在没有修改种子的情况下,程序每次运行都会产生相同的一组随机数。

从上面可以看出,种子其实是自己选择的一个数
回复

使用道具 举报

ledasion 发表于 2017-7-19 14:54:51
withReplacement  样本是否放回的标志,如果为 true,就是有放回的取样,取出的样本可能有重复的,对应的时伯努利取样法; false,就是无放回取样,样本不会重复,对应波松取样法。

fraction 是采样量占样本总量的比例,

seed 是随机采样器的种子,rand(seed) 依据种子来产生伪随机的序列,种子确定了,这个随机序列就确定了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条