#python #matlab #optimization
#python #matlab #оптимизация
Вопрос:
У меня есть несколько простых задач для решения, и интересно, есть ли какой-нибудь более умный / лучший способ добиться следующего:
Вот сценарий. У меня есть набор заданных векторов ‘h (x)’ и две функции, f (x, a) и g (x, b). Эти две функции принимают аргументы ‘a’ и ‘b’ и создают одномерные векторы. Теперь я хочу сравнить данный вектор ‘h (x)’ с вектором, созданным путем добавления f (x, a) и g (x, b). моя конечная цель — найти аргументы ‘a’ и ‘b’, которые дают минимальный MSE между вектором ‘h (x)’ и вектором f (x, a) g (x, b).
Каков наилучший способ добиться этого?
Текущее решение, которое я придумал, — это просто подметать аргументы ‘a’ и ‘b’ для некоторого произвольного диапазона, вручную вычислить MSE, затем найти ‘a’ и ‘b’, которые достигают минимального значения MSE.
Интересно, есть ли лучший / более удобный способ сделать это.
Спасибо,
Комментарии:
1. Это кажется довольно общим для решения в закрытой форме. Рассматривали ли вы
gradient descent
возможность выполнения после установления цели-fn? Это может быть вашим лучшим выбором2. @SerialLazer спасибо за ваше предложение. Я смог решить проблему с помощью вашего комментария и ответа falopsy.
Ответ №1:
Вы можете создать целевую функцию, которая принимает a и b в качестве входных параметров и выводит меру соответствия (mse), а затем использовать одну из встроенных функций MATLAB, чтобы минимизировать ошибку, чтобы получить наилучшие a и b. Я быстро создал пример кода ниже. Вы можете его изменить. Подробнее о fmincon — это позволяет накладывать ограничения на решение и т.д.
function [a,b] = optimize_ab(x, h,f,g)
% h= h(x) should take vector x and yield vector output
% f=f(x,a)
% g=g(x,b)
% x: input vector
% ========================================================
% Example: find a function to approximate f=x^2 with a*x^1.5 b*x^2.5
% x=1:4;
% h(x)=x.^2;
% f=@(x,a)a*x.^1.5;
% g(x)=g=@(x,b)b*x.^2.5;
% [a,b] = optimize_ab(x,h,f,g)
%=========================================================
h_=h(x);
N =length(x);
res = fmincon(@MSE, [0,0], [], []);
a=res(1);
b=res(2);
function mse = MSE(x_)
a_=x_(1);
b_=x_(2);
mse =sqrt(sum((h_-(f(x,a_) g(x,b_))).^2)/N);
end
end
Комментарии:
1. очень ценю вашу помощь! этот код работал с незначительной модификацией: единственное внесенное мной изменение — это изменение последней строки функции mse на mse = norm(h_ — (f(x, a_) g(x, b_))); Я оставляю этот комментарий для дальнейшего использования. Спасибо!!!
2. Вы правы. Я где-то не туда поместил скобку — я ее исправил. У меня нет matlab на моем компьютере для тестирования. норма также работает. Я рад, что это помогает вам.