python – 在sympy中智能地重写表达式

我发现这很难解释,但我会通过一个例子尽我所能.

考虑下面分配给变量grad的表达式

 from sympy import *

 a, x, b = symbols("a x b")    
 y_pred = a * x    
 loss = log(1 + exp(- b * y_pred))
 grad = diff(loss, x, 1)

grad具有以下表达式:

-a*b*exp(-a*b*x)/(1 + exp(-a*b*x))

现在我想以两种方式操纵毕业.

1)我希望同意尝试重写表达式grad,使其没有任何术语

exp(-a * b * x)/(1 exp(-a * b * x)).

2)我还希望它尝试重写表达式,使其至少有一个看起来像这样的术语1./(1 exp(a * b * x)).

所以最后,毕业成为:

-a*b/(1 + exp(a*b*x)

请注意,1 /(1 exp(a * b * x))相当于exp(-a * b * x)/(1 exp(-a * b * x)),但我不想提及明确地同意:).

我不确定这是否可行,但知道是否有可能在某种程度上做到这一点会很有趣.

最佳答案 取消这样做

In [16]: cancel(grad)
Out[16]:
  -a⋅b
──────────
 a⋅b⋅x
ℯ      + 1

这是有效的,因为它将表达式视为-a * b *(1 / A)/(1 1 / A),其中A = exp(a * b * x),并且取消将有理函数重写为已取消的p / q(参见有关更多信息,请参阅SymPy教程中的cancel部分.

请注意,这只能起作用,因为它使用A = exp(a * b * x)而不是A = exp(-a * b * x).因此,例如,取消将不会在此处进行类似的简化

In [17]: cancel(-a*b*exp(a*b*x)/(1 + exp(a*b*x)))
Out[17]:
      a⋅b⋅x
-a⋅b⋅ℯ
────────────
  a⋅b⋅x
 ℯ      + 1
点赞