Сравнение приближений программно

Этот пример показывает аппроксимацию и сравнение полиномов до шестой степени с помощью Curve Fitting Toolbox, подгоняя некоторые данные переписи. Это также показывает аппроксимацию однократного экспоненциального уравнения и сравнение его с полиномиальными моделями.

Шаги показывают, как:

  • Загрузка данных и создание подгонок с использованием различных библиотечных моделей.

  • Поиск наилучшей подгонки путем сравнения результатов графической подгонки и путем сравнения числовых результатов подгонки, включая подобранные коэффициенты и качество статистики подгонки.

Загрузка и построение графика данных

Данные для этого примера являются файлом census.mat.

load census

Рабочая область содержит две новые переменные:

  • cdate - вектор-столбец, содержащее годы с 1790 по 1990 годы в 10-летних шагах.

  • pop - вектор-столбец с рисунками США, которые соответствуют годам в cdate.

whos cdate pop
plot(cdate,pop,'o')
  Name        Size            Bytes  Class     Attributes

  cdate      21x1               168  double              
  pop        21x1               168  double              

Создание и построение квадратичного графика

Используйте функцию аппроксимации, чтобы аппроксимировать полином к данным. Вы задаете квадратичный, или полином второй степени, со строкой 'poly2'. Первый выход от подгонки является полиномом, а вторым выходом, gof, содержит статистику качества подгонки, которую вы исследуете на более позднем шаге.

[population2,gof] = fit(cdate,pop,'poly2');

Чтобы построить график подгонки, используйте метод plot.

plot(population2,cdate,pop);
% Move the legend to the top left corner.
legend('Location','NorthWest');

Создание и построение графика выбора полиномов

Чтобы соответствовать полиномам разных степеней, измените строку типа арматуры, например, для кубического или полинома третьей степени 'poly3'. Шкала входа cdate довольно велик, поэтому можно получить лучшие результаты путем центрирования и масштабирования данных. Для этого используйте опцию 'Normalize'.

population3 = fit(cdate,pop,'poly3','Normalize','on');
population4 = fit(cdate,pop,'poly4','Normalize','on');
population5 = fit(cdate,pop,'poly5','Normalize','on');
population6 = fit(cdate,pop,'poly6','Normalize','on');

Простая модель роста населения говорит нам, что экспоненциальное уравнение должно хорошо соответствовать этим данным переписи. Чтобы подогнать под один термин экспоненциальную модель, используйте 'exp1' в качестве типа модели.

populationExp = fit(cdate,pop,'exp1');

Постройте график всех подгонок сразу, и добавьте содержательную легенду в верхний левый угол графика.

hold on
plot(population3,'b');
plot(population4,'g');
plot(population5,'m');
plot(population6,'b--');
plot(populationExp,'r--');
hold off
legend('cdate v pop','poly2','poly3','poly4','poly5','poly6','exp1',...
    'Location','NorthWest');

Постройте график невязок для оценки подгонки

Чтобы построить графики невязок, задайте 'lestuals' в качестве типа графика в методе plot.

plot(population2,cdate,pop,'residuals');

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

plot(populationExp,cdate,pop,'residuals');

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

Исследуйте подгонку за пределы области значений данных

Изучить поведение подгонок до 2050 года. Цель подбора кривой данных переписи состоит в том, чтобы экстраполировать наиболее подходящие для прогнозирования будущих демографических значений. По умолчанию подгонка строится в области значений данных. Чтобы построить график подгонки в другой области значений, установите пределы X осей перед построением графика подгонки. Для примера, чтобы увидеть значения, экстраполированные из подгонки, установите верхний предел X равный 2050.

plot(cdate,pop,'o');
xlim([1900, 2050]);
hold on
plot(population6);
hold off

Исследуйте график. Поведение полинома шестой степени за пределами области данных делает его плохим выбором для экстраполяции, и можно отклонить эту подгонку.

Предсказания графика

Чтобы построить график интервалов предсказания, используйте 'predobs' или 'predfun' в качестве типа графика. Для примера, чтобы увидеть границы предсказания для полинома пятой степени для нового наблюдения до 2050 года:

plot(cdate,pop,'o');
xlim([1900, 2050])
hold on
plot(population5,'predobs');
hold off

Постройте интервалы предсказания для кубического полинома до 2050 года.

plot(cdate,pop,'o');
xlim([1900, 2050])
hold on
plot(population3,'predobs')
hold off

Исследуйте статистику качества подгонки

gof struct показывает статистику качества соответствия для подгонки 'poly2'. Когда вы создали подгонку 'poly2' с функцией аппроксимации на более раннем шаге, вы задали выходной аргумент gof.

gof
gof = 

  struct with fields:

           sse: 159.0293
       rsquare: 0.9987
           dfe: 18
    adjrsquare: 0.9986
          rmse: 2.9724

