Skip to main content
 首页 » 编程设计

python之使用 DEAP 的人类可读输出

2025年05月04日24lori

我正在使用 DEAP 对数据表进行符号回归,即找到最适合数据的函数。不幸的是,我找不到以人类可读格式获取结果的方法。例如,如果我这样做

best_ind = tools.selBest(pop, 1)[0] 
print("Best individual is %s" % (best_ind)) 

我的输出可能看起来像

Best individual is add(mul(add(x, 2), div(y, add(x, y))), 1) 

但这对人类来说很难解释。有没有办法以看起来更像

的方式打印结果
(x+2)*(y/(x+y))+1 

请您参考如下方法:

Ohjeahs 的回答与提供的不一样。我修改了提供的代码并在下面提供。

import sympy 
def convert_inverse_prim(prim, args): 
    """ 
    Convert inverse prims according to: 
    [Dd]iv(a,b) -> Mul[a, 1/b] 
    [Ss]ub(a,b) -> Add[a, -b] 
    We achieve this by overwriting the corresponding format method of the sub and div prim. 
    """ 
    prim = copy.copy(prim) 
    #prim.name = re.sub(r'([A-Z])', lambda pat: pat.group(1).lower(), prim.name)    # lower all capital letters 
 
    converter = { 
        'sub': lambda *args_: "Add({}, Mul(-1,{}))".format(*args_), 
        'protectedDiv': lambda *args_: "Mul({}, Pow({}, -1))".format(*args_), 
        'mul': lambda *args_: "Mul({},{})".format(*args_), 
        'add': lambda *args_: "Add({},{})".format(*args_) 
    } 
    prim_formatter = converter.get(prim.name, prim.format) 
 
    return prim_formatter(*args) 
 
def stringify_for_sympy(f): 
    """Return the expression in a human readable string. 
    """ 
    string = "" 
    stack = [] 
    for node in f: 
        stack.append((node, [])) 
        while len(stack[-1][1]) == stack[-1][0].arity: 
            prim, args = stack.pop() 
            string = convert_inverse_prim(prim, args) 
            if len(stack) == 0: 
                break  # If stack is empty, all nodes should have been seen 
            stack[-1][1].append(string) 
    return string 
 
sympy.simplify(stringify_for_sympy(best_ind))