gpt4 book ai didi

python - Scipy leastsq() 函数开销

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:43 30 4
gpt4 key购买 nike

我正在研究一个图像分析程序,我已经缩小了我的瓶颈,尝试多次将 2D 高斯拟合到一个小窗口 (20x20) 像素。 90% 的执行时间花在这段代码上。

我正在使用 scipy cookbook 中给出的代码来解决这个问题:

   def gaussian(height, center_x, center_y, width_x, width_y):
"""Returns a gaussian function with the given parameters"""
width_x = float(width_x)
width_y = float(width_y)
return lambda x,y: height*exp(
-(((center_x-x)/width_x)**2+((center_y-y)/width_y)**2)/2)


def moments(data):
"""Returns (height, x, y, width_x, width_y)
the gaussian parameters of a 2D distribution by calculating its
moments """
total = data.sum()
X, Y = indices(data.shape)
x = (X*data).sum()/total
y = (Y*data).sum()/total
col = data[:, int(y)]
width_x = sqrt(abs((arange(col.size)-y)**2*col).sum()/col.sum())
row = data[int(x), :]
width_y = sqrt(abs((arange(row.size)-x)**2*row).sum()/row.sum())
height = data.max()
return height, x, y, width_x, width_y


def fitgaussian(data):
"""Returns (height, x, y, width_x, width_y)
the gaussian parameters of a 2D distribution found by a fit"""
params = moments(data)
errorfunction = lambda p: ravel(gaussian(*p)(*indices(data.shape)) -
data)
p, success = optimize.leastsq(errorfunction, params, maxfev=50, ftol=1.49012e-05)
return p

通过组合 errorfunction() 和 gaussian() 函数,我能够将执行时间减半,因此每次 leastsq() 调用 errorfunction() 时,都会有一个函数调用,而不是两个。

这让我相信大部分剩余的执行时间都花在了函数调用开销上,因为 leastsq() 算法调用了 errorfunction()。

有什么办法可以减少这个函数调用的开销吗?我不知所措,因为 leastsq() 将函数作为输入。

如果我的描述令人困惑,我提前道歉,我是一名受过培训的机械工程师,并且我正在学习 Python。如果有任何其他有用的信息,请告诉我。

最佳答案

由于 exp 是单调的,您可以使用高斯的对数作为误差函数,例如

def log_gaussian(height, center_x, center_y, width_x, width_y):
"""Returns a gaussian function with the given parameters"""
width_x = float(width_x)
width_y = float(width_y)
log_height = log(height)
return lambda x,y: (log_height -
(((center_x-x)/width_x)**2 - ((center_y-y)/width_y)**2)/2)

这将导致每次迭代对 log 调用 1 次,而不是每次迭代对每个数据集行调用 1 次 exp。

关于python - Scipy leastsq() 函数开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550145/

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