如何在python中对类别进行加权随机抽样

如何解决如何在python中对类别进行加权随机抽样

|| 给定一个元组列表,其中每个元组都包含一个概率和一个项目,我想根据一个项目的概率对其进行采样。例如,给列表[(.3,\'a \'),(.4,\'b \'),(.3,\'c \')]我想对\'b进行采样40%的时间。 在python中执行此操作的规范方法是什么? 我看了看似没有合适函数的随机模块,看了numpy.random,尽管它具有多项式函数,但似乎并没有以很好的形式返回结果。我基本上是在Matlab中寻找mnrnd之类的东西。 非常感谢。 非常感谢您的所有答复。为了澄清,我不是在寻找有关如何编写采样方案的解释,而是要指出一种简单的方法,该方法是从给定一组对象和权重的多项式分布中采样,或者被告知没有此类函数存在于标准库中,因此应该自己编写。     

解决方法

        
import numpy

n = 1000
pairs = [(.3,\'a\'),(.3,\'b\'),(.4,\'c\')]
probabilities = numpy.random.multinomial(n,zip(*pairs)[0])
result = zip(probabilities,zip(*pairs)[1])
# [(299,(299,(402,\'c\')]
[x[0] * x[1] for x in result]
# [\'aaaaaaaaaa\',\'bbbbbbbbbbbbbbbbbbb\',\'cccccccccccccccccccc\']
您想如何准确地收到结果?     ,        这可能会满足您的要求:
numpy.array([.3,.4,.3]).cumsum().searchsorted(numpy.random.sample(5))
    ,        由于没有人使用numpy.random.choice函数,因此这里的函数可以在一个紧凑的行中生成所需的内容:
numpy.random.choice([\'a\',\'b\',\'c\'],size = 20,p = [0.3,0.4,0.3])
    ,        例如,如果您的概率很好地适合于百分比等,那么您可以采取一些措施。 例如,如果您对百分比满意,则可以使用以下命令(以高昂的内存开销为代价): 但是,使用任意浮点概率实现此目标的“真实”方法是在构造累积分布后对其进行采样。这等效于将单位间隔[0,1]细分为标记为'a \',\'b \'和\'c \'的3个线段;然后在单位间隔上选择一个随机点,并查看将其分段的线段。
#!/usr/bin/python3
def randomCategory(probDict):
    \"\"\"
        >>> dist = {\'a\':.1,\'b\':.2,\'c\':.3,\'d\':.4}

        >>> [randomCategory(dist) for _ in range(5)]
        [\'c\',\'c\',\'a\',\'d\',\'c\']

        >>> Counter(randomCategory(dist) for _ in range(10**5))
        Counter({\'d\': 40127,\'c\': 29975,\'b\': 19873,\'a\': 10025})
    \"\"\"
    r = random.random() # range: [0,1)
    total = 0           # range: [0,1]
    for value,prob in probDict.items():
        total += prob
        if total>r:
            return value
    raise Exception(\'distribution not normalized: {probs}\'.format(probs=probDict))
必须注意即使返回值的概率为0的方法。幸运的是,此方法不会,但是以防万一,可以插入
if prob==0: continue
。 记录下来,这是一种骇人听闻的方法:
import random

def makeSampler(probDict):
    \"\"\"
        >>> sampler = makeSampler({\'a\':0.3,\'b\':0.4,\'c\':0.3})
        >>> sampler.sample()
        \'a\'
        >>> sampler.sample()
        \'c\'
    \"\"\"
    oneHundredElements = sum(([val]*(prob*100) for val,prob in probDict.items()),[])
    def sampler():
        return random.choice(oneHundredElements)
    return sampler
但是,如果您没有解决问题的方法,那么实际上这可能是最快的方法。 =)     ,        然后在列表中创建3个“ a”,4个“ b”和3个“ c”,然后随机选择一个。经过足够的迭代,您将获得所需的概率。     ,        我认为多项式函数是一种以随机顺序获取分布样本的相当简单的方法。这只是一种方式
import numpy
from itertools import izip

def getSamples(input,size):
    probabilities,items = zip(*input)
    sampleCounts = numpy.random.multinomial(size,probabilities)
    samples = numpy.array(tuple(countsToSamples(sampleCounts,items)))
    numpy.random.shuffle(samples)
    return samples

def countsToSamples(counts,items):
    for value,repeats in izip(items,counts):
        for _i in xrange(repeats):
            yield value
输入指定为“ 7”,大小是您需要的样本数量。     ,        我不确定这是否是您所要求的Python方式,但是您可以使用     
random.sample([\'a\',k)
其中k是您想要的样本数。 对于更可靠的方法,请根据累积概率将单位间隔分为两部分,并使用random.random()从均匀分布(0,1)中提取。在这种情况下,子间隔为(0,.3)(。3,.7)(。7,1)。您可以根据元素所属的子间隔来选择元素。     ,        刚刚从ѭ9的非常简单(也是正确的)答案中得到了启发:我将演示扩展它以处理任意项目的容易程度,例如:
In []: s= array([.3,.3]).cumsum().searchsorted(sample(54))
In []: c,_= histogram(s,bins= arange(4))
In []: [item* c[i] for i,item in enumerate(\'abc\')]
Out[]: [\'aaaaaaaaaaaa\',\'bbbbbbbbbbbbbbbbbbbbbbbbbb\',\'cccccccccccccccc\']
更新: 根据
phant0m
的反馈,事实证明可以基于implemented12 implemented实现更直接的解决方案,例如:
In []: s= multinomial(54,[.3,.3])
In []: [item* s[i] for i,item in enumerate(\'abc\')]
Out[]: [\'aaaaaaaaaaaaaaa\',\'bbbbbbbbbbbbbbbbbbbbbbbbbbb\',\'cccccccccccc\']
恕我直言,我们对基于ѭ14和
multinomial
的采样有一个很好的总结,得出相似的结果。因此,在总结中,选择最适合您目的的一个。     ,        这可能会有边际收益,但是我这样做是这样的:
import scipy.stats as sps
N=1000
M3 = sps.multinomial.rvs(1,0.3],size=N,random_state=None)
M3a = [ np.where(r==1)[0][0] for r in M3 ] # convert 1-hot encoding to integers
这类似于@eat的答案。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-