AttributeError:调用scipy优化器时,“设置”对象没有属性“获取”

问题描述

我正在尝试学习如何使用Scipys最小化器,但是执行时不断出现错误'set' object has no attribute 'get' 。该代码的其余部分似乎工作正常,并且除了拟合线l_fit之外,所有内容均已绘制。

很抱歉,很长的代码,但是我不知道可以删除什么来解决这个问题:

import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as spo
import numpy as np

def error(line,data):
    err = np.sum((data[:,1] - (line[0] * data[:,0] + line[1])) ** 2)
    return err

def fit_line(data,error_func):

    # Generate initial guess for line model
    l= np.float32([0,np.mean(data[:,1])]) # slope = 0,intercept = mean( y values)
    
    # Plot initial guess
    x_ends = np.float32([-5,5])
    plt.plot(x_ends,l[0] * x_ends + l[1],'m--',linewidth=2.0,label="Initial guess")
    
    # Call optimizer to minimize error function
    result= spo.minimize(error_func,l,args=(data,),method='SLSQP',options={'display=true'})
    return result.x

def test_run():
    # define original line
    l_orig = np.float32([4,2])
    print("Original line: C0 = {},C1 = {}".format(l_orig[0],l_orig[1]))
    Xorig = np.linspace(0,10,21)
    Yorig = l_orig[0] * Xorig + l_orig[1]
    plt.plot(Xorig,Yorig,'b--',label='Original line')
    
    # Generate noisy data points
    noise_sigma= 3.0
    noise= np.random.normal(0,noise_sigma,Yorig.shape)
    data= np.asarray([Xorig,Yorig + noise]).T
    print(data)
    print(error)
    plt.plot(data[:,0],data[:,1],'go',label='Data points')
    
    # Try to fit a line to this data
    l_fit = fit_line(data,error)
    print("Fitted line: C0 = {},C1 = {}".format(l_fit[0],l_fit[1]))
    plt.plot(data[:,l_fit[0] * data[:,0] + l_fit[1],'r--',label="Fitted line")
    plt.show()

if __name__ == "__main__":
    test_run()

这是我的错误回溯:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-86b5f3cac3d8> in <module>
     56     # show plot
     57 if __name__ == "__main__":
---> 58     test_run()

<ipython-input-12-86b5f3cac3d8> in test_run()
     50 
     51     # Try to fit a line to this data
---> 52     l_fit = fit_line(data,error)
     53     print("Fitted line: C0 = {},l_fit[1]))
     54     plt.plot(data[:,label="Fitted line")

<ipython-input-12-86b5f3cac3d8> in fit_line(data,error_func)
     30 
     31     # Call optimizer to minimize error function
---> 32     result= spo.minimize(error_func,options={'display=true'})
     33     return result.x
     34 

~/opt/anaconda3/envs/futures/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
    544     # - return_all
    545     if (meth in ('l-bfgs-b','tnc','cobyla','slsqp') and
--> 546             options.get('return_all',False)):
    547         warn('Method %s does not support the return_all option.' % method,548              RuntimeWarning)

AttributeError: 'set' object has no attribute 'get'

解决方法

问题是这条线

    result= spo.minimize(error_func,l,args=(data,),method='SLSQP',options={'display=true'})

具体为options={'display=true'},其类型为set,但是minimize要求类型为dict(根据documentation

可能您是说options={'display':True}吗?

提示:

print(type({'display=true'}))
print(type({'display':True}))

'display=true'是单个字符串变量。大括号{...}中的一个值或逗号分隔的值是set的简写,例如a={1,2,3}

dict相反,{}是空括号a={1:2,"a":"b"}或逗号分隔的键值对,例如library(dplyr) original %>% group_by(ID) %>% mutate( Number2 = if_else(Type=="Dead",last(Number[Type=="Live"]),NA_real_))

,

通过字典时,应遵循字典的语法 即{key:value} 在下面一行中将 options = {'display = true'} 更改为 options = {'display':True} ,它应该可以按照您的期望工作。

result= spo.minimize(error_func,options={'display=true'})