从数据集中获取加权随机样本

时间:2014-09-26 15:26:14

标签: php random sampling random-sample

所以我拥有世界前50个国家的GDP:

USA,16800000,1
CHN,9240270,2
JPN,4901530,3
DEU,3634823,4
FRA,2734949,5
GBR,2521381,6
BRA,2245673,7
RUS,2096777,8
ITA,2071307,9
IND,1876797,10
CAN,1826769,11
AUS,1560597,12
ESP,1358263,13
KOR,1304554,14
MEX,1260915,15
IDN,868346,16
TUR,820207,17
NLD,800173,18
SAU,745273,19
CHE,650377,20
ARG,611755,21
SWE,558949,22
NGA,521803,23
POL,517543,24
NOR,512580,25
BEL,508116,26
VEN,438284,27
AUT,415672,28
THA,387252,29
ARE,383799,30
COL,378148,31
IRN,368904,32
ZAF,350630,33
DNK,330614,34
MYS,312435,35
SGP,297941,36
ISR,291357,37
CHL,277199,38
HKG,274013,39
PHL,272017,40
EGY,271973,41
FIN,256842,42
GRC,241721,43
PAK,236625,44
KAZ,224415,45
IRQ,222879,46
PRT,220022,47
IRL,217816,48
DZA,210183,49
QAT,202450,50

格式:ISO代码,GDP,等级

资料来源:世界银行

我想每隔60秒分析一下这个名单上的每个国家。但我不能 - 我正在使用的服务(Twitter API)是速率有限的。

因此,我将随机选择50个国家中的15个国家,其中国内生产总值最多的国家加权,而国内生产总值最低的国家则加权较少。

我正在使用此函数($ values和$ weights是上述数据中的第1列和第2列 - 解析未显示)

/**
* getSample()
* Pick a random item based on weights.
*
* @param array $values Array of elements to choose from 
* @param array $weights An array of weights. Weight must be a positive number.
* @return mixed Selected element.
* http://stackoverflow.com/questions/445235/generating-random-results-by-weight-in-php
*/
function getSample($values,$weights){ 
    $count = count($values); 
    $i = 0; 
    $n = 0; 
    $num = mt_rand(0, array_sum($weights)); 
    while($i < $count){
        $n += $weights[$i]; 
        if($n >= $num){
            break; 
        }
        $i++; 
    } 
    return $values[$i]; 
}

我从100个电话中得到这种输出:

  

CHN GBR ITA USA ESP MEX ZAF CAN JPN ITA COL USA USA FRA USA CHN USA   IND ESP MEX CHN JPN USA USA CAN DEU USA USA USA JPN NLD CHN USA USA   FRA USA TUR GBR CHN BRA USA BEL JPN USA TUR RUS DEU USA THA USA USA   DEU AUS CHL CHN MEX美国美国CHN PRT SAU ITA IND美国RUS IND AUS ESP   美国KOR CHN USA JPN USA IDN USA CHN FIN USA JPN PRT USA AUS USA JPN   美国美国美国CHN JPN THA CHN TUR CHN FRA美国美国MEX GBR CHN

美国和CHN经常出现!

有没有办法调整这个?

有人能指出我正确的方向吗?

我用PHP编写所有这些。

1 个答案:

答案 0 :(得分:1)

最简单的方法是动态调整权重,例如取初始权重,然后乘以调用该国家后调用的次数迭代次数。然后简单地按照wieghted命令对列表进行排序。因此,例如,根据这些国家排队等候的时间长短,美国将会移到较小的GDP国家之下