4

最终,我想删除下面代码中的所有显式循环,以利用 C 而不是 python 中的 numpy 矢量化和函数调用。

下面简化了 numpy 在 python 中的使用。我有以下二次函数:

def quadratic_func(a,b,c,x):
    return a*x*x + b*x + c

我正在尝试在给定相同大小的输入数据 x 和输出数据 y 的情况下优化 a、b、c 的选择(当然,这应该通过线性回归来完成……但请幽默)。假设 len(x)=100。易于使用标量 a、b、c 进行矢量化,以获得长度为 100 的结果。

假设我们知道 a,b,c 应该在 [-10,10] 之内,我通过构建一个网格并选择具有最小和平方误差的点进行优化。

a=np.arange(-10.0, 10.01, 2.0)
nodes=np.array(np.meshgrid(a,a,a)).T.reshape(-1,3) #3-d cartesian product with array of nodes

对于 1331 个节点中的每一个,我想计算所有 1331 个长度为 100 的返回值。

res=[]
x=np.random.uniform(-5.0,5.0, 100)
for node in nodes:
    res.append(quadratic_func(*node, x=x))

如何利用广播来获取我的 1331 个项目列表,每个项目都有 100 个值,这些值是在 x 上调用 quadratic_func 的结果?答案必须使用矢量化、广播等来获得我正在寻找的数量级的速度改进。此外,答案必须使用对 quadratic_func 的调用——或更一般地说,my_func(*node, x=x)。

在现实生活中,我正在优化一个非线性函数,该函数甚至不接近凸函数并且具有许多局部最小值。如果我能达到“正确的”局部最小值,这是一个很好的函数形式——我已经知道如何做到这一点,但希望更快地到达那里!

4

1 回答 1

1

一种使用broadcasting和组合的方法np.einsum-

np.einsum('ij,jk->ik',nodes,x**np.array([2,1,0])[:,None])

另一个使用矩阵乘法np.dot-

nodes.dot(x**np.array([2,1,0])[:,None])
于 2016-10-19T20:48:48.450 回答