exponenta event banner

Подгонка полиномиальной кривой

В этом примере показано, как подгонять полиномы до шестой степени к некоторым данным переписи с помощью Toolbox™ «Фитинг кривой». Также показано, как подогнать одномерное экспоненциальное уравнение и сравнить его с полиномиальными моделями.

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

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

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

Загрузка и печать данных

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

load census

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

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

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

whos cdate pop
  Name        Size            Bytes  Class     Attributes

  cdate      21x1               168  double              
  pop        21x1               168  double              
plot(cdate,pop,'o')

Figure contains an axes. The axes contains an object of type line.

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

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

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

Для печати посадки используйте plot функция. Добавьте легенду в верхнем левом углу.

plot(population2,cdate,pop);
legend('Location','NorthWest');

Figure contains an axes. The axes contains 2 objects of type line. These objects represent data, fitted curve.

Создание и печать набора многочленов

Чтобы подогнать многочлены различных степеней, измените строку фиттипа, например, для использования многочлена кубической или третьей степени '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');

Figure contains an axes. The axes contains 7 objects of type line. These objects represent cdate v pop, poly2, poly3, poly4, poly5, poly6, exp1.

Постройте график остатков для вычисления соответствия

Для печати остатков укажите 'residuals' как тип графика в plot функция.

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

Figure contains an axes. The axes contains 2 objects of type line. These objects represent data, zero line.

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

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

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

Figure contains an axes. The axes contains 2 objects of type line. These objects represent data, zero line.

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

Проверка посадок за пределами диапазона данных

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

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

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

Figure contains an axes. The axes contains 2 objects of type line. This object represents fitted curve.

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

Интервалы прогнозирования графика

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

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

Figure contains an axes. The axes contains 4 objects of type line. These objects represent fitted curve, prediction bounds.

Интервалы прогнозирования графика для кубического многочлена до 2050 года:

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

Figure contains an axes. The axes contains 4 objects of type line. These objects represent fitted curve, prediction bounds.

Анализ статистики пригодности

Структура gof показывает статистику пригодности для 'poly2' подходит. При создании 'poly2' соответствует fit на предыдущем шаге вы указали 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-квадрата для остальных полиномиальных посадок очень близки друг к другу. Какой выбрать?

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

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

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

population2
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
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×6

   -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 для квадратичной посадки, указывающей на то, что подгоняемые коэффициенты известны довольно точно.

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

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

Теперь вы выбрали наилучшее вписывание, population2для экстраполяции этих данных переписи оцените соответствие некоторым новым точкам запроса:

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

  274.6221
  301.8240
  330.3341

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

ci = predint(population2,cdateFuture,0.95,'observation')
ci = 3×2

  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')

Figure contains an axes. The axes contains 3 objects of type line, errorbar. These objects represent cdate v pop, poly2, prediction.

Дополнительные сведения см. в разделе Полиномиальные модели.