sympy - 元素符号数量的符号和
sympy - symbolic sum over symbolic number of elements
在 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)' 提供最小距离。我怎样才能找到
用 sympy 解决?
鉴于你后面的问题,我假设你已经想出了大部分,但为了清楚起见,样本被认为是函数(有道理,给定的集合实际上是覆盖集合域的函数[主要是超过部分整数]), 所以符号类似于 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
在您提供求和函数、加数表达式和 (index, lower bound, upper bound)
之后,您可以继续使用求和:
>>> 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))
在 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)' 提供最小距离。我怎样才能找到 用 sympy 解决?
鉴于你后面的问题,我假设你已经想出了大部分,但为了清楚起见,样本被认为是函数(有道理,给定的集合实际上是覆盖集合域的函数[主要是超过部分整数]), 所以符号类似于 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
在您提供求和函数、加数表达式和 (index, lower bound, upper bound)
之后,您可以继续使用求和:
>>> 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))