【问题标题】:ValueError: Objective function must return a scalarValueError:目标函数必须返回一个标量
【发布时间】:2018-03-22 11:09:51
【问题描述】:

我正在使用 SciPy 来最小化方差:

port_returns=[]
port_variance=[]
for p in range(4000):
    weights = np.random.random(5)
    weights /=np.sum(weights)
    port_returns.append(np.sum(returns.mean()*245*weights))
    port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*245, weights))))

def min_variance(weights):
    return np.array(port_variance)

cons = {'type':'eq', 'fun':lambda x: np.sum(x)-1}    
bnds = tuple((0,1) for x in range(245))
optv = sco.minimize(min_variance, 245*[1.0/245,], method='SLSQP', 
                    bounds=bnds, constraints=cons)

我尝试运行此函数,但收到以下错误:

File "D:\Python27\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize
  constraints, callback=callback, **options)    
File "D:\Python27\lib\site-packages\scipy\optimize\slsqp.py", line 370, in _minimize_slsqp
  raise ValueError("Objective function must return a scalar")    
ValueError: Objective function must return a scalar

如何返回标量值?

【问题讨论】:

  • 我怎样才能返回一个标量值? 就去做吧 :) 说真的,向我们展示目标函数 min_variance 的实现和输入的数据,然后有人或许能够告诉您如何解决问题。
  • 欢迎来到 Stack Overflow!您可以先take the tour 学习How to Ask a good question 并创建一个Minimal, Complete, and Verifiable 示例。这使我们更容易为您提供帮助。至少,这个问题并没有告诉我们noamin_variance 是什么。
  • "np.array([port_returns,port_variance,port_returns/port_variance])":您需要最小化其中的 一个,而不是全部三个。
  • 即使添加了代码,也很难说出您的最小化变量是什么。它有点像weightsport_variance 是事先计算好的。至于直接错误,min_variance 返回一个数组,而不是单个“成本”值。我怀疑您需要退后一步运行一些演示案例,以便更清楚地了解该函数的作用。

标签: python numpy scipy


【解决方案1】:

将 scipy 升级到 v1.0。这是 0.19 中的一个错误

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2017-08-11
    • 2013-05-04
    相关资源
    最近更新 更多