7

在 SymPy 中表达以下内容的最合适的方式是什么:

样本 'x[i]' 与 'i' 从具体 0 到符号 'N' 的总和。'x[i]' 本身应该是象征性的,即总是作为变量出现。

目标是在线性方程组中使用这些表达式。

示例(近似最小二乘法):

给定一组样本 (x[i], y[i]),它们应该位于由 'y = m*x + a' 给出的线上。即,估计线由“m”和“a”确定。样本和估计线之间的误差可以由下式给出

 error(m, a) = sum((m * x[i] + a - y[i]) ** 2, start_i=0, end_i=N)

现在,在导数“d/dm error(m,a)”和“d/da error(m,a)”中搜索零跃迁可提供最小距离。我怎样才能找到同情的解决方案?

4

1 回答 1

5

考虑到你后面的问题,我假设你已经想出了大部分问题,但为了清楚起见,样本被视为函数(有道理,给定的集合实际上是覆盖集合域的函数[主要是部分整数]),所以符号就像x(i),并且可以使用summation函数或Sum构造函数来实现求和(第一个更好,因为它会自动扩展常量加数,如summation(x, (i, 0, n)))。

>>> from sympy import *
>>> m, a, x, y, i, n = symbols('m a x y i n')
>>> err = summation((m * x(i) + a - y(i)) ** 2, (i, 0, n))
>>> pprint(err)
  n
 ___
 ╲
  ╲                      2
  ╱   (a + m⋅x(i) - y(i))
 ╱
 ‾‾‾
i = 0

在提供 sum 函数、加数表达式和 后(index, lower bound, upper bound),您可以继续使用 sum:

>>> diff(err, m)
Sum(2*(a + m*x(i) - y(i))*x(i), (i, 0, n))
>>> diff(err, a)
Sum(2*a + 2*m*x(i) - 2*y(i), (i, 0, n))
于 2017-10-02T11:36:59.030 回答