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

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