【问题标题】:Python Scipy Optimize Error "ValueError: Lengths must match to compare"Python Scipy 优化错误“ValueError:长度必须匹配才能比较”
【发布时间】:2017-03-25 05:26:16
【问题描述】:

我有一个运行良好的 python 算法。我输入一个最小标准(“MinScore”),算法运行并预测结果。典型的 MinScore 值介于 0.2 和 0.99 之间。

但是为什么我使用 scipy optimize 来尝试找到 MinScore 值的最低算法输出,我收到以下错误:“ValueError: Lengths must match to compare”。

这就是我调用优化函数的方式:

Optimal_Score = spo.minimize(BRMalg, 0.81, method='SLSQP',
options={'disp':True}, bounds=[(-1.00,1.00)])

这是优化过程中出现算法错误的地方:

MinHoldScore = MinScore
Stocks['HOLD'] = (Stocks['HOLD'].where(Stocks['Total Score'].shift(1) < MinScore, True).where(Stocks['Total Score'].shift(1) >= MinHoldScore, False).ffill().fillna(False).astype(bool))

这是完整的错误信息:

> Traceback (most recent call last):
File "\\PYTHON CODE.py", line 327, in <module>
> Optimal_Score = spo.minimize(BRMalg, 0.81, method='SLSQP', options={'disp':True}, bounds=[(-1.00,1.00)])   
File "C:\\scipy\optimize\_minimize.py",
> line 455, in minimize constraints, callback=callback, **options)   
File "C:\Users\\scipy\optimize\slsqp.py",
> line 363, in _minimize_slsqp fx = func(x)   
File "C:\Users\\scipy\optimize\optimize.py",
> line 289, in function_wrapper return function(*(wrapper_args + args))
File "T:\\PYTHON CODE.py", line 288, in BRMalg
> Stocks[Ticker]['HOLD'] = (Stocks[Ticker]['HOLD'].where(Stocks[Ticker]['TOTAL_SCORE_'+MarketIndex+'_'+str(BetaWindow)].shift(1) < MinBuyScore, True)
File "C:\Users\\pandas\core\ops.py", 
> line 740, in wrapper raise ValueError('Lengths must match to compare') ValueError: Lengths must match to compare

有什么想法吗?很奇怪,当不使用 SCIPY OPTIMIZE 并且只传递一个 MinScore = 0.82 的值时,这一切都可以完美运行。

期待您的建议! :-)

【问题讨论】:

    标签: python pandas optimization scipy minimize


    【解决方案1】:

    好的,我想我在这里找到了根本原因。

    scipy.optimize.minimize 返回表示为 OptimizeResult 对象的优化结果的docs 状态。重要的属性是:x 解决方案数组。

    在您的示例中,Optimal_Score 是一个对象。我怀疑你试图将 Optimal_Score.x 作为浮点数传递给 MinBuyValue,但它实际上是一个列表。

    让我用一个玩具版来说明。

    BRMalg = lambda x: 1 + x + x ** 2 - x ** 3
    Optimal_Score = minimize(BRMalg, 0.5, method='SLSQP', options={'disp': True}, bounds=[(-1.00, 1.00)])
    print(Optimal_Score.x)
    adict = {'Ticker': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'],
             'Total_Score': [1, 2, 3, 4, 5, 6],
             'HOLD': [False, False, False, False, False, False]}
    Stocks = pd.DataFrame(adict)
    Stocks.set_index('Ticker', inplace=True)
    Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x, True)
    

    这会返回 pandas ValueError:

    Optimization terminated successfully.    (Exit mode 0)
    Traceback (most recent call last):
    Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x, True)
    File "\pandas\core\ops.py", line 822, in wrapper raise ValueError('Lengths must match to compare')
    ValueError: Lengths must match to compare
    [-0.33315628]
    Process finished with exit code 1
    

    如果我们从列表“Optimal_Score.x”中索引浮点数,问题就解决了。

    Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x[0], True)
    Optimization terminated successfully.    (Exit mode 0)
            Current function value: [ 0.81481488]
            Iterations: 7
            Function evaluations: 21
            Gradient evaluations: 7
    [-0.33315628]
    

    【讨论】:

    • 感谢 Vtour,但是 where 语句工作得非常好,我已经用工作数据运行了很多次。我认为问题出在我的 scipy 函数上?
    • 错误表示您在语句中比较不同的长度:BRMalg Stocks[Ticker]['HOLD'] = (Stocks[Ticker] ['HOLD'].where(Stocks[Ticker][' TOTAL_SCORE_'+MarketIndex+'_'+str(BetaWindow)].shift(1)
    • 感谢 Vtour,这看起来你可能正在做某事!目前在夏威夷,但会检查我的回报:-)
    • 嘿@cwse,这最终解决了问题吗?如果是,请将此回复标记为已回答您的问题(:
    • 嗨 Fuzzy,我刚回来。尝试了您的解决方案,但没有奏效。排序似乎有问题。 Stocks[Hold}... 位于 BRMalg 内部(它是算法的一部分),因此您以后无法拥有它。当我尝试在算法中执行 x[0] 以进行优化时,它会出错(TypeError: 'float' object is not subscriptable)
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2016-04-07
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2020-07-13
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多