2017-05-23 33 views
1

我正在使用DEAP在數據表上進行符號迴歸,即查找最適合數據的函數。不幸的是,我找不到一種以可讀格式獲得結果的方法。舉例來說,如果我做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 
+0

繼承自'工具'和重載'def __str __()' – stovfl

回答

1

您可以使用sympy.simplify

import sympy 

expr = "Add(x, 2)" 
sympy.simplify(expr) # x + 2 

但是啓動的方式,sympy要添加,MUL等資本化。您還需要將Div(a, b)轉換爲Mul(a, 1/b)

您可以通過改變primitive.format方法,像這樣做:

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_), 
     'div': lambda *args_: "Mul({}, Pow({}, -1))".format(*args_) 
    } 
    prim_formatter = converter.get(prim.name, prim.format) 

    return prim_formatter(*args) 

此代碼是從glyph拍攝。

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)) 
+0

這並沒有真正回答這個問題。如果您有不同的問題,可以通過單擊[提問](https://stackoverflow.com/questions/ask)來提問。您可以[添加賞金](https://stackoverflow.com/help/privileges/set-bounties)在您擁有足夠的[聲譽](https://stackoverflow.com/help/)後吸引更多關注此問題什麼聲譽)。 - [來自評論](/ review/low-quality-posts/18080895) – Sraw

+0

如果您有新問題,請點擊[Ask Question](問問題)(https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/18080895) – blindjesse

+0

這不會提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/18080895) – Shadow