Python在minimize()中传递对象作为参数

0 投票
1 回答
1032 浏览
提问于 2025-04-18 07:40

我想把一个对象作为额外的参数传给scipy.optimize.minimize(),但是它说不能传对象。

  def myfun(C,gamma,deg,mysvc):
    from sklearn import cross_validation
    if(mysvc.kernel=="linear"):
       mysvc.C=C
    elif(mysvc.kernel=="rbf" or mysvc.kernel=="sigmoid"):
       mysvc.C=C
       myscv.gamma=gamma
    else: 
       mysvc.deg=deg
    scores = cross_validation.cross_val_score(mysvc,cross[:,:95], cross[:,96], cv=5)
    return mean(scores) 


  from scipy import optimize  
  for mysvc in [gsn,ply,sig,lin]:
    C,gamma,deg=sp.optimize.minimize(fun=myfun,x0=asarray([1,.5,3]),args=(mysvc))
    print [C,gamma,deg]

这个元组不灵活吗?mysvc是来自sklearn的SVC类的一个对象。我遇到了以下错误:

  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "e:\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py",  line 540, in runfile
 execfile(filename, namespace)
 File "C:/Users/sriramana/svm.py", line 43, in <module>
 C,gamma,deg=sp.optimize.minimize(fun=myfun,x0=asarray([1,.5,3]),args=(mysvc))
 File "e:\Anaconda\lib\site-packages\scipy\optimize\_minimize.py", line 372, in minimize
 return _minimize_bfgs(fun, x0, args, jac, callback, **options)
 File "e:\Anaconda\lib\site-packages\scipy\optimize\optimize.py", line 832, in  _minimize_bfgs
 gfk = myfprime(x0)
 File "e:\Anaconda\lib\site-packages\scipy\optimize\optimize.py", line 281, in  function_wrapper
 return function(*(wrapper_args + args))
 File "e:\Anaconda\lib\site-packages\scipy\optimize\optimize.py", line 604, in approx_fprime
 f0 = f(*((xk,) + args))
 File "e:\Anaconda\lib\site-packages\scipy\optimize\optimize.py", line 281, in function_wrapper
 return function(*(wrapper_args + args))
 TypeError: can only concatenate tuple (not "SVC") to tuple  

1 个回答

1

args=(mysvc) 需要一个逗号才能变成一个元组:args=(mysvc,)

教程 5.3. 元组和序列

一个只有一个元素的元组是通过在一个值后面加上逗号来创建的(仅仅把一个值放在括号里是不够的)。虽然看起来不太好,但确实有效。

撰写回答