Как найти функцию, которая программно может приблизиться к другой функции черного ящика?
У меня две функции
m1 = f1(w, s)
m2 = f2(w, s)
f1() и f2() - все черные ящики. Учитывая w и s, я могу получить m1 и m2.
Теперь мне нужно спроектировать или найти функцию g, такую, чтобы
m2' = g(m1)
Кроме того, разница между m2 и m2'должна быть минимизирована.
W и S все стохастический процесс.
Как я могу найти такую функцию g()
? К какой области знаний это относится?
2 ответа
Предполагая, что вы можете вызывать f1,f2 столько раз, сколько захотите - это можно решить с помощью регрессии.
- Установите тренировочный набор:
(w_1,s_1,m2_1),...,(w_n,s_n,m2_n)
, - "Преобразовать" набор в параметры g:
(m1_1,m2_1),...,(m1_n,m2_n)
, - Создайте свои "базовые функции". Например, для базовых функций полиномов до степени 3 "модифицированный" обучающий набор будет
(1,m1_1,m1_1^2,m1_1^3,m2_1), ...
Его легко обобщить до любой степени полинома или любых других заданных базовых функций. - Теперь у вас есть проблема, которую можно решить с помощью линейной регрессии с использованием обычных наименьших квадратов (OLS)
Однако обратите внимание, что для некоторых функций это может оказаться невозможным для вычисления подходящей модели, поскольку вы теряете данные при уменьшении размерности с 2 (w,s) до 1 (m1).
Matlab code snap (плохой выбор функций):
%example functions
f = @(w,s) w.^2 + s.^3 -1;
g = @(w,s) s.^2 - w + 2;
%random points for sampling
w = rand(1,100);
s = rand(1,100);
%the data
m1 = f(w,s)';
m2 = g(w,s)';
%changing dimension:
d = 5;
points = size(m1,1);
A = ones(points,d);
for jj=1:d
A(:,jj) = (m1.^(jj-1))';
end
%OLS:
theta = pinv(A'*A)*A'*m2;
%new point:
w = rand(1,1);
s = rand(1,1);
m1 = f(w,s);
%estimate the new point:
A = ones(1,d);
for jj=1:d
A(:,jj) = (m1.^(jj-1))';
end
%the estimation:
estimated = A*theta
%the real value:
g(w,s)
Проблемы такого рода изучаются в таких областях, как статистика или обратные задачи. Вот один из способов теоретического подхода к проблеме (с точки зрения обратных задач):
Прежде всего, совершенно ясно, что в общем случае функция g может не существовать. Однако то, что вы можете (попытаться) вычислить, учитывая, что вы (предполагаете) что-то знаете о статистике w и s, - это апостериорная плотность вероятности p(m2|m1), которую затем можно использовать для вычисления оценок для m2 например, с учетом m1 максимальная апостериорная оценка.
Задняя плотность может быть рассчитана по формуле Байеса:
p (m2 | m1) = (\ int p (m1, m2 | w, s) p (w, s) dw ds) / (\ int p (m1 | w, s) dw ds)
что, в данном случае, может быть (теоретически) неприятно для применения, так как некоторые из вовлеченных предельных плотностей вероятности являются сингулярными. Лучший способ продолжить численно зависит от дополнительных предположений, которые вы можете сделать для статистики w и s (например, Гаусса) и функций f1, f2 (например, гладких). Там нет серебряной пули.
OLS решение amit, вероятно, является хорошей отправной точкой. Только убедитесь, что выборка из правильных распределений для w и s.