2016-11-11 457 views
0

我有一個python算法,它工作得很好。我輸入一個最小關鍵詞(「MinScore」),算法運行並預設結果。典型的MinScore值在0.2到0.99之間。Python Scipy的優化錯誤「ValueError:長度必須匹配比較」

但是爲什麼我使用scipy優化來嘗試找到MinScore值的最低算法輸出,出現以下錯誤:「ValueError:長度必須匹配才能比較」。

這是我如何調用優化功能:

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

這是從優化過程中的algorthim錯誤:

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的值時,它可以完美工作。

期待您的建議! :-)

回答

0

好吧,我想我在這裏找到了根本原因。

docs指出scipy.optimize.minimize返回表示爲OptimizeResult對象的優化結果。重要的屬性是:x解決方案數組。

在您的示例中,Optimal_Score是一個對象。我懷疑你試圖將Optimal_Score.x作爲float傳遞給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) 

這將返回大熊貓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] 
+0

感謝Vtour,但是where語句運行良好,我已經運行了很多次了,並且有了工作數據。我認爲問題出在我的scipy功能上? – cwse

+0

錯誤表示您在聲明中比較了不同的長度: BRMalg股票[股票] ['持有'] =(股票[股票] ['持有']其中(股票[股票] ['TOTAL_SCORE_'+ MarketIndex +' _'+ str(BetaWindow)]。shift(1) 2016-11-11 03:58:16

+0

感謝Vtour,這看起來像你可能正在做的事!目前在夏威夷,但將檢查我的回報:-) – cwse

相關問題