可更换或不更换的一致取样包装。
consistent-sampler的Python项目详细描述
一致采样器
提供“一致采样”的例程sampler
---采样
这在子集之间是一致的(如下所述)。
这里我们称这些元素为“id”,尽管它们可能是 任意python对象(字符串、元组等)。我们假设 ID是不同的。
通过将随机“票号”与 每个id;通过获取 包含最小元素的所需样本大小 相关随机数。
使用给定的“种子”计算随机票号;此种子 可以是任意的python对象,通常是大整数或长整数 弦。
采样是consistent,因为它始终支持元素 小票号;如果两套S和T 重叠,那么他们给定大小的样本也将具有实质性的 重叠(对于相同的随机种子)。
这个例程将一个有限的不同对象集合作为输入 ids、随机种子和一些其他参数。抽样可以是 “有替换”或“无替换”。一个额外的 例程的参数是“take”--所需样本的大小。
它提供作为输出的“采样顺序”--对象的有序列表 确定样本的ID。与 取决于ID和 seed;id按票证号的增加顺序输出。为了 效率和可移植性,票号表示为 小数点0。dddd…dddd介于0和1之间。
对于不更换的采样,输出不能超过 输入,因为没有ID可能会多次出现在示例中。
对于替换采样,输出可能是无限长的, 由于id可能出现在样本中,因此任意大(甚至无限大) 次数。当一个id被采样并在集合中替换时 对于被采样的id,它被赋予一个新的随机票号 从(0,1)中大于其上一个数的一组数均匀地 票号。
sampler
的输出始终是python
生成器,能够生成无限长的ID流。
示例1.
作为不替换采样的一个小例子:
g = sampler(['A-1', 'A-2', 'A-3', 'B-1', 'B-2', 'B-3'],
with_replacement=False, take=4, seed=314159, output='id')
产生一个发电机G,其输出可以打印:
print(list(id for id in g))
产生:
['B-2', 'B-3', 'A-3', 'A-2']
例2.
下面是一个示例,其中采样是用一组6个ID替换的, 输出为每个选定的id提供一个三元组 一。关联的随机票号, 2.选定的ID,以及 三。“generation”(到目前为止选择id的次数)。
>>> for t in sampler(['a1', 'b2', 'c3', 'd4', 'e5', 'f6'],
with_replacement=True, seed=19283746, take=10):
... print(t)
('0.303241347', 'e5', 1)
('0.432145156', 'b2', 1)
('0.487135586', 'c3', 1)
('0.581779914', 'b2', 2)
('0.680782907', 'b2', 3)
('0.700258702', 'c3', 2)
('0.816686725', 'b2', 4)
('0.841870265', 'a1', 1)
('0.857737141', 'a1', 2)
('0.866227993', 'f6', 1)
讨论
这个程序是为选举审计而设计的, 其中被采样的id是选票id,但是这个例程 适用于一般用途。
对于类似的选举审计抽样方法, 见斯塔克的选举审计工具: https://www.stat.berkeley.edu/~stark/Vote/auditTools.htm
一致采样并不是一个新概念,请参见 https://arxiv.org/abs/1612.01041 以及其中对一致抽样的提及。 这里的程序可能(或者不可能)是新颖的,因为它扩展一致 取样到替换取样。
对于我们的应用程序,一致采样的一个主要优点是 接下来。如果每个县单独收集选票,那么 可以自己点票取样和解释 不受其他国家的影响。全部样品 订单可以根据各个县的样本订单,通过 将每个生成的三元组列表合并为一个整体排序 命令。
用法
进一步的文件和示例如下:
一。在代码中consistent_sampler.py
2.可通过运行程序demo_consistent_sampler.py
获得
三。如文件usage_examples.md所述
四。在文件中docs/consistent_sampling_with_replacement.pdf
(此文件很快也将出现在arxiv上。)
此代码已打包并上传对皮皮很在行。从Python3你可以说
from consistent_sampler import sampler
然后说help(sampler)
获取更多文档,或者运行sampler
就像上面的例子一样。
效率
大部分工作是在计算sha256散列函数,它
在一台典型的笔记本电脑上,每次通话大约需要一微秒。因此,
sampler
的运行时间与
id_list
(设置优先级队列)加上,如果采样完成
使用替换,值drop+take
,其中
比例大约是1微秒。