문제

나는 최적화를 처음 접했다. 나는 fmin_slsqp 기능 scipy.optimize.

나는 객관적인 기능이 Frobenius Norm의 Of의 기능을 가지고 있습니다 |q0_T*P-q1_T| 제곱, 어디 q0_T a nX1 벡터 및 P ~이다 nXn 매트릭스와 q1_T a nX1 벡터. 이것은 기본적으로 Markov 프로세스입니다 q 상태에있을 확률로서의 벡터 P 전이 확률의 매트릭스입니다.

목적 함수는 최소화 된 WRT입니다 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이기 때문에 초기 추측을 위해 2D 배열이 필요합니다. 문제를 올바르게 프레임하고 있는지 확실하지 않습니다. 그렇지 않으면 다른 기능을 사용해야합니다. 감사.

도움이 되었습니까?

해결책

따라서 독립 변수로서 1D 배열 만 허용한다는 문제가 있습니다. 하나의 해킹 솔루션은 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