質問

これまで最適化。っ線形最小二乗問題の fmin_slsqp 機能 scipy.optimize.

私の目標として機能し、フロベニウスノルムの |q0_T*P-q1_T| 乗場 q0_T に置き換の nX1 ベクター PnXn マトリックス q1_T あの転置 nX1 ベクトルとなっています。これは基本的にマルコフ過程 q ベクターとしての可ている状態で、 P のマトリクスの遷移確率.

目的関数が最小化されました。r.t P の制約について:

1)全ての要素について P されます

2)すべての行 P な和1

いて定義され、この目的の機能あるいは修正:

def func(P, q):
  return (np.linalg.norm(np.dot(transpose(q[0,]),P)-transpose(q[1,])))**2

第二引数にfmin_slsqpをお願いし1D ndarray x0の初期推定のための独立変数となります。しかし、この国では、私の独立変数がP,っていなければいけないと考えて2次元配列のための最初のようですね。いていただく場合問題を正しくやって使う機能です。感謝。

役に立ちましたか?

解決

い問題でのみ受け付ける1次元配列としての独立変数、hackishいることでしょうがいいのでし1d、"カギ不要期間"の機能です。

import numpy as np
from scipy.optimize import fmin_slsqp

# some fake data
d = 3 # dimensionality of the problem
P0 = np.arange(d*d).reshape(d, d)
P0 /= P0.sum(1, keepdims=True) # so that each row sums to 1
q = np.random.rand(2, d)       # assuming this is the structure of your q
q /= q.sum(1, keepdims=True)

# the function to minimize
def func(P, q):
    n = q.shape[-1] # or n = np.sqrt(P.size)
    P = P.reshape(n, n)
    return np.linalg.norm(np.dot(q[0], P) - q[1])**2  # no changes here, just simplified syntax

def row_sum(P0, q):
    """ row sums - 1 are zero """
    n = np.sqrt(P0.size)
    return P0.reshape(n,n).sum(1) - 1.

def non_neg(P0, q):
    """ all elements >= 0 """
    return P0

P_opt = fmin_slsqp(func, P0.ravel(), args=(q,), f_eqcons=row_sum, f_ieqcons=non_neg).reshape(d, d)

assert np.allclose(P_opt.sum(1), 1)
assert np.all(P_opt >= 0)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top