从N个数中均匀随机采样M个数

目录

一.背景

二. 问题分析

1.从抽样分析

2.从等概率分析

三.代码实现

四. 算法优化


一.背景

         最近在做多传感器数据同步的时候遇到一个问题,多个传感器采集数据的频率可能时不一样的,但是数据需要对齐,这样才能进行融合训练。我的一个简单思路就是将同一秒的数据以采样频率最低的数据为标准对齐,那么这必然涉及到对频率高的数据进行采样。为了保证采样尽可能的均匀,相同序列的帧在时间上不至于一样太大差距,所以希望能有一个实验均匀采样。

二. 问题分析

1.从抽样分析

        假设高频数据每秒N个,低频数据每秒M个(时间上,M、N每秒都是不定的),从N个数据中抽出M个,且M要均匀分布。这里跟传统的抽样调查有一点点区别:传统的抽样调查N>>M,比如人口普查14亿人抽样140万人,买房问卷抽样,100万人的城市,抽样1000个市民。这里我的实际问题是,N<2M,也就是没办法等比例采样。

        从N个数中选择M个数并不难,这是一个组合问题,最直接的办法就是选取N个数中的前M个数据,但这显然不是均匀采样。从30个数中抽取15个数容易,将30个数一次分成15组,每组2个数据,

         抛硬币选择每组数字中的奇数或者偶数。

        显然如果是30个数中选择20个就没法这么做了,因为你没法均匀分组。有一个简单的思路就是将这30个数扩大一倍,即1,2,3……30,1,2……30,每3个数一组,分成20组,然后每组随机选择一个,如果是下面这样分组:

有很大可能会出现重复数据,这不是我们想要的。改成 112,233,445,566……

 改成上面的情况依然会出现抽到相同的数,也就是只要同一个数出现在不同分组,那就有几率抽到重复的数。

2.从等概率分析

        既然从单纯的均匀采样分析不行。那就从等概率分析。

        我们知道抽签中奖概率是相等的,举个例子: