【问题标题】:Solving normal equations in sympy在 sympy 中求解正规方程
【发布时间】:2016-01-12 05:03:38
【问题描述】:

我正在尝试学习 SymPy,我想弄清楚如何完成一项很酷的任务,象征性地推导最小二乘问题的 normal equations

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 中可能吗?

【问题讨论】:

标签: python mathematical-optimization sympy


【解决方案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)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多