В этом примере показано, как соответствовать полиномам до шестой степени к некоторым данным о переписи с помощью 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'
как fittype.
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-предел 2 050.
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')
Для получения дополнительной информации смотрите Полиномиальные модели.