2

CVXPY を使用して正確なライン検索実験をシミュレートしようとしています。

objective = cvx.Minimize(func(x+s*grad(x))) 
s = cvx.Variable()
constraints = [ s >= 0]
prob = cvx.Problem(objective, constraints)
obj = cvx.Minimize(prob)

(cvxbook byod pg472) ここに画像の説明を入力

上記の式は、私の入力目的関数です。

def func(x):
np.random.seed(1235813)
A = np.asmatrix(np.random.randint(-1,1, size=(n, m)))
b = np.asmatrix(np.random.randint(50,100,size=(m,1)))
c = np.asmatrix(np.random.randint(1,50,size=(n,1)))
fx = c.transpose()*x - sum(np.log((b - A.transpose()* x)))
return fx

勾配関数

def grad(x):
np.random.seed(1235813)
A = np.asmatrix(np.random.randint(-1,1, size=(n, m)))
b = np.asmatrix(np.random.randint(50,100,size=(m,1)))
c = np.asmatrix(np.random.randint(1,50,size=(n,1)))
gradient = A * (1.0/(b - A.transpose()*x)) + c
return gradient

これを使用して、目的関数を最小化することで t "Step Size" を見つけると、エラー 'AddExpression' object has no attribute 'log' が発生します。

CVXPY と最適化は初めてです。誰かがエラーを修正する方法を教えていただければ幸いです。

ありがとう

4

1 に答える 1

4

NumPy 関数ではなく、CVXPY 関数を使用する必要があります。このようなものが動作するはずです:

def func(x):
   np.random.seed(1235813)
   A = np.asmatrix(np.random.randint(-1,1, size=(n, m)))
   b = np.asmatrix(np.random.randint(50,100,size=(m,1)))
   c = np.asmatrix(np.random.randint(1,50,size=(n,1)))
   fx = c.transpose()*x - cvxpy.sum_entries(cvxpy.log((b - A.transpose()* x)))
   return fx
于 2016-04-25T03:47:45.643 に答える