Python将对象作为arg传递给minimize()

时间:2014-05-27 08:01:56

标签: python scipy

我试图将对象作为额外参数传递给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 个答案:

答案 0 :(得分:1)

args=(mysvc)需要逗号来制作元组:args=(mysvc,)

Tutorial 5.3. Tuples and Sequences

  

通过使用逗号跟随值来构造具有一个项目的元组(仅在括号中包含单个值是不够的)。丑陋但有效。