Как получить градиент функции от векторов к скалярам? - PullRequest
0 голосов
/ 23 сентября 2018

Для данной функции f: R ^ 600 -> R f(x)=0.5*norm(Ax-b)^2, где A - матрица 400x600, b - 400x1, и оба они заданы.

Как я могу получить gradient(f) при некотором заданном x0 в MATLAB?

m=400
n=600
A=randn(m,n)
b=randn(m,1)

syms x
f= 0.5*norm(A*x-b)^2
gradient(f,x)

Однако это не работает, потому что кажется, что x скаляр, а невектор.

1 Ответ

0 голосов
/ 23 сентября 2018

С учетом функции:

f(x) = \frac{1}{2}\|Ax-b\|^2

градиент просто:

Ax-b

Проверка это для дальнейших деталей.

Следовательно, ваша реализация MATLAB:

g = A'*(A*x-b);

где g - градиент вашей функции для данного x.

Обратите внимание, что A, b и x являются числовыми, а не символическими.

Доказательство

f(x) = \frac{1}{2}\|Ax-b\|^2


Символический подход

Вы можете использовать следующий код:

N = 3;

A = [1 0 1;
     2 1 -1;
     3 1 0];

b = [1;
     2;
     3];

x = sym('x', [N, 1]);

f = 0.5*norm(A*x-b)^2;

g = sym('g', [N, 1]); % g is the gradient of f
for i=1:N
    g(i) = diff(f,x(i));
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...