不放回简单抽样
题目:设有一组数据:[11,13,16,19,27,36,43,54,62,75],现在想要从中不放回随机抽样5个数据,每个数据被抽中的概率分别为[0.1,0.05,0.05,0.05,0.05,0.1,0.1,0.1,0.1,0.3]。
抽样过程如下。
- 根据待抽样数据的概率,计算以数组形式表示的累计分布概率cdf,并规范化。
计算:cdf=[0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.7,1]
规范化:cdf/=cdf[-1],得到:[0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.7,1]
归一化的处理 需要cdf每次都除以cdf列表的最后一个数据,本例中就是除以1 - 根据还需抽样的个数,生成[0,1]的随机数数组x。
[0.04504848 0.5299489 0.0734825 0.52341745 0.17316974] - 将x中的随机数按照cdf值升序找到插入位置,形成索引数组new。
[0 7 0 7 2]
比如随机数组x中大于0.04504848的最小数是0.1,下标为0;大于0.5299489的最小数是0.6,下标为7 - 找出数组new中不重复的索引位置,作为本次抽样的位置索引。
[0 7 2] - 在概率数组p中,将已经抽样的索引位置置0。
P=[0.,0.05,0.,0.05,0.05,0.1,0.1,0.,0.1,0.3] - 重复上述步骤,直到输出指定数目的样本。
第二轮依旧先累计P,按照一样的步骤进行,第一次抽样抽了3个,这次随机数数组x的个数应该为2个
最终被抽中的样本在原数组中的位置索引:[0 7 2 9 5]
抽样结果:[11 54 16 75 36]
代码如下: