skbio.stats.isubsample

skbio.stats.isubsample(items, maximum, minimum=1, buf_size=1000, bin_f=None)[源代码]

从垃圾箱中随机抽取子样本,无需更换。

状态:从0.4.0开始实验。

从未知数量的输入项中随机抽取没有替换的项,这些项可能落入未知数量的存储箱中。此方法适用于a)无法放入内存或b)对任意数据类型的子采样集合的数据。

参数:
  • items (Iterable) -- 要评估的项目。

  • maximum (unsigned int) -- 每个箱子的最大项目数。

  • minimum (unsigned int, optional) -- 每个箱子的最小项目数。默认值为1。

  • buf_size (unsigned int, optional) -- 随机值缓冲区的大小。此缓冲区保存从项中分配给每个项的随机值。实际上,这个值不太可能需要更改。增加它将需要更多的驻留内存,但可能会减少对PRNG的函数调用数量,而减少它将导致更多的函数调用和更低的内存开销。默认值为1000。

  • bin_f (function, optional) -- 方法确定项与哪个bin关联。如果没有(默认值),则所有项目都被视为同一存储箱的一部分。此函数将与items中的每个条目一起提供,并且必须返回一个散列值,该值指示该条目应该放在哪个bin中。

返回:

(箱子,物品)

返回类型:

generator

抛出:
  • ValueError -- 如果 minimum 是> maximum .

  • ValueError -- 如果 minimum <1或如果 maximum < 1。

备注

随意地走到 maximum 每个箱子的物品。如果垃圾箱的 maximum ,只有那些有>= minimum 项目被退回。

这种方法最多也行得通 maximum *N data,其中N是箱数。

与仓位相关联的所有项目被保留的概率相等。

示例

从一组解复用序列中随机为每个样本保留2个序列:

>>> from skbio.stats import isubsample
>>> import numpy as np
>>> np.random.seed(123)
>>> seqs = [('sampleA', 'AATTGG'),
...         ('sampleB', 'ATATATAT'),
...         ('sampleC', 'ATGGCC'),
...         ('sampleB', 'ATGGCT'),
...         ('sampleB', 'ATGGCG'),
...         ('sampleA', 'ATGGCA')]
>>> bin_f = lambda item: item[0]
>>> for bin_, item in sorted(isubsample(seqs, 2, bin_f=bin_f)):
...     print(bin_, item[1])
sampleA AATTGG
sampleA ATGGCA
sampleB ATATATAT
sampleB ATGGCG
sampleC ATGGCC

现在,我们将最小值设置为2:

>>> bin_f = lambda item: item[0]
>>> for bin_, item in sorted(isubsample(seqs, 2, 2, bin_f=bin_f)):
...     print(bin_, item[1])
sampleA AATTGG
sampleA ATGGCA
sampleB ATATATAT
sampleB ATGGCG