Я пытаюсь найти вектор, который минимизирует остаточную сумму квадратов при умножении матрицы.Найти оптимальный вектор, который минимизирует функцию
Я знаю, как оптимизировать пакет 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)
До сих пор это моя лучшая попытка циклически возможных значений ш, но она не работает должным образом.
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 (квадратичного программирования). –
Я пробовал это в scipy.optimize: cons = ({'type': 'eq', 'fun': lambda x: 1 - sum (x)}) {{NEW LINE}} bnds = tuple ((0,1) для x в W) {{NEW LINE}} Свернуть (w_rss, W1, args = (V, X0, X1), метод = 'SLSQP', bounds = bnds, constraints = cons). Решение было неверным. –
Это универсальный решатель NLP. Он должен работать с правильно настроенной проблемой, но я бы рекомендовал использовать реальный решатель QP. –