【发布时间】:2021-11-05 15:40:56
【问题描述】:
我有 13 个变量,步长为 15,这意味着每个变量的长度为 15np.linspace(min, max, step)。如果我尝试获得所有组合,那将是大约 15**13 个组合。我想从这个组合空间中抽取 10,000 个样本,即np.random, choice(15**13, 10000, replace=False)。这将生成我感兴趣的组合的索引。现在如何生成这些组合?下面是生成蛮力组合的代码:
def _build_combinations(self):
#val_dict = {'A': [50, 100], 'B': [10, 40], ...}
val_dict = {k: np.linspace(*v, self.n_steps) for k, v in val_dict.items()}
for instance in itertools.product(*val_dict.values()):
yield dict(zip(val_dict.keys(), instance))
for i, param_dict in enumerate(self._build_combinations(), 1):
self.write(i, param_dict)
这里,i 是该组合的唯一索引。它适用于少量步骤。但是对于大步,即使是np.random.choice 也会引发内存错误。
我的问题是:
- 如何从 13**15 个数字生成 10,000 个随机索引而不会遇到内存错误。
- 给定索引,如何在不运行
itertools.product的情况下生成相应的组合。
【问题讨论】:
-
生成随机组合很简单,你肯定也需要索引吗?