scipy遇到一个奇怪的错误,有什么想法吗?

时间:2019-07-05 03:22:03

标签: python numpy scipy

我正在做一个优化项目,但是我遇到了一个很奇怪的scipy错误。在执行了几次目标函数之后,它的参数向量神奇地变成了一个二维数组(但是一直以来都是一个一维数组),而没有任何明确的指令。 有人遇到过同样的事情吗? 这可能是一个严重的错误,还是我应该再次仔细检查我的代码?

我的意思是,如果我的代码中有什么问题,我认为在正确执行几次迭代后,它不会发生任何原因

每次调用目标函数时,我都会打印x及其形状。这是目标功能内的代码

def objective(x, some, other, parameters..):

    print("current x",x)
    print("current x.shape",x.shape)

    some code here...


    score = calculate_objective_function(some_parameters_here...)
    return -score

这是发生了什么

current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
0
current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
1
current x [-2321.83367669 13868.03814803     0.        ]
current x.shape (3,)
2
current x [-2324.45171069 13868.03814803     0.        ]
current x.shape (3,)
3
current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
4
current x [-2323.45171067 13868.03814803     0.        ]
current x.shape (3,)
5
current x [-2322.45171069 13868.03814803     0.        ]
current x.shape (3,)
6
current x [[-2322.8237272  13868.03814803     0.        ]]
current x.shape (1, 3)
Traceback (most recent call last):
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py", line 692, in <module>
    solution = minimize(objective,x0,method='Powell',args= additional_and_point_cloud, callback= callback_fun)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 590, in minimize
    return _minimize_powell(fun, x0, args, callback, **options)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2612, in _minimize_powell
    tol=xtol * 100)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2398, in _linesearch_powell
    alpha_min, fret, iter, num = brent(myfunc, full_output=1, tol=tol)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2109, in brent
    res = _minimize_scalar_brent(func, brack, args, **options)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2141, in _minimize_scalar_brent
    brent.optimize()
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 1992, in optimize
    fu = func(*((u,) + self.args))      # calculate new output value
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2397, in myfunc
    return func(p + alpha*xi)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 326, in function_wrapper
    return function(*(wrapper_args + args))
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py", line 550, in objective
    centroid = image_coordinate_from_world_coordinate(np.array([x[0],x[1]]),scale_factor,min_point_world)
IndexError: index 1 is out of bounds for axis 0 with size 1

Process finished with exit code 1

the screenshot of the bug

更新:@HYRY的答案解决了问题。我的分数计算函数返回一个1 * 1 numpy矩阵,而不是缩放器。投射为浮动后,它会按预期工作。

1 个答案:

答案 0 :(得分:0)

也许返回的得分值不是标量值,例如:

import numpy as np
from scipy import optimize

cnt = 0
def f(x):
    global cnt
    print(x.shape)
    cnt += 1
    if cnt < 10:
        return np.sum(x**2)
    else:
        e = np.full((1, 1), fill_value=np.sum(x**2))
        return e

optimize.minimize(f, [0, 0, 1], method="powell")