Преобразование векторного ввода в алгоритм из матричного вывода

Я написал код для реализации алгоритма, который принимает на вход вектор q действительных чисел и возвращает на выходе сложную матрицу R. Приведенный ниже код Matlab создает график, показывающий входной вектор q и выходную матрицу R.

Учитывая только выход сложной матрицы R, я хотел бы получить входной вектор q. Могу ли я сделать это с помощью оптимизации методом наименьших квадратов? Поскольку в коде есть рекурсивная текущая сумма (rs_r и rs_i), вычисление столбца выходной матрицы зависит от вычисления предыдущего столбца.

Возможно, можно настроить нелинейную оптимизацию для перекомпоновки входного вектора q из выходной матрицы R?

Глядя на это с другой стороны, я использовал алгоритм для вычисления матрицы R. Я хочу запустить алгоритм «в обратном порядке», чтобы получить входной вектор q из выходной матрицы R.

Если нет возможности перекомпоновать начальные значения из вывода, тем самым рассматривая проблему как «черный ящик», тогда, возможно, при оптимизации можно использовать математику самой модели? Программа оценивает следующее уравнение:

Уравнения

Утильда (тау, омега) — это выходная матрица R. Переменная тау (время) содержит столбцы матрицы отклика R, тогда как переменная омега (частота) содержит строки матрицы отклика R. Интеграция выполняется как рекурсивная текущая сумма от tau = 0 до текущего временного шага tau.

Вот графики, созданные программой, размещенной ниже:

q ввод значениявывод матрицы

Вот полный код программы:

N = 1001;
q = zeros(N, 1); % here is the input
q(1:200) = 55;
q(201:300) = 120;
q(301:400) = 70;
q(401:600) = 40;
q(601:800) = 100;
q(801:1001) = 70;
dt = 0.0042;
fs = 1 / dt;
wSize = 101;
Glim = 20;
ginv = 0;
R = get_response(N, q, dt, wSize, Glim, ginv); % R is output matrix
rows = wSize; 
cols = N;

figure; plot(q); title('q value input as vector'); 
ylim([0 200]); xlim([0 1001])

figure; imagesc(abs(R)); title('Matrix output of algorithm')
colorbar

Вот функция, которая выполняет расчет:

function response = get_response(N, Q, dt, wSize, Glim, ginv)

fs = 1 / dt; 
Npad = wSize - 1; 
N1 = wSize + Npad;
N2 = floor(N1 / 2 + 1);
f = (fs/2)*linspace(0,1,N2);
omega = 2 * pi .* f';
omegah = 2 * pi * f(end);
sigma2 = exp(-(0.23*Glim + 1.63));

sign = 1;
if(ginv == 1)
    sign = -1;
end

ratio = omega ./ omegah;
rs_r = zeros(N2, 1);  
rs_i = zeros(N2, 1);   
termr = zeros(N2, 1);
termi = zeros(N2, 1);
termr_sub1 = zeros(N2, 1);
termi_sub1 = zeros(N2, 1);
response = zeros(N2, N);

 % cycle over cols of matrix
for ti = 1:N               

    term0 = omega ./ (2 .* Q(ti));
    gamma = 1 / (pi * Q(ti));

    % calculate for the real part
    if(ti == 1)
        Lambda = ones(N2, 1);
        termr_sub1(1) = 0;  
        termr_sub1(2:end) = term0(2:end) .* (ratio(2:end).^-gamma);  
    else
        termr(1) = 0; 
        termr(2:end) = term0(2:end) .* (ratio(2:end).^-gamma); 
        rs_r = rs_r - dt.*(termr + termr_sub1);
        termr_sub1 = termr;
        Beta = exp( -1 .* -0.5 .* rs_r );

        Lambda = (Beta + sigma2) ./ (Beta.^2 + sigma2);  % vector
    end 

    % calculate for the complex part  
    if(ginv == 1)  
        termi(1) = 0;
        termi(2:end) = (ratio(2:end).^(sign .* gamma) - 1) .* omega(2:end);
    else
        termi = (ratio.^(sign .* gamma) - 1) .* omega;
    end
    rs_i = rs_i - dt.*(termi + termi_sub1);
    termi_sub1 = termi;
    integrand = exp( 1i .* -0.5 .* rs_i );

    if(ginv == 1) 
        response(:,ti) = Lambda .* integrand;
    else        
        response(:,ti) = (1 ./ Lambda) .* integrand;
    end  
