Этот пример показывает аппроксимацию и сравнение полиномов до шестой степени с помощью 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')