0

私は比較的単純な最適化の問題を抱えていますが、scipy に特に精通しておらず、必要な制約を適用する方法を理解できません。私の目的関数は、10 要素ベクトルyxの間の絶対距離を最小化することです。ここで、xは 10x3 パラメーター行列pの加重行合計です。

x = p[:,0] + 2 * p[:,1] + 3 * p[:,2]

パラメータ行列pに次の制約を追加する必要があります。

  1. pの各要素、ただし >=0 および <=1 である
  2. pの各列の合計は1 でなければなりません
  3. 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 の配列の範囲外です

どんな助けでも大歓迎です。

4

2 に答える 2