问题描述
我正在尝试学习如何使用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'})