2016-12-14 13 views
0

매트릭스를 곱할 때 잔차의 합을 최소화하는 벡터를 찾으려고합니다.함수를 최소화하는 최적의 벡터 찾기

scipy의 최적화 패키지 (최소화 기능이 있음)에 대해 알고 있습니다. 그러나, 내 코드에 대한 추가 제한이 있습니다. w의 모든 항목의 합계 (아래 함수 참조)는 1이어야하며 w의 항목은 0보다 작을 수 없습니다. 나를 위해이 작업을 수행하는 패키지가 있습니까? 그렇지 않은 경우 어떻게해야합니까?

def w_rss(w,x0,x1): 
    predictions = np.dot(x0,w) 
    errors = x1 - predictions 
    rss = np.dot(errors.transpose(),errors).item(0) 

    return rss 

X0 = np.array([[3,4,5,3], 
       [1,2,2,4], 
       [6,5,3,7], 
       [1,0,5,2]]) 

X1 = np.array([[4], 
       [2], 
       [4], 
       [2]]) 

W = np.array([[.0], 
       [.5], 
       [.5], 
       [.0]]) 

print w_rss(W,X0,X1) 

지금까지이 w의 가능한 값을 통해 루프에서 최선 시도하지만 제대로 작동하지 않습니다 : w를 최소화하기 위해 노력

.

def get_w(x0,x1): 

J = x0.shape[1] 
W0 = np.matrix([[1.0/J]*J]).transpose() 
rss0 = w_rss(W0,x0,x1) 
loop = range(J) 
for i in loop: 
    W1 = W0 
    rss1 = rss0 
    while rss0 == rss1: 
     den = len(loop)-1 
     W1[i][0] += 0.01 
     for j in loop: 
      if i == j: 
       continue 
      W1[j][0] -= 0.01/den 
      if W1[j][0] <= 0: 
       loop.remove(j) 
     rss1 = w_rss(W1,x0,x1) 
     if rss1 < rss0: 
      #print W1 
      W0 = W1 
      rss0 = rss1 
     print '--' 
     print rss0 
     print W0 

return W0,rss0 
+0

입니다 이를 위해 QP (2 차 프로그래밍) 솔버를 사용하십시오. –

+0

나는 scipy.optimize에서 이것을 시도했다 : cons = ({ 'type': 'eq', 'fun': lambda x : 1 - sum (x)}) {{NEW LINE}} bnds = tuple ((0,1 (W, X1, args = (V, X0, X1), method = 'SLSQP', bounds = bnds, constraints = cons). 해결책이 잘못되었습니다. –

+0

이것은 일반적인 목적의 NLP 솔버입니다. 제대로 설정된 문제와 함께 작동해야하지만 실제 QP 솔버를 사용하는 것이 좋습니다. –

답변

2

scipy의 SLSQP 코드는이 작업을 수행 할 수 있습니다. scipy.optimize.minimizemethod='SLSQP과 함께 사용하거나 fmin_slsqp 함수를 직접 사용할 수 있습니다. 다음에서는 fmin_slsqp을 사용합니다. 이제 (

scipy 솔버

일반적 I가 WX1은 1 차원 배열로 변경되며 그래서 일치하는 목적 함수에 일차원 어레이를 전달하고, I는 목적 함수를 작성할 것이다 w_rss1)는 1-d 인수 인 w을 기대합니다.

w의 모든 요소가 bounds 인수를 사용하여 지정되는 0과 1 사이 여야한다는 조건 및 합계가 1이 f_eqcons 인수를 이용하여 지정되어 있어야하는 조건. 제약 함수는 np.sum(w) - 1를 반환하기 때문에 요소의 합이 여기 1.

입니다 코드의 경우는 0 :이 프로그램을 실행할 때

import numpy as np 
from scipy.optimize import fmin_slsqp 


def w_rss1(w, x0, x1): 
    predictions = np.dot(x0, w) 
    errors = x1 - predictions 
    rss = (errors**2).sum() 
    return rss 


def sum1constraint(w, x0, x1): 
    return np.sum(w) - 1 


X0 = np.array([[3,4,5,3], 
       [1,2,2,4], 
       [6,5,3,7], 
       [1,0,5,2]]) 

X1 = np.array([4, 2, 4, 2]) 

W = np.array([.0, .5, .5, .0]) 

result = fmin_slsqp(w_rss1, W, f_eqcons=sum1constraint, bounds=[(0.0, 1.0)]*len(W), 
        args=(X0, X1), disp=False, full_output=True) 
Wopt, fW, its, imode, smode = result 

if imode != 0: 
    print("Optimization failed: " + smode) 
else: 
    print(Wopt) 

, 출력 할 수

[ 0.05172414 0.55172414 0.39655172 0.  ]