线性函数拟合,由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y=(x)的形式给出,并且其中f(x)满足:
要求得 m 和b的值,我们可以使用一个称为 polyii(x,y,n)的 MATLAB 函数,其中n是我们要 MATLAB 求出的多项式的次数,对于y= mx+b 形式的方程,我们把n设为等于 1,因此调用的语句将是 polyfit(x,y,1)。polyfit函数采用最小二乘法计算。
示例:
首先输入数据:
H=[6:2:24];
A=[3.94,3.8,4.1,3.87,4.45,4.33,4.12,4.43,4.6,4.5];
x=H
y=A
接着调用 pobyit 让 MATLAB 计算拟合数据的多项式的系数。
p=polyfit(x,y,1)
m=p(1)
b=p(2)
y=m*x+b
画出拟合图形:
x=[1:0.1:24];
y=m*x+b
plot(H,A,'o',x,y),xlabel('差点'),ylabel('平均成绩')
运行结果如下:
看看本例中由拟合直线对特定的差点所预计的成绩值的情况
w=H*m+b
% 3.8616 3.9399 4.0182 4.0965 4.1748 4.2532 4.3315 4.4098 4.4881 4.5664
计算r平方程序如下所示:
Mean=mean(A)
S=sum((A-Mean).^2);
A1=sum((A-w).^2);
r2=1-A1/S
%0.6899
r平方为0.6899,说明拟合效果一般。
往前预测三步,并且画出95%的置信区间代码如下(完整版):
clc;
clear;
% 导入数据
H = [6:2:24];
A = [3.94, 3.8, 4.1, 3.87, 4.45, 4.33, 4.12, 4.43, 4.6, 4.5];
x = H;
y = A;
a = [x; y];
a1 = a(1, :);
[a1, pos] = sort(a1);
a2 = a(2, pos);
% 多项式拟合
[p, s] = polyfit(a1, a2, 2);
fprintf("拟合系数分别为:%f %f\n", p(1), p(2));
y1 = polyval(p, a1);
% 95% 预测区间计算:
[yfit, dy1] = polyconf(p, x, s);
% 95% 置信区间计算:
[yfit, dy] = polyconf(p, a1, s, 'predopt', 'curve');
% 往前预测三个数
x_pred = [26, 28, 30];
[y_pred, delta] = polyval(p, x_pred, s);
% 绘制图表
figure;
hold on;
plot(a1, y1 + dy, 'r--', a1, y1 - dy, 'r--', a1, y1 + dy1, 'y--', a1, y1 - dy1, 'y--', 'LineWidth', 1.5);
plot(a1, y1, 'k', 'LineWidth', 1.5);
scatter(x, y, 'k', 'filled'); % 原始数据点
scatter(x_pred, y_pred, 'r', 'filled'); % 往前预测的数据点标红
plot(x_pred, y_pred + delta, 'r--'); % 预测区间上界
plot(x_pred, y_pred - delta, 'r--'); % 预测区间下界
xlabel('H');
ylabel('A');
title('多项式拟合结果及预测');
grid on;
% 计算 R^2
A1=sum((y1 - a2).^2);
S=sum((a2 - mean(a2)).^2);
r2 = 1-A1/S;
fprintf("R^2 值为:%f\n", r2);
运行结果如下: