【问题标题】:Numpy: How to vectorize parameters of a functional form of a function applied to a data setNumpy:如何向量化应用于数据集的函数的函数形式的参数
【发布时间】:2016-10-19 20:27:52
【问题描述】:

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

下面简化了 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)。

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

【问题讨论】:

    标签: python performance numpy vectorization array-broadcasting


    【解决方案1】:

    结合使用broadcastingnp.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])
    

    【讨论】:

    • 我明白你在做什么,但是寻找比这更普遍的东西——我不想知道这个函数是什么先验的。我希望能够将我最终要优化参数的目标函数传递到我的优化器中,我不能假设函数形式将是多项式、sqrts、对数等的某种组合。你能用quadratic_func 的调用?
    • @FinanceGuyThatCantCode 是的,这就是 NumPy 矢量化的问题,没有一种方法可以采用任何通用函数并加速它。如果使用某些无法转换为 NumPy func 或 ufunc 的特定功能,您可以查看 cython 或 numba。
    • 我想这就是我自己无法弄清楚的原因!不过,这将是一个不错的功能....而且我想我可以问今天在我办公室的 Continuum 人!
    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2021-01-10
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多