매트릭스를 곱할 때 잔차의 합을 최소화하는 벡터를 찾으려고합니다.함수를 최소화하는 최적의 벡터 찾기
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
입니다 이를 위해 QP (2 차 프로그래밍) 솔버를 사용하십시오. –
나는 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). 해결책이 잘못되었습니다. –
이것은 일반적인 목적의 NLP 솔버입니다. 제대로 설정된 문제와 함께 작동해야하지만 실제 QP 솔버를 사용하는 것이 좋습니다. –