scipy.optimize.fmin参数理解与正确调用问题咨询
解决scipy.optimize.fmin传参报错的问题
这个问题其实是Python元组定义的常见小坑,结合scipy.optimize.fmin对args参数的要求导致的,我来帮你理清楚:
问题根源
scipy.optimize.fmin的args参数要求必须是元组类型,用来传递目标函数(也就是你的q_learning_model)所需的额外参数。但Python里有个容易忽略的语法细节:
- 如果你写
(data),这不是元组,它等价于直接写data,只是给变量加了括号而已; - 只有当你写成
(data,)(注意末尾的逗号)时,Python才会把它识别为包含单个元素的元组。
你之前尝试直接传args=(data[['choice','reward']]),实际上传递的是一个DataFrame对象,而不是元组。这会导致你的q_learning_model函数在解析args时出错——因为函数里用args[0]来取数据,但此时args本身就是DataFrame,自然没有[0]这个索引(或者索引含义完全不符合预期)。而当你加了空元组x1变成args=(data, x1),这时候是一个二元组,符合fmin对args的要求,所以函数能正常接收参数运行。
正确的调用方式
只需要给单个参数后面加个逗号,让Python把它识别为单元素元组就可以了,不需要额外的空元组:
minimum = optimize.fmin(q_learning_model, x0=(1, 0.1), args=(data[['choice','reward']],))
这样你的q_learning_model函数里,args[0]就会正确指向传入的DataFrame,和你预期的逻辑完全匹配。
额外提示
如果后续你的目标函数需要多个额外参数,比如要传data和另一个参数config,直接写成args=(data, config)就行——这种多元素的情况不需要额外加逗号,Python会自动识别为元组。只有单个参数的时候才需要注意这个逗号的小细节。
内容的提问来源于stack exchange,提问作者M.F
相关产品推荐
相关产品推荐

