exponenta event banner

полиподгонка

Подгонка полиномиальной кривой

Описание

пример

p = polyfit(x,y,n) возвращает коэффициенты для многочлена p(x) степени n это наилучшее соответствие (в смысле наименьших квадратов) для данных в y. Коэффициенты в p находятся в нисходящих степенях, и длина p является n+1

p (x) = p1xn + p2xn 1 +... + pnx + pn + 1.

[p,S] = polyfit(x,y,n) также возвращает структуру S которые могут использоваться в качестве входных данных для polyval для получения оценок ошибок.

пример

[p,S,mu] = polyfit(x,y,n) также возвращает mu, который представляет собой двухэлементный вектор со значениями центрирования и масштабирования. mu(1) является mean(x), и mu(2) является std(x). Используя эти значения, polyfit центры x при нуле и масштабирует его, чтобы иметь единичное стандартное отклонение,

x ^ = x x vеrx.

Это преобразование центрирования и масштабирования улучшает числовые свойства как многочлена, так и алгоритма подгонки.

Примеры

свернуть все

Создание 10 точек, равномерно расположенных вдоль синусоидальной кривой в интервале [0,4*pi].

x = linspace(0,4*pi,10);
y = sin(x);

Использовать polyfit для подгонки многочлена 7-й степени к точкам.

p = polyfit(x,y,7);

Вычислите полином на более тонкой сетке и постройте график результатов.

x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off

Figure contains an axes. The axes contains 2 objects of type line.

Создание вектора из 5 равноотстоящих точек в интервале [0,1]и вычислить y (x) = (1 + x) -1 в этих точках.

x = linspace(0,1,5);
y = 1./(1+x);

Поместите многочлен степени 4 в 5 точек. В общем, для n точки, можно вписать многочлен степени n-1 точно пройти через точки.

p = polyfit(x,y,4);

Вычислите исходную функцию и аппроксимацию многочлена на более тонкой сетке точек от 0 до 2.

x1 = linspace(0,2);
y1 = 1./(1+x1);
f1 = polyval(p,x1);

Постройте график значений функций и аппроксимации полинома в более широком интервале [0,2], при этом точки, используемые для получения полиномиальной посадки, выделены в виде кругов. Полиномиальная посадка хорошо в оригинале [0,1] интервал, но быстро расходится с подогнанной функцией вне этого интервала.

figure
plot(x,y,'o')
hold on
plot(x1,y1)
plot(x1,f1,'r--')
legend('y','y1','f1')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent y, y1, f1.

Сначала создайте вектор из x точки, равномерно разнесенные в интервале [0,2.5], а затем оценить erf(x) в этих точках.

x = (0:0.1:2.5)';
y = erf(x);

Определите коэффициенты аппроксимирующего многочлена степени 6.

p = polyfit(x,y,6)
p = 1×7

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004

Чтобы увидеть, насколько хорошо вписывается, вычислите полином в точках данных и создайте таблицу, показывающую данные, вписывание и ошибку.

f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
     X        Y          Fit         FitError  
    ___    _______    __________    ___________

      0          0    0.00044117    -0.00044117
    0.1    0.11246       0.11185     0.00060836
    0.2     0.2227       0.22231     0.00039189
    0.3    0.32863       0.32872    -9.7429e-05
    0.4    0.42839        0.4288    -0.00040661
    0.5     0.5205       0.52093    -0.00042568
    0.6    0.60386       0.60408    -0.00022824
    0.7     0.6778       0.67775     4.6383e-05
    0.8     0.7421       0.74183     0.00026992
    0.9    0.79691       0.79654     0.00036515
      1     0.8427       0.84238      0.0003164
    1.1    0.88021       0.88005     0.00015948
    1.2    0.91031       0.91035    -3.9919e-05
    1.3    0.93401       0.93422      -0.000211
    1.4    0.95229       0.95258    -0.00029933
    1.5    0.96611       0.96639    -0.00028097
      ⋮

В этом интервале интерполированные значения и фактические значения сходятся довольно близко. Создайте график, показывающий, как за пределами этого интервала экстраполированные значения быстро расходятся с фактическими данными.

x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1,'-')
plot(x1,f1,'r--')
axis([0  5  0  2])
hold off

Figure contains an axes. The axes contains 3 objects of type line.

Создайте таблицу данных о населении за 1750-2000 годы и постройте график точек данных.

year = (1750:25:2000)';
pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]';
T = table(year, pop)
T=11×2 table
    year       pop   
    ____    _________

    1750     7.91e+08
    1775     8.56e+08
    1800     9.78e+08
    1825     1.05e+09
    1850    1.262e+09
    1875    1.544e+09
    1900     1.65e+09
    1925    2.532e+09
    1950    6.122e+09
    1975     8.17e+09
    2000    1.156e+10

plot(year,pop,'o')

Figure contains an axes. The axes contains an object of type line.

Использовать polyfit с тремя выходами для подгонки многочлена 5-й степени с помощью центрирования и масштабирования, что улучшает числовые свойства задачи. polyfit центрирование данных в year при 0 и масштабирует его, чтобы иметь стандартное отклонение 1, что позволяет избежать неправильной матрицы Вандермонде в вычислении аппроксимации.

[p,~,mu] = polyfit(T.year, T.pop, 5);

