私は比較的単純な最適化の問題を抱えていますが、scipy に特に精通しておらず、必要な制約を適用する方法を理解できません。私の目的関数は、10 要素ベクトルyとxの間の絶対距離を最小化することです。ここで、xは 10x3 パラメーター行列pの加重行合計です。
x = p[:,0] + 2 * p[:,1] + 3 * p[:,2]
パラメータ行列pに次の制約を追加する必要があります。
- pの各要素、ただし >=0 および <=1 である
- pの各列の合計は1 でなければなりません
- pの各行の合計は1 を超えてはなりません
私は他の SO の質問に基づいて制約を実装しようとしましたが、それを完全には理解していないことも、それが生成するエラーも認めていません。
# import packages
import numpy as np
from scipy.optimize import minimize
# create objective function
def objective(p, y):
x = p[:,0] + 2*p[:,1] + 3*p[:,2]
return np.sum(np.abs(y-x))
# define constraints
cons = [{'type':'ineq', 'fun': lambda x: x},
{'type':'ineq', 'fun': lambda x: np.sum(x, 0)}, # row sum >= 0
{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 0)}, # row sum <= 1
{'type':'ineq', 'fun': lambda x: np.sum(x, 1) - 1}, # row sum >= 1
{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 1)}] # row sum <= 1
# generate target data (y)
y = np.array([2.48, 1.75, 1.13, 0.20, 0.20, 0.20, 0.0, 0.0, 0.0, 0.0])
# initialise starting param values
p0 = np.zeros((44,3))
p0[:,:] = 1/44
# solve
sol = minimize(objective, p0, method='SLSQP', constraints=cons)
このコードを実行すると、次のエラー メッセージが表示されます。
AxisError: 軸 1 は次元 1 の配列の範囲外です
どんな助けでも大歓迎です。