gpt4 book ai didi

参数大小向量的python符号求和与微分

转载 作者:行者123 更新时间:2023-12-01 04:00:47 25 4
gpt4 key购买 nike

这个问题涉及 sympy 中参数大小的向量变量的迭代和微分。它们不是被给予的,也永远不会被给予。

例如,进行以下简单设置:

我有 M 个向量 x,每个向量的维度为 K。我有一个权重向量 w,也是 K 维。(M 和 K 永远不会呈现值,它们只会保持 M 和 K)。

我的函数对 x 向量求和,然后对总和与权重 w 进行点积:

f = dot(sum(x),w)

函数对 w_i 的导数应该是 sum(x_i), i = 1..M

如何在 sympy 中进行编码?既可以求和,也可以求微分。

<小时/>

编辑

由于弗朗西斯科的出色回答明确表明目前这是不可能的,因此我正在寻找解决方法。换句话说:是否有可能:

  1. 定义固定尺寸(例如,M=100,K=200);
  2. 在 sympy 中定义我的函数 f
  3. 计算 f.diff(w_1)、f.diff(w_2) 等
  4. 从输出中自动推断出 f.diff(w_i) 的通用形式? (通过收集术语或类似的东西)?

我已经在手动执行步骤 4,将导数分解为更简单的术语以使其更具可读性,然后寻找“模式”。我正在使用此代码 taken from this answer为了便于阅读:

tmpsyms = numbered_symbols("tmp")
symbols_list, assignements = cse((grad_0), symbols=tmpsyms)
for (symb, ass) in symbols_list:
print (str(symb) + ' = ' + str(ass))
print(assignements)

最佳答案

您可以使用 SymPy 1.0 版中引入的新张量数组模块。

我想你的KM参数是数字,而不是符号(否则我建议使用sympy.tensor.Indexed )。

考虑这个例子:X 是两个向量的数组,每个向量的长度为 3。因此 X 是一个秩为 2、形状为 (2, 3) 的张量。我还选择了一个简单的带有符号的权重向量示例:

In [1]: from sympy import *
In [2]: from sympy.tensor.array import *

In [3]: var("a,b,c,d,e,f")
Out[3]: (a, b, c, d, e, f)

In [4]: X = Array([[a, b, c], [d, e, f]])

In [5]: var("w1,w2,w3")
Out[5]: (w1, w2, w3)

In [6]: W = Array([w1, w2, w3])

现在创建一个具有三个索引的乘积张量(2 个来自 X,1 个来自 W):

In [7]: tp = tensorproduct(X, W)

In [8]: tp
Out[8]: [[[a*w1, a*w2, a*w3], [b*w1, b*w2, b*w3], [c*w1, c*w2, c*w3]], [[d*w1, d*w2, d*w3], [e*w1, e*w2, e*w3], [f*w1, f*w2, f*w3]]]

In [9]: tp.shape
Out[9]: (2, 3, 3)

让我们对第二个和第三个索引(Python 表示法中的索引 1 和 2,因为索引从零开始)求和,这相当于您所说的乘积:

In [10]: tensorcontraction(tp, (1, 2))
Out[10]: [a*w1 + b*w2 + c*w3, d*w1 + e*w2 + f*w3]

相同的表达式可以求和:

In [12]: stc = sum(tensorcontraction(tp, (1, 2)))

In [13]: stc
Out[13]: a*w1 + b*w2 + c*w3 + d*w1 + e*w2 + f*w3

对于数组的导数,您可以使用 derive_by_array(...)。它将创建一个更高阶的张量,其每个分量均由后一个参数的分量派生:

In [14]: derive_by_array(stc, W)
Out[14]: [a + d, b + e, c + f]

编辑

由于现在已经指定参数MK是符号性的,所以我将添加这部分。

声明XWIndexBase:

In [1]: X = IndexedBase("X")

In [2]: W = IndexedBase("W")

In [3]: var("i,j,M,K", integer=True)
Out[3]: (i, j, M, K)

您的表达式是索引 ij 的乘积 X W 之和,表示如下:

In [4]: s = Sum(X[i, j]*W[j], (i, 1, M), (j, 1, K))

In [5]: s
Out[5]:
K M
___ ___
╲ ╲
╲ ╲ W[j]⋅X[i, j]
╱ ╱
╱ ╱
‾‾‾ ‾‾‾
j = 1 i = 1

现在,我们可以派生 s.diff(W[j]) 或使用不同的索引 s.diff(W[k]),不幸的是,这还没有尚未在 SymPy 中实现。github上有一个PR,它将添加对索引对象的导数的支持,但到目前为止尚未合并: https://github.com/sympy/sympy/pull/9314

关于参数大小向量的python符号求和与微分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com