Используя lsqcurvefit, как я могу улучшить настройку

Мне нужно подогнать данные, указанные в Runreg.m, к уравнению, указанному в CalculateTime.m, но значение resnorm довольно велико, и я не могу получить хорошую подгонку.

С полученными значениями A и сигмы, если я вычисляю время, оно сильно отличается от фактического времени.

Рассчитать время.м

function [ Ta] = CalculateTime(par_fit,n)
  T1=484.437812;
  sigma = par_fit(1);
  A= par_fit(2);
  const1= sigma*(T1-T1/(2*A));
  const2= T1/A -T1*sigma/(2*A);
  Ta = n.^(-1)*const1 + const2;
end

Прогонрег.м

n=[1.0000      1.5000    2.0000    2.5000    3.0000    4.0000];
Ta=[484.437812 424.2085  382.3534  352.1422  311.6865  253.5879];
plot(n,Ta,'o')
par_fit=[0.8,2];
options = optimset('Display','iter','TolX', 1e-10, 'TolFun', 1e-10, 'MaxFunEvals', 4000, 'MaxIter', 4000);
[x,resnorm,residual]=lsqcurvefit(@CalculateTime,par_fit,n,Ta,[0 1],[1 Inf],options);
hold on
plot(n,CalculateTime(x,n))
hold off

person Biparite    schedule 30.12.2014    source источник
comment
@HighPerformanceMark: только что обновил вопрос.   -  person Biparite    schedule 30.12.2014


Ответы (1)


Что вам, вероятно, следует сделать в первую очередь, так это изменить TolX и TolFun на более разумные значения. Установка их на 1e-100 не улучшит результат, а просто вызовет больше итераций, чем необходимо. Я приложил график результатов подгонки с использованием 1e-10 для обоих допусков. Параметры, которые я получаю, это sigma=0.9881 и A=1.0000, и соответствие выглядит вполне приемлемым. resnorm равно 483.2636, что может показаться высоким, но помните, что это сумма квадратов остатков, поэтому средний остаток равен приблизительно 13, что кажется вполне приемлемым.

Я думаю, что вы должны спросить себя, находятся ли sigma и A в пределах правдоподобного диапазона для параметров, которые вы пытаетесь подобрать, и подумать немного больше о проблеме, которую вы пытаетесь решить. Может быть, еще несколько точек данных могли бы помочь получить лучшее соответствие? Может быть, ваши начальные значения или границы ваших параметров можно было бы скорректировать? На мой взгляд, lsqcurvefit делает именно то, что должен делать, а ваша реальная проблема заключается в чем-то другом.

Результат lsqcurvefit

person magnetometer    schedule 30.12.2014
comment
Я добавил больше данных. подходит для меньших значений n, но идея состоит в том, чтобы использовать эту модель для больших значений n, что, безусловно, не работает. Как вы упомянули, возможно, ваши начальные значения или границы ваших параметров могут быть скорректированы, не могли бы вы объяснить это. - person Biparite; 30.12.2014
comment
Я попробовал это с большим количеством точек данных, и кажется, что функция, которую вы пытаетесь подогнать к данным, может не точно ее описать. Не могли бы вы рассказать нам больше о процессе, который вы измеряете, и уравнениях, которые вы используете? Мой комментарий о начальных значениях/границах означает, что иногда результат подгонки может зависеть от начальных параметров, когда решатель застревает в локальном минимуме, но здесь, вероятно, это не так. - person magnetometer; 30.12.2014
comment
Это модель для прогнозирования времени выполнения на любом количестве узлов. tn= σ(T1 −T1/2A)/n + T1/A −T1σ/2A;A < n ≤ 2A − 1 где T1 — время выполнения на одном узле. - person Biparite; 31.12.2014
comment
@Harshit: я думаю, что в вашей модели могут быть упущены некоторые детали. Если я правильно понимаю, А — это мера параллелизма программы. Возможно, вам придется также включить случаи n<A и n>2A-1. Поскольку вы реализовали это в настоящее время, вполне может случиться так, что приложение, которое вы измеряете, имеет A где-то в диапазоне, который вы не рассматриваете. - person magnetometer; 31.12.2014
comment
Да, вы правы, в модели есть уравнения для этих интервалов. tn= (T1 −T1σ/2A)/n +T1σ/2A , 1 ≤ n ≤ A и tn =T1/A, n>2A-1 Я попробовал оба уравнения, но результат остался прежним. что касается n>2A-1, здесь такого быть не может, потому что приложение масштабируется с увеличением количества узлов. Мы использовали эту модель для прогнозирования времени выполнения в трех других приложениях, которые отлично работают. Есть ли другой способ стать лучше. Я также пробовал fmincon, и результаты для него также выглядят одинаково. - person Biparite; 01.01.2015
comment
Основная проблема заключается в том, что A находится между [2-8] для других приложений и 1 в случае LeanMD, поэтому невозможно предсказать время выполнения для большего количества узлов. - person Biparite; 01.01.2015