Redian新闻
>
问个题 weighted random sampling
avatar
问个题 weighted random sampling# JobHunting - 待字闺中
j*n
1
1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
[0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
个了。
问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
这种sum很可能就overflow了。
avatar
h*e
2
用double存sum不行吗?

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
l*a
3
也overflow呢?

【在 h****e 的大作中提到】
: 用double存sum不行吗?
avatar
h*e
4
那就用BigNum之类的。

【在 l*****a 的大作中提到】
: 也overflow呢?
avatar
k*g
5
把数都放到int array,size of sum,O(1)即可,也不用search了
★ Sent from iPhone App: iReader Mitbbs 7.56 - iPad Lite
avatar
X*K
6
是个办法,不过sum都溢出了,这array得有多大。
avatar
j*n
7
就是一些海量数据的玩意, 我现在是把每个数都先scale down 一下,再加,会好一些
。 搜了一下 也没有什么好办法,都还是得加一加
avatar
g*s
8
max_v = 0;
for i = 1 to n{
if (weight[i] > max_v) {
sum = sum * (max_v / weight[i]) ;
max_v = weight[i];
}
sum += weigh[i] / max_v;
if ( random(1) <= ( (weight[i]/max_v) / (sum) )
r = a[i];
}
return r;
max_v is alway the max value of weigh [0..i]
sum <= i

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
j*n
9
先顶再看
avatar
l*n
10
divided by sum to turn to [0,1] and then generate a [0,1] uniform

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
m*e
11
如果数组大到让sum溢出,那么scale down也会underflow。
我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
After burning in like 10000 iterations, 后面产生的就是要的sample.
这不像是面试SDE的问题,楼主面的是什么职位可以告知么?
avatar
j*n
12
M-H should work, but getting a good proposal distributon is not easy.
proving detailed balance is hard.
Just a bonus question for machine learning data scientist position.

【在 m*********e 的大作中提到】
: 如果数组大到让sum溢出,那么scale down也会underflow。
: 我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
: 个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
: After burning in like 10000 iterations, 后面产生的就是要的sample.
: 这不像是面试SDE的问题,楼主面的是什么职位可以告知么?

avatar
g*s
13
就是一道稍微改编的 weighted reservoir sampling algorithm.
始终记录到目前数字weight的最大值。然后用它scale。不能用sum进行scale。

【在 m*********e 的大作中提到】
: 如果数组大到让sum溢出,那么scale down也会underflow。
: 我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
: 个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
: After burning in like 10000 iterations, 后面产生的就是要的sample.
: 这不像是面试SDE的问题,楼主面的是什么职位可以告知么?

avatar
j*n
14
I agree, it is the best answer so far, in my mind.

【在 g***s 的大作中提到】
: 就是一道稍微改编的 weighted reservoir sampling algorithm.
: 始终记录到目前数字weight的最大值。然后用它scale。不能用sum进行scale。

avatar
m*e
15
jet你是什么背景的? 我也想找data scientist之类的职位,但是这种职位似乎不愿给
没有经验的fresh grad。可是找不到工作我又哪来的经验,在死循环中痛苦中。
avatar
Z*Z
16

~~~~rrdw:这里是不是应该是<=?


【在 g***s 的大作中提到】
: max_v = 0;
: for i = 1 to n{
: if (weight[i] > max_v) {
: sum = sum * (max_v / weight[i]) ;
: max_v = weight[i];
: }
: sum += weigh[i] / max_v;
: if ( random(1) <= ( (weight[i]/max_v) / (sum) )
: r = a[i];
: }

avatar
g*s
17
yes. typo.

【在 Z*****Z 的大作中提到】
:
: ~~~~rrdw:这里是不是应该是<=?
:

avatar
j*n
18
1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
[0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
个了。
问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
这种sum很可能就overflow了。
avatar
h*e
19
用double存sum不行吗?

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
l*a
20
也overflow呢?

【在 h****e 的大作中提到】
: 用double存sum不行吗?
avatar
h*e
21
那就用BigNum之类的。

【在 l*****a 的大作中提到】
: 也overflow呢?
avatar
k*g
22
把数都放到int array,size of sum,O(1)即可,也不用search了
★ Sent from iPhone App: iReader Mitbbs 7.56 - iPad Lite
avatar
X*K
23
是个办法,不过sum都溢出了,这array得有多大。
avatar
j*n
24
就是一些海量数据的玩意, 我现在是把每个数都先scale down 一下,再加,会好一些
。 搜了一下 也没有什么好办法,都还是得加一加
avatar
g*s
25
max_v = 0;
for i = 1 to n{
if (weight[i] > max_v) {
sum = sum * (max_v / weight[i]) ;
max_v = weight[i];
}
sum += weigh[i] / max_v;
if ( random(1) <= ( (weight[i]/max_v) / (sum) )
r = a[i];
}
return r;
max_v is alway the max value of weigh [0..i]
sum <= i

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
j*n
26
先顶再看
avatar
l*n
27
divided by sum to turn to [0,1] and then generate a [0,1] uniform

【在 j*****n 的大作中提到】
: 1个array里面每个数对应1个weight,比如[1,2,3]的 weigh
: t 分别是[10,20,30], 叫你从[1,2,3]里面按照weight产生1
: 个随机数, 比如这里面,产生3的概率是产生1的概率的3倍。
: 简单的做法就是把这些weight加起来,从[10,20,30]变成[10,30
: ,60],然后产生1个从[0,60]的uniform随机数,看这个数是在哪个区间,
: [0,10],[10,30]还是[30,60] 就知道应该返回1,2,3中间哪
: 个了。
: 问题是有没有做法可以不需要执行这个sum的过程,因为如果array很大很大,
: 这种sum很可能就overflow了。

avatar
m*e
28
如果数组大到让sum溢出,那么scale down也会underflow。
我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
After burning in like 10000 iterations, 后面产生的就是要的sample.
这不像是面试SDE的问题,楼主面的是什么职位可以告知么?
avatar
j*n
29
M-H should work, but getting a good proposal distributon is not easy.
proving detailed balance is hard.
Just a bonus question for machine learning data scientist position.

【在 m*********e 的大作中提到】
: 如果数组大到让sum溢出,那么scale down也会underflow。
: 我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
: 个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
: After burning in like 10000 iterations, 后面产生的就是要的sample.
: 这不像是面试SDE的问题,楼主面的是什么职位可以告知么?

avatar
g*s
30
就是一道稍微改编的 weighted reservoir sampling algorithm.
始终记录到目前数字weight的最大值。然后用它scale。不能用sum进行scale。

【在 m*********e 的大作中提到】
: 如果数组大到让sum溢出,那么scale down也会underflow。
: 我想可以用Metropolis–Hastings,也就是选random pick一个数x1,再random pick一
: 个数x2,如果weight of x2大于weight of x1,改变状态到x1,否则以一定概率到x2。
: After burning in like 10000 iterations, 后面产生的就是要的sample.
: 这不像是面试SDE的问题,楼主面的是什么职位可以告知么?

avatar
j*n
31
I agree, it is the best answer so far, in my mind.

【在 g***s 的大作中提到】
: 就是一道稍微改编的 weighted reservoir sampling algorithm.
: 始终记录到目前数字weight的最大值。然后用它scale。不能用sum进行scale。

avatar
m*e
32
jet你是什么背景的? 我也想找data scientist之类的职位,但是这种职位似乎不愿给
没有经验的fresh grad。可是找不到工作我又哪来的经验,在死循环中痛苦中。
avatar
Z*Z
33

~~~~rrdw:这里是不是应该是<=?


【在 g***s 的大作中提到】
: max_v = 0;
: for i = 1 to n{
: if (weight[i] > max_v) {
: sum = sum * (max_v / weight[i]) ;
: max_v = weight[i];
: }
: sum += weigh[i] / max_v;
: if ( random(1) <= ( (weight[i]/max_v) / (sum) )
: r = a[i];
: }

avatar
g*s
34
yes. typo.

【在 Z*****Z 的大作中提到】
:
: ~~~~rrdw:这里是不是应该是<=?
:

avatar
b*r
35
the idea is great, but just picking bone from egg, why sum<=1? do i miss
anything?

【在 g***s 的大作中提到】
: max_v = 0;
: for i = 1 to n{
: if (weight[i] > max_v) {
: sum = sum * (max_v / weight[i]) ;
: max_v = weight[i];
: }
: sum += weigh[i] / max_v;
: if ( random(1) <= ( (weight[i]/max_v) / (sum) )
: r = a[i];
: }

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。