如何完美地取樣?

2021-06-13 17:35:04 字數 2150 閱讀 4079

對於n個樣本,如何均勻隨機的取出m個樣本?即n個樣本中每個樣本都能有m/n的概率被取中。

1.簡單插入取樣

這是最基本,最直觀的方法。在乙個初始為空的集合中插入1~n的隨機整數,知道個數為m個為止。但這個方法有個弱點,就是要插入乙個數時,判斷集合中是否存在該數,如果其存在,則要繼續取樣直到取到乙個不在原集合中的數,重複取樣需要很大的開銷,而且越到後來開銷越大。

2.floyd取樣

floyd取樣是大名鼎鼎的robert w. floyd提出來的。其基本思想:當已經在[1,n-1]個區間中已隨機取出m-1個樣本時,這時,生成乙個1~n的隨機數,如果該數落在原來的m-1個樣本中,則樣本集合加入n;如果不落在原來的m-1個樣本中,那麼就將隨機數加入已取樣本集合。這樣的演算法複雜度為o(m)

證明:對於第n個數,其被選中的概率為1/n+(m-1)/n=m/n;

易得p=(m-1)/(n-1)*1+(n-m)/(n-1)*1/n=m/n.

void floysampling(int n,int m)

vectorq;

for(int j=n-m;j::iterator t_position=find(q.begin(),q.end(),t);

if(t_position==q.end())

q.push_back(t);

else

q.push_back(j+1);

} for(vector::iterator iter=q.begin();iter!=q.end();++iter)

printf("%-3d",*iter);

cout《答案策略:取乙個[1,m+i]中的隨機數,如果隨機數落在(m,m+i]時,應該保留原來的m個數;如果隨機數落在[1,m]中,則應該用最新的一條記錄取代[1,m]中隨機的乙個數。

證明如下:

1)假設現在系統讀取第n+1條記錄,現在儲存的m條記錄都是前面m+n條記錄中以m/(m+n)的概率留下來的;

2)取乙個[1,m+n+1]的隨機數,按照上述策略。

3)現在新記錄能保留在m陣列的概率為m/(m+n+1)

4)原來m陣列中的數(設為a)在本輪選擇中還能保留的條件概率(條件是,上一輪選擇中,a被保留):

(n+1)/(m+n+1)+m/(m+n+1)*(1-1/m)=(m+n)/(m+n+1)。

然後要乘以其原來保留下的概率。得到的a仍在m陣列中的概率為m/(m+n+1)。

如此迴圈,總是可以保障每個數被選擇的概率相等。該演算法的複雜度為o(n)

cout<4.隨機順序序列

有時,我們不僅希望能在n個樣本中隨機選取m個樣本,還希望m個樣本的順序也是隨機的。顯然,簡單插入取樣最後得到的序列順序是隨機的。而後面兩種方法得到的順序並不是隨機的。floyd每一輪插入樣本中,如果隨機數在原來的集合中,最大的數總是被插在容器的最後面,這是造成順序不隨機的主要原因。我們令其插入在隨機數的後面。以上只是直觀的上的說明。真正嚴謹的證明請看程式設計珠璣2的13章。

第三種方法的不隨機主要是因為初始的前m個樣本序列的不隨機造成的。

稍微修改一下floyd演算法**即可得到能生成隨機順序的序列的演算法:

void generaterandomseries(int n,int m)

dequeq;

for(int j=n-m;j::iterator t_position=find(q.begin(),q.end(),t);

if(t_position==q.end())

q.push_front(t);

else

q.insert(t_position+1,1,j+1);

} for(deque::iterator iter=q.begin();iter!=q.end();++iter)

printf("%-3d",*iter);

cout<}

試用期沒過,90 是因為你完美地做到了這些

有相當一部分人可能都經歷過試用期被辭退 回想本編找工作時也一度擔心試用期過不了 又錯失了招聘會的好時機 成功轉正的確是好事 但試用期被辭退也無需喪失信心 因為到底是誰的錯,還不一定呢 有一種情況是公司hr的問題 他為公司挑選人才時並沒有按照具體要求進行匹配 這種情況下是招聘的過失 而你更不必過分自責...

讓zheng更完美地支援ajax提交的json資料

我公司採用分布式敏捷架構zheng 不過,在使用過程中,發現並不完美支援從前端提交過來的ajax json資料。一 使用ajax提交的json資料,我們必須新增produces註解,如下所示。否則將會產生亂碼。二 如果你不想每次都新增 produces註解。那麼可以採用我提供的方案 開啟zheng ...

讓zheng更完美地支援ajax提交的json資料

我公司採用分布式敏捷架構zheng 不過,在使用過程中,發現並不完美支援從前端提交過來的ajax json資料。一 使用ajax提交的json資料,我們必須新增produces註解,如下所示。否則將會產生亂碼。二 如果你不想每次都新增produces註解。那麼可以採用我提供的方案 開啟zheng c...