如何基于numpy数组优化目标函数并解决scipy.brute运行TypeError问题
报错根因
错误来自参数传递的逻辑问题:scipy.optimize.brute的args参数要求传入元组,用于给目标函数传递额外参数。你直接传入numpy数组processed时,底层会把数组按第一维拆分,传入bwp的*processed就变成了由数组每行组成的元组,而非完整的二维numpy数组。元组不支持[i, 3]这种多维索引写法,所以执行到对应代码时就抛出了类型错误。
其他潜在问题
你的循环逻辑里i从0开始遍历,当i=0时processed[i-1,4]会自动取数组最后一行的第5列,如果你不是有意要做循环移位的话,这部分逻辑不符合时间序列取前一行的业务需求。
修复方案
第一步:调整参数传递
调用brute时把processed包装成单元素元组,确保完整传入目标函数。
第二步:调整循环起始值
把循环起始值改成1,避免取i-1=-1的无效索引(若业务确实需要i=0时取数据集最后一行作为前序数据,可保留原range设置)。
第三步(可选):简化目标函数参数写法
去掉*processed的可变参数写法,直接声明为单个参数更清晰,避免后续踩坑。
修复后代码
目标函数
def bwp(x, processed): pred, real = x money = 1000 # 循环从1开始,保证i-1是前一行的有效索引 for i in range(1, len(processed)): if processed[i, 3] > pred and processed[i-1,4] > real: money = money + (money * processed[i, 4]) return money * -1
优化函数
from scipy import optimize def opt_2(processed): bounds = (slice(-1, 1), slice(-1, 1)) # 注意args参数要加逗号包装成单元素元组 resbrute = optimize.brute(bwp, ranges=bounds, args=(processed,), full_output=True, finish=optimize.fmin) print("最优参数:", resbrute[0]) print("最优目标值:", resbrute[1])
内容的提问来源于stack exchange,提问作者tribo32
相关产品推荐
相关产品推荐

