用sympy求解正规方程

4

我正在尝试学习SymPy,想要了解如何通过符号计算来执行一个酷炫的任务,即对最小二乘问题进行正规方程求导。

from sympy import *
init_session()

x, y, b = Matrix(), Matrix(), Matrix()
sqNorm = (y - x*b).dot(y- x*b)
solve(diff(sqNorm, b), b)

当我运行它时,我得到
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/function.py", line 1638, in diff
    return Derivative(f, *symbols, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/function.py", line 1005, in __new__
    if v._diff_wrt:
  File "/usr/local/lib/python2.7/dist-packages/sympy/matrices/matrices.py", line 3084, in __getattr__
    "%s has no attribute %s." % (self.__class__.__name__, attr))
AttributeError: ImmutableMatrix has no attribute _diff_wrt.

我希望得到类似于(x'x)^{-1}x'y的结果。在SymPy中是否可能实现?

Matrix()空矩阵,这不是你想要的。你应该能够使用MatrixSymbol,但看起来它还不支持微分。 - asmeurer
请参见 https://github.com/sympy/sympy/issues/5858 - asmeurer
可能相关: https://dev59.com/JWEi5IYBdhLWcg3wjs5j?rq=1 - Rufus
1个回答

1
不,SymPy没有内置这种级别的抽象矩阵微积分。要能够对矩阵求导,它们必须具有特定的大小并填充有可微分的内容:我在下面举了一个例子。话虽如此,您可能会对this project感兴趣,该项目通过公理化某些规则在SymPy中实现了抽象矩阵微积分的元素。
以下是使用SymPy进行符号最小二乘问题的示例。使用symarray(使用a_0_0表示法)可以将矩阵填充为符号变量。然后计算残差,求导并解决问题。
from sympy import *
m = 3
n = 2
x = Matrix(symarray('x', (m, n)))
y = Matrix(symarray('y', (m, 1)))
b = Matrix(symarray('b', (n, 1)))
z = (y-x*b).dot(y-x*b)
vars = [b[i,0] for i in range(n)]
eqs = [z.diff(b) for b in vars]
print solve(eqs, vars)

输出虽然正确,但并没有启发性:
{b_0_0: ((x_0_1**2 + x_1_1**2 + x_2_1**2)*(x_0_0*y_0_0 + x_1_0*y_1_0 + x_2_0*y_2_0) - (x_0_0*x_0_1 + x_1_0*x_1_1 + x_2_0*x_2_1)*(x_0_1*y_0_0 + x_1_1*y_1_0 + x_2_1*y_2_0))/((x_0_0**2 + x_1_0**2 + x_2_0**2)*(x_0_1**2 + x_1_1**2 + x_2_1**2) - (x_0_0*x_0_1 + x_1_0*x_1_1 + x_2_0*x_2_1)**2), b_1_0: ((x_0_0**2 + x_1_0**2 + x_2_0**2)*(x_0_1*y_0_0 + x_1_1*y_1_0 + x_2_1*y_2_0) - (x_0_0*x_0_1 + x_1_0*x_1_1 + x_2_0*x_2_1)*(x_0_0*y_0_0 + x_1_0*y_1_0 + x_2_0*y_2_0))/((x_0_0**2 + x_1_0**2 + x_2_0**2)*(x_0_1**2 + x_1_1**2 + x_2_1**2) - (x_0_0*x_0_1 + x_1_0*x_1_1 + x_2_0*x_2_1)**2)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接