资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 面试经验 > 面试问答

随机矩阵所有行的快速随机加权选择

面试问答 更新时间: 发布时间: 计算机考试归档 最新发布

随机矩阵所有行的快速随机加权选择

这是一个非常快速的完全矢量化版本:

def vectorized(prob_matrix, items):    s = prob_matrix.cumsum(axis=0)    r = np.random.rand(prob_matrix.shape[1])    k = (s < r).sum(axis=0)    return items[k]

从理论上讲

searchsorted
是用于在累积求和的概率中查找随机值的正确函数,但
m
由于相对较小,因此
k = (s <r).sum(axis=0)
最终速度要快得多。它的时间复杂度为O(m),而
searchsorted
方法为O(log(m)),但这仅对大得多才有意义
m

另外
cumsum
也是O(m),所以
vectorized
和@perimosocordiae
improved
都是O(m)。(
m
实际上,如果您的计算机更大,则必须运行一些测试以查看
m
此方法变慢之前可以达到的大小。)

这是我使用

m = 10
n = 10000
(使用函数
original
improved
@perimosocordiae的答案)得到的时间:

In [115]: %timeit original(prob_matrix, items)1 loops, best of 3: 270 ms per loopIn [116]: %timeit improved(prob_matrix, items)10 loops, best of 3: 24.9 ms per loopIn [117]: %timeit vectorized(prob_matrix, items)1000 loops, best of 3: 1 ms per loop

定义功能的完整脚本为:

import numpy as npdef improved(prob_matrix, items):    # transpose here for better data locality later    cdf = np.cumsum(prob_matrix.T, axis=1)    # random numbers are expensive, so we'll get all of them at once    ridx = np.random.random(size=n)    # the one loop we can't avoid, made as simple as possible    idx = np.zeros(n, dtype=int)    for i, r in enumerate(ridx):        idx[i] = np.searchsorted(cdf[i], r)    # fancy indexing all at once is faster than indexing in a loop    return items[idx]def original(prob_matrix, items):    choices = np.zeros((n,))    # This is slow, because of the loop in Python    for i in range(n):        choices[i] = np.random.choice(items, p=prob_matrix[:,i])    return choicesdef vectorized(prob_matrix, items):    s = prob_matrix.cumsum(axis=0)    r = np.random.rand(prob_matrix.shape[1])    k = (s < r).sum(axis=0)    return items[k]m = 10n = 10000 # Or some very large numberitems = np.arange(m)prob_weights = np.random.rand(m, n)prob_matrix = prob_weights / prob_weights.sum(axis=0, keepdims=True)


转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/624865.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【随机矩阵所有行的快速随机加权选择】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2