对列表按概率采样

  • Input: a collection C of elements and a probability distribution p over C;
  • Output: an element chosen at random from C according to p.

C有n 个元素,1-n, 概率 (p = (p[1], ..., p[n])。 我们只有random.random()函数,它会给我们均匀分布的[0,1]上的一个float. 基本思想是分割[0,1]into n segments of length p[1] ... p[n] ( ∑ p[i] = 1) . 如果均匀地在[0,1]上打点,那它在第i个segment上停住的概率就是p[i]. 因此可以用random.random()函数来实现。查看停止的地方在[0,1]的哪个位置,然后返回其所在的那个segment index. python如下实现:

ref: https://scaron.info/blog/python-weighted-choice.html

对列表按概率采样

import random
import collections def weighted_choice(seq, weights):
assert len(weights) == len(seq)
assert abs(1. - sum(weights)) < 1e-6 x = random.random()
for i, elmt in enumerate(seq):
if x <= weights[i]:
return elmt
x -= weights[i] def gen_weight_list(seq, gt_set, incline_ratio):
'''
:param seq:
:param gt_list:
:param incline_ratio:
:return:
seqe = [1,2,3,4,5]
gt_list = [3,5,7]
# incline_ratio = 0.9 # allocate this num of prob for random select gt's in sequence
'''
len_seq = len(seq)
# programmatic gen the prob list:
prob_list = []
gts_in_seq = [i for i in seq if i in gt_set]
len_gts_in_seq = len(gts_in_seq)
# item_ngt_in_seq = [i for i in seqe if i not in gt_list]
if len_gts_in_seq > 0:
prob_gt = incline_ratio/len_gts_in_seq
prob_ngt = (1-incline_ratio)/(len_seq - len_gts_in_seq)
else:
prob_gt = 0
prob_ngt = 1/len_seq for idx in range(len_seq):
if seq[idx] in gts_in_seq:
# prob_list[idx] = prob_gt
prob_list.append(prob_gt)
else:
# prob_list[idx] = prob_ngt
prob_list.append(prob_ngt) return prob_list # add prob incline ratio for allocate heavier weight udr some conditions:
seqe = [1,2,3,4,5]
gt_set = set([3,5,7]) # conditions, if item in seq is also in this list, will be allocated higher weight.
inc_ratio = 0.8 # allocate this num of prob for random select gt's in sequence prob = gen_weight_list(seqe, gt_set, inc_ratio)
select_seq = [] for i in range(10000):
select_seq.append(weighted_choice(seqe, prob)) # count the item in select_seq:
select_seq.sort(reverse=True) #optional?
item_Count = collections.Counter(select_seq)
print(item_Count)

weighted choice in python的更多相关文章

  1. Python choice() 函数

    Python choice() 函数  Python 数字 描述 choice() 方法返回一个列表,元组或字符串的随机项. 语法 以下是 choice() 方法的语法: import random ...

  2. python之路五

    内建模块 time和datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现 ...

  3. Python 随机数生成总结

    random.uniform(a, b),返回[a,b]之间的浮点数 random.randint(a, b),返回[a,b]之间的整数 random.randrange([start], stop[ ...

  4. Python学习【第十一篇】模块(1)

    模块 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保 ...

  5. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  6. python学习笔记-(九)模块

    基础知识 1. 定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑----实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块就是test) 包:用 ...

  7. Python自动化 【第五篇】:Python基础-常用模块

    目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 yaml处理 configparser hashlib re ...

  8. python学习之路-day5-模块

    本节内容: 模块详解 1.模块定义 2.os&sys模块 3.time&datetime模块 4.random模块 5.shutil模块 6.shelve模块 7.configpars ...

  9. Windows下python的配置

    Windows下python的配置 希望这是最后一次写关于python的配置博客了,已经被python的安装烦的不行了.一开始我希望安装python.手动配置pip并使用pip安装numpy,然而发现 ...

随机推荐

  1. Selenium学习之==>WebDriverApi接口详解

    浏览器操作 driver.back() # 后退 driver.forward() # 前进 driver.refresh() # 刷新 窗口操作 driver.get_window_size() # ...

  2. Debian或者Ubuntu中安装secureCRT/secureFX

    1.官网下载 ubuntu 下的 xx.deb安装包.此处使用的安装包是scrt-sfx-8.5.4-1942.ubuntu16-64.x86_64.deb,点击下载,提取码:5em3. 2.安装 d ...

  3. Scala的集合框架

    1.元组 定义方式:val tp=("nana',1,1.1) 特点:集合中的数据可以是不同类型的 最多只能放22个元素 取值:通过角标取值,这里的角标是从1开始的,元组名称._角标   t ...

  4. python3 基本数据类型_2

    #!/usr/bin/python3 #以下set,dict的方法py2无法运行 #创建set 集合,使用大括号 { } 或者 set() 函数创建 #注意:创建一个空集合必须用 set() 而不是 ...

  5. is_enabled()检查元素是否可以编辑 如文本框

    演示代码from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://www.baidu.com ...

  6. STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)

    硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...

  7. 小油2018 win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误。并非所有的功能被成功更改。

    win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误.并非所有的功能被成功更改. 从安装成功的电脑上拷贝ghost版本缺少的文件,然后再安装telnet客户端,我已打包 链接: ...

  8. 【7.10校内test】T3经营与开发

    [题目链接luogu] 它……又是个DP 我……我讨厌DP!? 然后又是读入,显然用快读啊:(数据范围还是很大的)(习惯) 然后我们发现,不论是损耗值维修值,还是采矿所得,维修花费,都带着个p,因此我 ...

  9. nginx下载安装和虚拟机的配置

    一. Nginx下载安装 1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/usr/local/software/ wget http://nginx.org/download/n ...

  10. 哈希hash

    定义 是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值 生成方法 hash() 哈希特性 不可逆 :在具备编码功能的同时,哈希算法也作为一种加密算 ...