有没有可能用NumPy(和SciPy)对元素优化进行矢量化(或者加速)?你知道吗
在最抽象的意义上,我有一个函数,y,它是抛物线形状的,基本上可以表示为y=x^2+b*x+z
,其中x是一个已知值的数组,我想找到一个z,使y的最小值正好为零(换句话说,我想找到一个z,使我的抛物线只有一个零)。为此,我选择实现一个简单的二等分方法。代码如下:
import numpy as np
def find_single_root():
x = np.arange(-5, 6,0.1) # domain
z = 1 # initial guess
delta = 1 # initial step size
tol = 0.001 # tolerance
while True:
y = x**2-5*x+z
minimum = np.nanmin(y)
# update z
print(delta)
print(z)
if minimum > 0:
if delta > 0:
delta = -1*delta/2
z += delta
else:
if delta < 0:
delta = -1*delta/2
z += delta
# check if step is smaller than tolerance
if np.abs(delta) < tol:
return z
现在假设x(v,w),我想创建一个z值的2D数组,每个值都经过优化。下面是我现在看到的(注意,新的函数定义和域如下)
def find_single_root(v, w):
x = np.arange(-5*v/w, 6*w,0.1) # domain
... # rest of the function
vs = np.arange(1,5)
ws = np.arange(1,5)
zs = np.zeros((len(vs),len(ws)))
for i, v in enumerate(vs):
for j, w in enumerate(ws):
zs[i][j] = find_single_root(v,w)
现在我有了这些简单的嵌套for循环,但是有没有一种方法可以用不同的方式来处理这个问题,或者用NumPy矢量化来加速它?你知道吗
当要执行的计算被精确地预先知道时,向量化可适用。比如“取两个数字数组,两两相乘”。你知道吗
当计算适应给定数据时,矢量化不适用。任何一种优化算法都是自适应的,因为在哪里寻找最小值取决于函数返回的结果。如果你有一堆函数,并且需要找到每一个函数的最小值,你就必须一次最小化一个,在一个循环中。如果这个过程很慢,那是因为最小化一堆函数需要很长时间,而不是因为程序中有一个
for
循环。你知道吗关于你的程序,我会尝试使用一些SciPy方法来最小化和寻根。有一个函数} 。然后把
min_of_f(z)
,它为参数z的给定值寻找最小值,可能使用^{min_of_f
喂给root-finding routine。需要多长时间可以由它们的公差参数(xtol和其他)控制。你知道吗操作编辑: 我想承认这是一个正确的答案,但仍然提供更多的信息。你知道吗
最后,我使用^{} 对问题进行了矢量化,而没有重新构造问题。尽管
numpy.vectorize
并不意味着要提高性能,但在我的特定用例中,性能是一个适度的因素,比原来快了两倍。将相同的方法应用于问题中的原始问题,几乎没有加快100x100矢量的速度。你知道吗尽管由于上述答案中给出的原因,我无法从速度方面对这个问题进行矢量化,但是能够在我的代码中使用纯矢量语法而不是嵌套for循环是非常有用的。你知道吗
相关问题 更多 >
编程相关推荐