MATLAB线性函数拟合并预测

线性函数拟合,由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y=(x)的形式给出,并且其中f(x)满足:

y=mx+b

要求得 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);

运行结果如下:

 

上一篇:uniapp实现相册、拍照及视频录制功能


下一篇:【项目部署-apache】windows系统下apache部署django+channels