我发现这很难解释,但我会通过一个例子尽我所能.
考虑下面分配给变量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