Использовать polyval с четырьмя входами для оценки p с масштабированными годами, (year-mu(1))/mu(2). Постройте график результатов по сравнению с исходными годами.

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

Figure contains an axes. The axes contains 2 objects of type line.

Подгонка простой модели линейной регрессии к набору дискретных точек данных 2-D.

Создайте несколько векторов точек данных выборки (x, y). Поместите многочлен первой степени в данные.

x = 1:50; 
y = -0.3*x + 2*randn(1,50); 
p = polyfit(x,y,1); 

Вычислить аппроксимированный полином p в точках в x. Постройте график результирующей модели линейной регрессии с данными.

f = polyval(p,x); 
plot(x,y,'o',x,f,'-') 
legend('data','linear fit') 

Figure contains an axes. The axes contains 2 objects of type line. These objects represent data, linear fit.

Подгоните линейную модель к набору точек данных и постройте график результатов, включая оценку 95% интервала прогнозирования.

Создайте несколько векторов точек данных выборки (x, y). Использоватьpolyfit для подгонки полинома первой степени к данным. Укажите два выхода, чтобы вернуть коэффициенты для линейной аппроксимации, а также структуру оценки ошибок.

x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 

Оценка аппроксимации полинома первой степени в p в точках в x. Укажите структуру оценки ошибок в качестве третьего входного значения, чтобы polyval вычисляет оценку стандартной ошибки. Стандартная оценка ошибки возвращается в delta.

[y_fit,delta] = polyval(p,x,S);

Постройте график исходных данных, линейной посадки и 95% интервала прогнозирования y ± 2Δ.

plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

Figure contains an axes. The axes with title Linear Fit of Data with 95% Prediction Interval contains 4 objects of type line. These objects represent Data, Linear Fit, 95% Prediction Interval.

Входные аргументы

свернуть все

Точки запроса, указанные как вектор. Точки в x соответствуют значениям аппроксимированной функции, содержащимся в y. Если x не является вектором, то polyfit преобразует его в вектор-столбец x(:).

При появлении предупреждающих сообщений x имеет повторяющиеся (или почти повторяющиеся) точки или если x может потребоваться центрирование и масштабирование.

Типы данных: single | double
Поддержка комплексного номера: Да

Подогнанные значения в точках запроса, заданные как вектор. Значения в y соответствуют точкам запроса, содержащимся в x. Если y не является вектором, то polyfit преобразует его в вектор-столбец y(:).

Типы данных: single | double
Поддержка комплексного номера: Да

Степень аппроксимации многочлена, заданная как положительный целочисленный скаляр. n задает степень полинома самого левого коэффициента в p.

Выходные аргументы

свернуть все

Наименьшие квадраты соответствуют полиномиальным коэффициентам, возвращаемым в виде вектора. p имеет длину n+1 и содержит полиномиальные коэффициенты в нисходящих степенях, причем наивысшая степень n. Если либо x или y содержать NaN значения и n < length(x), то все элементы в p являются NaN.

Использовать polyval оценить p в точках запроса.

Структура оценки ошибок. Эта дополнительная структура вывода в основном используется в качестве входных данных для polyval функция для получения оценок ошибок. S содержит следующие поля:

ОбластьОписание
RТреугольный R коэффициент (возможно переставленный) из QR-разложения матрицы Вандермонде x
dfСтепени свободы
normrНорма остатков

Если данные в y является случайным, то оценка ковариационной матрицы p является (Rinv*Rinv')*normr^2/df, где Rinv является обратной R.

Если ошибки в данных в y независимы и нормальны с постоянной дисперсией, то [y,delta] = polyval(...) создает границы ошибок, которые содержат не менее 50% прогнозов. То есть y ± delta содержит не менее 50% прогнозов будущих наблюдений при x.

Значения центрирования и масштабирования, возвращаемые как двухэлементный вектор. mu(1) является mean(x), и mu(2) является std(x). Эти значения центрируют точки запроса в x при нуле с единичным стандартным отклонением.

Использовать mu как четвертый вход в polyval оценить p в масштабированных точках, (x - mu(1))/mu(2).

Ограничения

  • В задачах со многими точками, увеличение степени полиномиальной посадки с помощью polyfit не всегда приводит к лучшей посадке. Полиномы высокого порядка могут быть колебательными между точками данных, что приводит к худшему соответствию данным. В этих случаях можно использовать полиномиальную подгонку низкого порядка (которая имеет тенденцию быть более гладкой между точками) или другой метод, в зависимости от задачи.

  • Многочлены являются неограниченными, колебательными функциями от природы. Поэтому они плохо подходят для экстраполяции ограниченных данных или монотонных (увеличивающихся или уменьшающихся) данных.

Алгоритмы

polyfit использование x для формирования матрицы Вандермонде V с n+1 столбцы и m = length(x) строки, что приводит к линейной системе

(x1nx1n−1⋯1x2nx2n−1⋯1  xmnxmn−11) (p1p2⋮pn+1) = (y1y2⋮ym),

который polyfit решает с помощью p = V\y. Поскольку столбцы в матрице Вандермонде являются степенями вектора x, номер условия V часто велика для посадок высокого порядка, что приводит к сингулярной матрице коэффициентов. В этих случаях центрирование и масштабирование могут улучшить числовые свойства системы для обеспечения более надежной посадки.

Расширенные возможности

.
Представлен до R2006a