繁体   English   中英

numpy.random.choice 与百分比在实践中不起作用

[英]numpy.random.choice with percentages not working in practice

我正在运行类似于以下内容的python代码:

import numpy

def get_user_group(user, groups):
    if not user.group_id:
        user.group_id = assign(groups)
    return user.group_id

def assign(groups):
    for group in groups:
        ids.append(group.id)
        percentages.append(group.percentage) # e.g. .33

    assignment = numpy.random.choice(ids, p=percentages)
    return assignment

我们正在对数以万计的用户进行野外测试。 我注意到作业不尊重实际的组百分比。 例如,如果我们的百分比是 [.9, .1],我们已经注意到一个小时内一致的 80% 和 20%。 我们已经确认choice函数的输入是正确的并且与实际行为不匹配。

有谁知道为什么会发生这种情况? 是因为我们使用的是全局 numpy 吗? 一些组将在 [.9, .1] 之间划分,而其他组是 [.33,.34,.33] 等。不同组的组是否可能相互干扰?

我们在多个节点上的 python Flask Web 应用程序中运行此代码。

关于如何获得可靠的“随机”加权选择的任何建议?

这条评论用尽了评论的局限性,因此我把它贴在这里。

您的团队无法重现问题但得到了正确的结果这一事实表明 NumPy 很可能可以满足您的需求。 以后需要效率的时候可以从NumPy中受益,可见现在效率不是你关心的问题。

不过,节点上更完整的代码和基础设施设置会有所帮助。 你多久重启你的 Flask 服务器? 你在哪里初始化 NumPy 随机生成器? 考虑以下创建页面/random代码,该页面可以自定义大小,例如: localhost:5000/random?size=20

from flask import Flask, request
import numpy
import pandas

... # your webapp

numpy.random.seed(0)

@app.route('/random', methods=['GET'])
def random():
    """Gives the desired number of random numbers
    with the state of the random number generator.
    """
    # DON'T PUT numpy.random.seed(0) HERE
    size = request.args.get('size')
    
    if size is not None:
        size = int(size)
    else:
        size = 1

    state = numpy.random.get_state()
    data = numpy.random.random(size=size)

    table = pandas.DataFrame(data=data)

    return table.to_html() + repr(state)

在这个例子中,状态在 Flask 应用程序启动后初始化一次。 每当请求/random页面时,就会生成良好的随机数。

如果您将状态初始化放在函数中,它肯定会导致意外分布,bc 您将获得相同的随机数(和相同的选择)。

如果您使用多个节点并使用相同的种子进行初始化,您的不同节点将再次产生相同的选择。 在这种情况下,使用唯一的节点 ID 作为种子值。 如果您经常重新启动服务器,请将重新启动 ID 或时间戳连接到唯一的节点 ID。 确保记录时间戳也是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM