Как выполнить поиск градиента, чтобы минимизировать согласованность этой матрицы? - PullRequest
0 голосов
/ 04 мая 2019

спасибо, что заглянули в мой вопрос. Я пытаюсь создать функцию, которая принимает в матрице, и через некоторое время возвращает минимальное значение конкретного расчета. Чтобы быть точным, мне нужно то, что называется измерительной матрицей. Эта измерительная матрица A будет выглядеть как [1 cos (t1) cos (t2); 0 грех (t1) грех (t2)]. Входными значениями являются t1 и t2 (тета 1 и тета 2 соответственно, и оба находятся в диапазоне от 0 до 2pi). Это для моего старшего математического проекта. Я начинаю с этого простого случая, а затем отсюда буду делать это для пространства R ^ 3 и R ^ 4.

Эта матрица, которую я использую, называется измерительной матрицей. Затем я беру эту матрицу измерений и рассчитываю ее когерентность, обозначаемую mu (или mu (A)). Поэтому мне нужно mu (A) = max (max (abs (A ’* A - eyes (3)))). Моя цель состоит в том, чтобы свести к минимуму согласованность моей измерительной матрицы A, а затем, получив этот минимум, получить возвращаемую вещь. Я пытаюсь сделать это с помощью конструкции типа поиска с градиентным спуском.

Далее я нахожу вектор градиента мю. Я делаю это, потому что градиент указывает в направлении наибольшего увеличения, так что я просто возьму его отрицательное значение, так что теперь у меня будет направление градиента, указывающее в сторону наибольшего уменьшения. Но чтобы найти градиент, мне нужны частичные, назовите их p1 и p2. Кроме того, мне также нужны два параметра, дельта и лямбда - у меня их просто есть в качестве входных значений (что-то вроде этого: lambda = input ('Введите значение для lambda:')).

Теперь вектор градиента, gradmu, будет выглядеть как [p1, p2], а каждый частичный элемент будет выглядеть как p1 = ((mu (A (t1 + delta, t2))) - (mu (A (t1, t2)))) / delta p2 = ((mu (A (t1, t2 + delta))) - - (mu (A (t1, t2))))) / delta

Возможно, вы задаетесь вопросом об этом лямбда-термине. В моих заметках о том, что я делаю, у меня есть две строки, которые говорят:

t1 = t1 - лямбда * p1

t2 = t2 - лямбда * p2

Но я не совсем уверен, где их поставить, но я знаю, что они важны и их нужно использовать.

Я предполагаю, что у меня может быть (вложенный) цикл Loop или два, чтобы у вас была исходная матрица, а затем для переменных значений тета он вычисляет когерентность A, а затем выплевывает минимум всех вычислений когерентности (что, вероятно, влечет за собой отслеживание всех результатов / итераций и получение наименьшего из них), затем вычисляет частичные значения и затем выплевывает отрицательный градиент. Именно эту функцию, которую я пытаюсь создать, выполняет все вышеперечисленное, но я не знаю, как ее кодировать, хотя и пытаюсь. Вот что у меня есть:

% Parameters

n = 2; % Dimension of space. Specifically we are in R^2
delta = input('Enter small numeric value for delta: '); % The delta 
used in calculating partial derivatives


lambda = input('Enter small numveric value for lambda: '); % Step 
size (learning rate)
max_iter = 10000; % maximum number of iterations
func_tol  = 0.000001 % termination tolerance for what I believe 
will be mu (basing this off of the gradient search algo on the Wiki 
page)

fvals = []; % stores mu values across iterations

A = @(t1, t2) [1 cos(t1) cos(t2); 0 sin(t1) sin(t2)]:
mu = @A max(max(abs(A'*A - eyes(3))));
p1 = ((mu((A(t1+delta, t2))))-(mu(A(t1, t2))))/delta;
p2 = ((mu((A(t1, t2+delta))))-(mu(A(t1, t2))))/delta;


% Iterate
iter = 1;         % iterations counter
fvals(iter) = mu;
while iter < max_iter && fvals(end) > func_tol
    iter = iter + 1;
    t1 = t1 - lambda * p1;  % gradient descent
    t2 = t2 - lambda * p2   % gradient descent

    A = @(t1, t2) [1 cos(t1) cos(t2); 0 sin(t1) sin(t2)]:
    mu = @A max(max(abs(A'*A - eyes(3))));
    disp(min(mu))
end

Мне бы хотелось, чтобы это выглядело как «минимизированная согласованность заключается в следующем, и именно для этих тэта-значений это работает», но вместо этого я просто получаю ошибки (хотя это не удивительно, я не уверен что делать здесь. Новое в программировании в целом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...