В этом примере показано, как подгонять и сравнивать полиномы до шестой степени с помощью панели инструментов «Фитинг кривой», подгоняя некоторые данные переписи. Также показано, как подогнать одномерное экспоненциальное уравнение и сравнить его с полиномиальными моделями.
Шаги показывают, как:
Загрузка данных и создание посадок с использованием различных библиотечных моделей.
Поиск наилучшего соответствия путем сравнения результатов графического соответствия и сравнения результатов численного соответствия, включая коэффициенты соответствия и достоверность статистики соответствия.
Данные для этого примера - файл 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(population2,cdate,pop); % Move the legend to the top left corner. legend('Location','NorthWest');

Для подгонки многочленов различных степеней измените строку фиттипа, например, для многочлена кубической или третьей степени используйте «poly3». Масштаб входных данных, cdate, достаточно велик, поэтому вы можете получить лучшие результаты, центрируя и масштабируя данные. Для этого используйте параметр «Нормализовать».
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');

Для печати остатков укажите «остатки» в качестве типа графика в методе печати.
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» с функцией подгонки на предыдущем шаге был задан выходной аргумент 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 в качестве наиболее подходящей для экстраполяции данных переписи.
Теперь вы выбрали наилучшую подгонку, популяцию2, чтобы экстраполировать эти данные переписи, оценить подгонку для некоторых новых точек запроса.
cdateFuture = (2000:10:2020).'; popFuture = population2(cdateFuture)
popFuture = 274.6221 301.8240 330.3341
Чтобы вычислить 95% доверительные границы для прогноза для населения в будущем, используйте метод predint:
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')