Исследуйте сумму квадратов из-за ошибки (SSE) и скорректированную статистику R-квадрат, чтобы помочь определить лучшую подгонку. Статистическая величина SSE является ошибкой наименьших квадратов подгонки со значением ближе к нулю, указывающим на лучшую подгонку. Скорректированная статистическая величина R-квадрата обычно является лучшим показателем качества подгонки, когда вы добавляете дополнительные коэффициенты к вашей модели.

Большой SSE для 'exp1' указывает, что это плохая подгонка, которую вы уже определили, исследуя подгонку и невязки. Самое низкое значение SSE связано с 'poly6'. Однако поведение этой подгонки за пределами области значений данных делает ее плохим выбором для экстраполяции, поэтому вы уже отвергли эту подгонку, исследуя графики с новыми пределами по осям.

Следующее лучшее значение SSE связано с аппроксимацией полиномом пятой степени, 'poly5', что предполагает, что это может быть наилучшей подгонкой. Однако SSE и скорректированные значения R-квадрат для остальных аппроксимаций полиномом очень близки друг к другу. Какой из них вы должны выбрать?

Сравнение коэффициентов и доверительных границ для определения наилучшей подгонки

Решите проблему наилучшей подгонки, исследуя коэффициенты и доверительные границы для остальных подгонок: полинома пятой степени и квадратичного.

Исследуйте население 2 и население 5 путем отображения моделей, подобранных коэффициентов и доверительных границ для подобранных коэффициентов:

population2

population5
population2 = 

     Linear model Poly2:
     population2(x) = p1*x^2 + p2*x + p3
     Coefficients (with 95% confidence bounds):
       p1 =    0.006541  (0.006124, 0.006958)
       p2 =      -23.51  (-25.09, -21.93)
       p3 =   2.113e+04  (1.964e+04, 2.262e+04)

population5 = 

     Linear model Poly5:
     population5(x) = p1*x^5 + p2*x^4 + p3*x^3 + p4*x^2 + p5*x + p6
       where x is normalized by mean 1890 and std 62.05
     Coefficients (with 95% confidence bounds):
       p1 =      0.5877  (-2.305, 3.48)
       p2 =      0.7047  (-1.684, 3.094)
       p3 =     -0.9193  (-10.19, 8.356)
       p4 =       23.47  (17.42, 29.52)
       p5 =       74.97  (68.37, 81.57)
       p6 =       62.23  (59.51, 64.95)

Можно также получить доверительные интервалы при помощи confint.

ci = confint(population5)
ci =

   -2.3046   -1.6841  -10.1943   17.4213   68.3655   59.5102
    3.4801    3.0936    8.3558   29.5199   81.5696   64.9469

Доверительные ограничения коэффициентов определяют их точность. Проверьте аппроксимацию уравнений (например, f (x) = p1 * x + p2 * x...) чтобы увидеть условия модели для каждого коэффициента. Обратите внимание, что p2 относится к термину p2 * x в 'poly2' и к термину p2 * x ^ 4 в 'poly5'. Не сравнивайте нормированные коэффициенты непосредственно с ненормированными коэффициентами.

Границы пересекают нуль по коэффициентам p1, p2 и p3 для полинома пятой степени. Это означает, что вы не можете быть уверены, что эти коэффициенты отличаются от нуля. Если условия модели более высокого порядка могут иметь коэффициенты нули, они не помогают с подгонкой, что предполагает, что эта модель соответствует данным переписи.

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

Однако малые доверительные границы не пересекают нули на p1, p2 и p3 для квадратичной подгонки, что указывает на то, что установленные коэффициенты известны довольно точно.

Поэтому после изучения как графических, так и численных результатов подгонки необходимо выбрать квадратичное заполнение2 в качестве наилучшей подгонки для экстраполяции данных переписи.

Оценка наилучшей подгонки в новых точках запроса

Теперь вы выбрали оптимальную подгонку (population2) для экстраполяции этих данных переписи, оцените подгонку для некоторых новых точек запроса.

cdateFuture = (2000:10:2020).';
popFuture = population2(cdateFuture)
popFuture =

  274.6221
  301.8240
  330.3341

Чтобы вычислить 95% доверительные ограничения предсказания для населения в будущем, используйте метод предопределения:

ci = predint(population2,cdateFuture,0.95,'observation')
ci =

  266.9185  282.3257
  293.5673  310.0807
  321.3979  339.2702

Постройте график предсказанного будущего населения с доверительными интервалами относительно подгонки и данных.

plot(cdate,pop,'o');
xlim([1900, 2040])
hold on
plot(population2)
h = errorbar(cdateFuture,popFuture,popFuture-ci(:,1),ci(:,2)-popFuture,'.');
hold off
legend('cdate v pop','poly2','prediction','Location','NorthWest')