end % ti loop

person Nicholas Kinar    schedule 22.08.2012    source источник


Ответы (2)


Нет, вы не можете этого сделать, если не знаете саму «модель» этого процесса. Если вы намерены относиться к процессу как к полному черному ящику, то это вообще невозможно, хотя в каждом конкретном случае может случиться всякое.

Даже если вы ДЕЙСТВИТЕЛЬНО знаете лежащий в основе процесс, он все равно может не работать, поскольку любая оценка методом наименьших квадратов зависит от начальных значений, поэтому, если у вас нет хорошего предположения, она может сходиться к неправильному набору параметров.

person Community    schedule 22.08.2012
comment
Благодаря древесной щепе; это очень ценится! Что делает эту проблему такой неуместной и что я мог бы изменить? Если я избавлюсь от рекурсивной текущей суммы (которая представляет собой кумулятивную трапециевидную интеграцию), может ли это улучшить постановку задачи? - person Nicholas Kinar; 23.08.2012
comment
Использование текущей суммы в качестве приблизительного кумулятивного интеграла всегда можно заменить приближениями более высокого порядка, но если это часть черного ящика, для которого вы пытаетесь оценить параметры, то это не имеет значения. Понять, что делает сложную проблему некорректной, может быть сложно. Если существует реальная сингулярность, вы можете обнаружить, откуда она возникает, посмотрев на собственные векторы, соответствующие по существу нулевым собственным значениям гессиана, но это не обязательно должно быть очевидным. Хорошие начальные значения всегда имеют решающее значение. - person ; 23.08.2012
comment
Еще раз спасибо, щепки. Теперь я обновил свой вопрос, включив в него уравнения, составляющие математическую модель. Имея выходную матрицу R и зная приведенную выше математику, могу ли я поставить задачу оптимизации? Как я могу заменить текущую сумму, используя приближения более высокого порядка? - person Nicholas Kinar; 23.08.2012

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

N = 1001;
q = zeros(N, 1);
q(1:200) = 55;
q(201:300) = 120;
q(301:400) = 70;
q(401:600) = 40;
q(601:800) = 100;
q(801:1001) = 70;
dt = 0.0042;
fs = 1 / dt;
wSize = 101;
Glim = 20;
ginv = 0;
R = get_response(N, q, dt, wSize, Glim, ginv);
rows = wSize; 
cols = N;
cut_val = 200;

imagLogR = imag(log(R));

Mderiv = zeros(rows, cols-2);
for k = 1:rows
   val = deriv_3pt(imagLogR(k,:), dt);
   val(val > cut_val) = 0;
   Mderiv(k,:) = val(1:end-1);
end

disp('Running iteration');
q0 = 10;
q1 = 500;
NN = cols - 2;
qout = zeros(NN, 1);
for k = 1:NN
    data = Mderiv(:,k); 
    qout(k) = fminbnd(@(q) curve_fit_to_get_q(q, dt, rows, data),q0,q1);
end

figure; plot(q); title('q value input as vector'); 
ylim([0 200]); xlim([0 1001])

figure;
plot(qout); title('Reconstructed q')
ylim([0 200]); xlim([0 1001])

Вот вспомогательные функции:

function output = deriv_3pt(x, dt)

% Function to compute dx/dt using the 3pt symmetrical rule
% dt is the timestep

N = length(x);
N0 = N - 1;
output = zeros(N0, 1);
denom = 2 * dt;

for k = 2:N0 
   output(k - 1) = (x(k+1) - x(k-1)) / denom;  
end


function sse = curve_fit_to_get_q(q, dt, rows, data)

fs = 1 / dt;
N2 = rows;
f = (fs/2)*linspace(0,1,N2);  % vector for frequency along cols
omega = 2 * pi .* f';
omegah = 2 * pi * f(end);
ratio = omega ./ omegah;

gamma = 1 / (pi * q);

termi = ((ratio.^(gamma)) - 1) .* omega;

Error_Vector =  termi - data;
sse = sum(Error_Vector.^2);

ОригиналПриблизительно

person Nicholas Kinar    schedule 24.08.2012