Python fmin\u ncg不支持的操作数类型错误
所以我有一个成本函数,我正试图用scipy.optimize中的fmin_ncg最小化。如果我只运行一次,它似乎可以正常工作,但我还编写了一个引导脚本,它可以对数据进行重新采样,并反复最小化成本函数以计算置信区间。经过几次引导脚本迭代后,我得到以下错误。信息量不大。有人知道它可能来自哪里吗Python fmin\u ncg不支持的操作数类型错误,python,optimization,scipy,Python,Optimization,Scipy,所以我有一个成本函数,我正试图用scipy.optimize中的fmin_ncg最小化。如果我只运行一次,它似乎可以正常工作,但我还编写了一个引导脚本,它可以对数据进行重新采样,并反复最小化成本函数以计算置信区间。经过几次引导脚本迭代后,我得到以下错误。信息量不大。有人知道它可能来自哪里吗 Traceback (most recent call last): File "bootstrap.py", line 97, in <module> main(rat, clust
Traceback (most recent call last):
File "bootstrap.py", line 97, in <module>
main(rat, cluster_parameter.main)
File "bootstrap.py", line 83, in main
t, i = estimator(resampled_data, RAT_CLUSTERS[rat])
File "/home/matthew/Dropbox/Work/vocalization_analysis/cluster_parameter.py", line 176, in main
args=(included_clusters,jumps), avextol=1e-5)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1252, in fmin_ncg
callback=callback, **opts)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1365, in _minimize_newtoncg
update = alphak * pk
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
这是它的导数
def dcost(x, *args):
theta = x[0]
b = x[1]
included_clusters = args[0]
jumps = args[1]
h = [(n, SLOPES[n](theta)) for n in included_clusters]
h = OrderedDict(h)
dh = [(n, DSLOPES[n](theta)) for n in included_clusters]
dh = OrderedDict(dh)
bisecting_slopes= find_bisector(h)
vertices = polygon_vertices(bisecting_slopes, included_clusters)
cluster = poly_cluster(jumps[:,0:2], vertices)
dcost_theta = 0
dcost_b = 0
for c in h.keys():
idx = find(cluster==c)
l = len(jumps[idx,0:2])
for j in jumps[idx,0:2]:
x = (j[0] / h[c] + j[1] - b) / (h[c] + 1 / h[c])
y = h[c] * x + b
dx_theta = ((h[c]**2 + 1) * (j[1] - b) * dh[c] -
2 * (j[0] + (j[1] - b) * h[c]) * h[c] * dh[c]) / (h[c]**2 + 1)**2
dy_theta = ((h[c]**2 + 1) * (j[0] * dh[c] + 2 * (j[1] - b) * h[c] * dh[c])
- 2 * (j[0] * h[c] + (j[1] - b) * h[c]**2) * h[c] * dh[c]) / (h[c]**2 + 1)**2
dx_b = -h[c] / (h[c]**2 + 1)
dy_b = -h[c]**2 / (h[c]**2 + 1)
dcost_theta += (2 * (j[0] - x) * dx_theta
+ 2 * ((j[1] - b) - y) * dy_theta) / l
dcost_b += (2 * (j[0] - x) * dx_b
+ 2 * ((j[1] - b) - y) * dy_b) / l
return np.array([dcost_theta, dcost_b])
这也是我的主要功能。它只是叫fmin_ncg
def main(jumps, included_clusters = range(NUM_CLUSTERS)):
theta_min, b_min = fmin_ncg(f=cost, x0=[0,0], fprime=dcost,
args=(jumps, included_clusters), avextol=1e-5, disp=0)
return theta_min, b_min
如果你想查看节目的其余部分,你可以在这里和这里 就您而言,这似乎是一个重要的声明
File "bootstrap.py", line 97, in <module>
main(rat, cluster_parameter.main)
文件“bootstrap.py”,第97行,在
main(rat,集群_参数.main)
这意味着错误不是在定义的函数中发生,而是在尝试获取参数时在主函数中发生。请显示主程序以及如何调用该程序。似乎你的论点是无效的。argparse(如果您有Python 2.6.7,则为optparse)可能在这里作为设置的一部分很有用。您有什么Scipy版本?IIRC,这是一个已经修复的错误。然而,如果是这样的话,失败是因为fmin_ncg没有找到一个可接受的下降方向——升级Scipy在这里对您没有帮助,因为算法随后报告它没有收敛到一个可接受的解决方案。我会仔细检查导数函数的正确性,因为错误的梯度会导致这种类型的问题。我有scipy版本0.12.0。我可以再次检查,但我觉得导数函数是正确的。当我运行bootstrap算法时,我多次调用fmin_ncg。直到我第30次或第40次调用它时,才会抛出错误。我建议您编辑主代码,使其具有前导空格,并以更易读的方式显示。另外,演示如何从命令行调用它。我在原来的帖子中添加了main函数。它所做的一切叫做fmin_ncg。
File "bootstrap.py", line 97, in <module>
main(rat, cluster_parameter.main)