1.定义
如果总体中每个个体被选入样本的概率是不相等的,则称这种随机抽样的方式为不等概率抽样。
2.优点
这中不等概率抽样能提高抽样精度,减少样本不均衡造成的抽样误差。使用个体之间差异较大的场所。
3.实现
将总体中每个个体赋予不同的权重,权重大的个体被抽到的概率大,权重小的个体被抽到的概率小。
4.有放回抽样
例:
4.1 代码法
代码法是最直接的一种方法,也是最容易想到的一种方法,即分别复制增加每种样本的个数,使得每种样本的个数之比,等于入样概率之比。
每次抽样前,先在整数1,2,3,…M0里面随机等可能的选取一个整数,设为m ,若代码 m 属于第 j个单元拥有的代码数,则第 j个单元入样。整个过程重复 n次,得到 n个单元入样(当然存在重复的可能性)构成样本。
4.2 Lahiri法
当N非常大时,累积的M0也将很大,给代码法的实施带来很多不方便,Lahiri提出下列方法:
令:
每次抽取1~N中一个随机整数i,及1~M*内一个随机整数m,如果Mi>m,则第i个单元入样;否则按前面步骤重抽。
代码:
unequalProbabilitySampling(vector<int> *mark_samples, vector<float> weights_f)
{
if(mark_samples->size() != weights_f.size())
{
cout << "the length of weights doesnt match samples" <<endl;
return 0;
}
int M0 = 0, M_max = 0;
vector<int> weights_int;
for(int i=0; i<weights_f.size(); i++)
{
weights_int.push_back(weights_f.at(i) * weights_f.size() * 2);
M0 = M0 + weights_int.at(i);
}
M_max = *max_element(weights_int.begin(), weights_int.end());
srand((int)time(0));
for(int i=0; i<weights_int.size(); i++)
{
while(1)
{
int m = random(M_max);
int n = random(weights_int.size());
if( weights_int.at(n) >= m)
{
mark_samples->at(n) = mark_samples->at(n) + 1;
break;
}
}
}
return 0;
}
由上数据知,每次采样过程,有一半的概率采样成功,其中3中样本的入样概率之比,等于设定的权重之比。