2015-11-21 129 views
1

我正在嘗試使用CVXPY來模擬一個精確的行搜索實驗。最小化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) enter image description here

上述等式是我的輸入目標函數。

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「步長」在一個錯誤「AddExpression」對象有沒有屬性「登錄」最小化目標函數的結果。

我是CVXPY和優化的新手。如果有人能指導如何解決錯誤,我將不勝感激。

感謝

回答

2

您需要使用CVXPY功能,不NumPy的功能。像這樣的東西應該工作:

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