代码之家  ›  专栏  ›  技术社区  ›  Osman Mamun

以索引作为哈希函数生成随机参数组合的有效方法

  •  0
  • Osman Mamun  · 技术社区  · 5 年前

    我有13个变量,步长为15,这意味着每个变量的长度为15 np.linspace(min, max, step) .如果我试着得到所有的组合,大约是15*13个组合。我想从这个组合空间中采集10000个样本。, 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 抛出内存错误。

    我的问题是:

    1. 如何从13**15个数字中生成10000个随机索引,而不会出现内存错误。
    2. 给定索引,如何在不运行的情况下生成相应的组合 itertools.product .
    0 回复  |  直到 5 年前
        1
  •  0
  •   Alex Hall    5 年前
    import itertools
    
    
    def _build_combinations(val_dict):
        for instance in itertools.product(*val_dict.values()):
            yield dict(zip(val_dict.keys(), instance))
    
    
    def params_to_index(val_dict, param_dict):
        result = 0
        for key, values in val_dict.items():
            result *= len(values)
            result += values.index(param_dict[key])
        return result
    
    
    def index_to_params(val_dict, i):
        param_dict = {}
        for key, values in list(val_dict.items())[::-1]:
            i, v_index = divmod(i, len(values))
            param_dict[key] = values[v_index]
        return param_dict
    
    
    def test_index():
        val_dict = dict(
            a=[1, 2],
            b=[3, 4, 5],
            c=[6, 7, 8, 9]
        )
        for i, param_dict in enumerate(_build_combinations(val_dict)):
            assert i == params_to_index(val_dict, param_dict)
            assert param_dict == index_to_params(val_dict, i)
    
    
    test_index()