Этот пример показывает аппроксимацию полиномов до шестой степени к некоторым данным переписи населения с помощью Curve Fitting 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')
Используйте fit
функция для аппроксимации полинома к данным. Вы задаете квадратичный, или полином второй степени, со строкой 'poly2'
. Первый выход из fit
- полином, и второй выход, gof
, содержит качество статистики подгонки, которую вы исследуете на более позднем этапе.
[population2,gof] = fit(cdate,pop,'poly2');
Чтобы построить график подгонки, используйте plot
функция. Добавить легенду в левом верхнем углу.
plot(population2,cdate,pop); 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');
Чтобы построить графики невязок, задайте 'residuals'
как тип графика в 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
Область struct 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')
Для получения дополнительной информации см. «Полиномиальные модели».