R语言sample随机抽样setseed固定随机数/真随机的原因和方法

为什么要固定随机数

如果不加set.seed(1),一样可以生成随机数,但是每次执行的结果都会不同,这就会出现一个问题,比如某学者对某问题进行研究,如果每次都是用随机数据不固定随机数的话,就会导致前后数据的不一致,而且也无法让后来人验证的前人工作的正确与否。

其次,R studio knit 导出html/PDF/word时其实还会重新跑一遍代码,所以如果有用到随机数或者一些有随机过程的机器学习的算法/函数时,你会发现自己在 R studio里跑的结果和导出的html上的结果不一样,这时就不方便把结果 present 给别人。可以使用setseed函数来固定随机数

setseed()

在生成随机数中用到。该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性。如果不设定种子,生成的随机数无法重现。
每次的Seed不同,生成的随机数就不同;每次的Seed相同,生成的随机数就相同。

用法:在你随机取样之前跑这行代码就可以

set.seed(1)

这里的1只是一个数值,可以是2,3,4,1000,随便设。

sample()

用来随机抽样的函数,以下是用法举例

> x=1:1000
> sample(x=x,size=20)
 [1]  66 891 606 924 871 374 879 573 284 305 914 792 398 497 721 897 324 437
[19] 901  33

上述代码表示在1~1000的正整数中随机抽样20个数字,参数size是用来指定在该向量中抽取元素的个数

这些都是无放回抽样。所谓无放回抽样,也就是说某个元素一旦被选择,该总体中就不会再有该元素。如果是有放回抽样,则需添加一个参数repalce=T:

> x=1:10
> sample(x=x,size=5,replace=T)
[1] 4 7 2 4 8

有放回抽样,即可以重复对元素进行抽样。
有放回抽样的话size可以无穷大,而无放回抽样size的大小最多是总体的容量。

这里要说明,对于sample函数,参数x可以是数值,也可以是字符,实际上参数x代表任意一个向量:

a=c(“A”,“B”)
sample(x=a,size=10,replace=T)
[1] “B” “A” “A” “A” “B” “A” “A” “B” “A” “A”

上述代码可以理解为掷硬币,抛了10次,其中正面(A)与反面(B)出现的次数。

有时候我们的抽取元素的概率未必相等(如常见的二项分布概率问题),此时我们需要添加一个参数prob。假设一名医生给患者做某手术成功的概率是80%,那么现在他给20例病人做手术,可能有哪几次是成功的呢?代码如下:(其中“S”代表成功,“F”代表失败。)

> x=c("S","F")
> sample(x,size=20,replace=T,prob=c(0.8,0.2))
 [1] "F" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "F" "S" "S" "F" "S" "S"
[19] "F" "S"

对每一个元素我们都可以给定一个概率,且每个概率是独立的,即在参数prob中,不一定所有元素的概率加起来等于1,它只代表某元素被抽取的概率而已。

x=c(1,3,5,7)
sample(x,size=20,replace=T,prob=c(0.1,0.2,0.3,0.9))
[1] 3 5 7 3 7 3 7 5 3 7 7 7 1 5 7 5 7 7 3 7

如何实现真随机

首先,计算机的随机抽样绝大部分都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。

所以如果有需求使用真随机时,
使用单个 long 种子设置此随机数生成器的种子。
setSeed 的常规协定是它更改此随机数生成器对象的状态,使其状态好像是刚刚使用参数 seed 作为种子创建它的状态一样。
通过将种子自动更新为 (seed ^ 0x5DEECE66DL) & ((1L < < 48) - 1)并清除nextGaussian()使用的haveNextNextGaussian 标志,Random 类可实现 setSeed 方法。
Random 类实现的 setSeed 恰好只使用 48 位的给定种子。
但是,通常重写方法可能使用 long 参数的所有 64 位作为种子值。
随机数种子就是产生随机数的第一次使用值, 机制是通过一个比较复杂的函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。 以后产生的随机数都与前一个随机数有关。

你可能感兴趣的:(R,数据分析,算法,python,机器学习)