首页 > 解决方案 > AttributeError: 'set' 对象在调用 scipy 优化器时没有属性 'get'

问题描述

我正在尝试学习如何使用 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--', linewidth=2.0, 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[:,0], l_fit[0] * data[:,0] + l_fit[1], 'r--', linewidth=2.0, 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 = {}, C1 = {}".format(l_fit[0], l_fit[1]))
     54     plt.plot(data[:,0], l_fit[0] * data[:,0] + l_fit[1], 'r--', linewidth=2.0, 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, l, args=(data,), method='SLSQP', 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'

标签: pythonpandasscipy

解决方案


问题是这条线

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

具体来说options={'display=true'},它是 set 类型set,但minimize需要类型dict(根据文档

可能你的意思是options={'display':True}

暗示:

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

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

相反dict,它是空括号{}或逗号分隔的键值对,例如a={1:2, "a":"b"}


推荐阅读