Pakonigoosy
@Pakonigoosy
Разработчик ПО

Как найти линейную комбинацию векторов которая будет ближе всего к заданной?

У меня есть несколько векторов размерности (1х44) (вектора a1, a2, a3 ..., a_k). В дальнейшем буду говорить что n=44
Также у меня есть вектор b такой же размерности (1хn)
Я хочу построить линейную комбинацию векторов, которая будет ближе всего к b.
То есть c1a1+c2a2+c3a3 + ... + c_n*a_n должно быть как можно ближе к b

И в общем случае это решается построением СЛАУ и решением ее, но есть проблемы:

1) k необязательно равно n
2) Векторы необязательно линейно независимы между собой
3) Самое главное условие - c1>0, c2>0, c3>0

Я пробовал ввести функцию (|c1a1+c2a2+...+c_n*a_n - b|)^2 и найти ее минимум следующим образом:
def target_function(x):
    q = np.matmul(A, abs(x)) - b #A - это матрица из векторов a_i
    return np.linalg.norm(q)**2
result=scipy.optimize.minimize(target_function, np.ones((1,44))*100)


Однако мне выдается ошибка
message: Desired error not necessarily achieved due to precision loss.
  success: False
   status: 2
      fun: 2957333486771.303
        x: [ 2.132e+01  1.000e+02 ...  1.611e+02  5.252e+01]
      nit: 7
      jac: [ 2.172e+09  0.000e+00 ...  7.294e+07  1.483e+08]
 hess_inv: [[ 1.001e+00  0.000e+00 ... -1.260e-01 -6.809e-02]
            [ 0.000e+00  1.000e+00 ...  0.000e+00  0.000e+00]
            ...
            [-1.260e-01  0.000e+00 ...  1.159e+00  5.356e-02]
            [-6.809e-02  0.000e+00 ...  5.356e-02  8.509e-01]]
     nfev: 4238
     njev: 94


Не знаю, что делать. Может есть варианты попроще, чем я придумал?
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Это получается задача квадратичного программирования. Ищите специализированный метод в scipy. Может вот это сработает.

Ваша попытка использовать обобщенный оптимизатор похоже не работает, потому что у вас функция не дифферинцируема в нулях x из-за abs.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы