2017-01-09 12 views
0

過去に最適化を実行するためにPythonを使用しました。しかし、私は現在、目的関数の入力として行列を使用するとともに、個々の要素の値と行列の各行の値の合計に境界を設定しようとしています。問題が発生しています。 wpret - -マトリックスを入力、境界、制約として使用するscipy.optimizeでの問題

具体的には、私は目的関数にObjFunc 3つのパラメータを渡すしたいと思いますし、その後調整することにより、(技術的には、私は-1*ObjFuncの値を最小化することにより機能を最大化しようとしています)この関数の値を最小化しますwの値は、wのすべての要素が[0,1]の範囲内になければならず、wの各行の合計が1になるという制約があります。

私は、私が直面している問題を示すために、以下のコードを書いてください。ご覧のとおり、scipy.opimizeminimize機能を使用しています。問題は、目的関数の最初の行であるx = np.dot(p, w)で始まります。この最適化手順では、行列を1次元ベクトルに平坦化しようとします。最適化を実行せずに関数を呼び出すと発生しない問題です。 bounds = bconstraints = cにもエラーが発生しています。

私はこの最適化にどのように近づいているのかについて基本的な間違いを犯していることを知っており、提供できる洞察力に感謝します。

import numpy as np 
from scipy.optimize import minimize 


def objFunc(w, p, ret): 
    x = np.dot(p, w) 
    y = np.multiply(x, ret) 
    z = np.sum(y, axis=1) 

    r = z.mean() 
    s = z.std() 
    ratio = r/s 

    return -1 * ratio 


# CREATE MATRICES 
# returns, ret, of each of the three assets in the 5 periods 
ret = np.matrix([[0.10, 0.05, -0.03], [0.05, 0.05, 0.50], [0.01, 0.05, -0.10], [0.01, 0.05, 0.40], [1.00, 0.05, -0.20]]) 

# probability, p, of being in each stae {X, Y, Z} in each of the 5 periods 
p = np.matrix([[0,0.5,0.5], [0,0.6,0.4], [0.2,0.4,0.4], [0.3,0.3,0.4], [1,0,0]]) 

# initial equal weights, w 
w = np.matrix([[0.33333,0.33333,0.33333],[0.33333,0.33333,0.33333],[0.33333,0.33333,0.33333]]) 

# OPTIMIZATION 
b = [(0, 1)] 
c = ({'type': 'eq', 'fun': lambda w_: np.sum(w, 1) - 1}) 

result = minimize(objFunc, w, (p, ret), method = 'SLSQP', bounds = b, constraints = c) 

答えて

1

コードを少し掘り下げてください。 minimizeoptimize._minimize._minimize_slsqpとなります。それがまず行うことの一つは、次のとおりです。

x = asfarray(x0).flatten() 

ですから、wの平坦化バージョンで動作するようにあなたのobjFuncを設計する必要があります。その機能の開始時にそれを再構成するだけで十分かもしれません。

私はIPythonセッションからのコードを読んで、あなたもあなたのscipyディレクトリにそれを見つけることができます。

/usr/local/lib/python3.5/dist-packages/scipy/optimize/_minimize.py 
+0

ありがとうございました。それは私が起こったと思ったものですが、そうではないことを望んでいました。あなたは私の懸念を確認しました。とても有難い。 – user180V

関連する問題