MATLAB教学_14回归与内插

Simple Linear Regression

polyfit()

p = polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。p 中的系数按降幂排列,p 的长度为 n+1

 

%%
clear all; clc; %14分钟练习
x=[-1.2 -0.5 0.3 0.9 1.8 2.6 3.0 3.5];
y=[-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0];
fit=polyfit(x,y,1)    %返回次数为1的多项式fit

xfit=[x(1):0.1:x(end)];   %将 xfit 连成点
yfit=fit(1)*xfit+fit(2);  %列写yfit 函数,根据算出来的 fit
plot(x,y,'ro',xfit,yfit);  %画图
set(gca,'Xlim',[0 4]);
legend('data points','best-fit','Location','northwest')

18分钟练习

 

 

%%
clear all; clc; %18分钟练习
T=[0.025 0.035 0.050 0.060 0.080];
TC=[20 30 40 50 60];
fit=polyfit(TC,T,1)    %反回fit
xfit=TC(1):0.001:TC(end);
yfit=fit(1)*xfit+fit(2);
plot(TC,T,'bo',xfit,yfit,'r','LineWidth',2);
set(gca,'Xtick',[20 30 40 50 60]);
box on;
grid on;
set(gca,'GridLineStyle','--');   %设置网格线为虚线
xlabel('Temperature(^oC)');
ylabel('TC output(mV)');
title('Calibration of TC')

其中:关于网格线的设置,要先打开网格线。  grid on; 再去设置。

有关可以设置的内容可以见下网:

https://ww2.mathworks.cn/help/matlab/ref/matlab.graphics.axis.axes-properties.html#budumk7_sep_shared-GridLineStyle

scatter()

散点图

scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。该类型的图形也称为气泡图。

scatter(x,y,sz) 指定圆大小。要绘制大小相等的圆圈,请将 sz 指定为标量。要绘制大小不等的圆,请将 sz 指定为长度等于 x 和 y 的长度的向量。

scatter(x,y,sz,c) 指定圆颜色。要以相同的颜色绘制所有圆圈,请将 c 指定为颜色名称或 RGB 三元组。要使用不同的颜色,请将 c 指定为向量或由 RGB 三元组组成的三列矩阵。

corrcoef()

相关系数

p(B,A) 和p(A,B) 肯定在-1 - 1 之间。

以下显示拟合程度越高,越贴合。但要防止过度拟合。

clear all; clc; %23分钟练习
x=[-1.2 -0.5 0.3 0.9 1.8 2.6 3.0 3.5];
y=[-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0];
figure('Position',[50 50 1500 400]);
for i=1:3
    subplot(1,3,i); 
    p=polyfit(x,y,i);    %分别画出了1次拟合,2次拟合,3次拟合。可以看到拟合程度程度越高, 越贴切
    xfit=x(1):0.1:x(end);  
    yfit=polyval(p,xfit);   %计算多项式 yfit在每个xfit 点的值
    plot(x,y,'ro',xfit,yfit);   set(gca,'FontSize',14);
    ylim([-17 11]); legend('Data points','Fitted Curve','Location','southeast');
end

关于figure:

 

26分钟练习

%%
clear all; clc; %26分钟练习
x=[-1.2 -0.5 0.3 0.9 1.8 2.6 3.0 3.5];
y=[-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0];
figure('Position',[50 50 1500 400]);
for i=4:6
    subplot(1,3,i-3);   p=polyfit(x,y,i);
    xfit=x(1):0.1:x(end);
    yfit=polyval(p,xfit);
    plot(x,y,'ro',xfit,yfit,'k');
    ylim([-17 11]);
    legend('Data base','Fitted curve','Location','Northwest');
end

可以看到拟合太多,出现过拟合

 

regress()

如果有两个变量,要使用regress()。前面的polyfit是针对于一个变数。

多元线性回归.

b = regress(y,X) 

返回向量b的系数估计值,用于对矩阵X中的预测项进行向量y中的响应的多元线性回归。

 

clear all; clc; %30分钟练习
load carsmall;
y=MPG;
x1=Weight;
x2=Horsepower;
X=[ones(length(x1),1) x1 x2];  %不明白这里第一个常数为什么要是1,
b=regress(y,X)    %是求系数,y=b(1)+b(2)*x1+b(3)*x2;在求的过程会把NaN的值去掉,也就是无效值
x1fit=min(x1):100:max(x1);   %求x1fit的点。按从小到大就可以知道range是多少,然后每隔100取一个点
x2fit=min(x2):10:max(x2);    %求x2fit的点。每隔10个取一个点
[X1FIT,X2FIT]=meshgrid(x1fit,x2fit);  %网格化,也就是取了一系列点的坐标
YFIT=b(1)+b(2)*X1FIT+b(3)*X2FIT;    %按照这些坐标求出YFIT
scatter3(x1,x2,y,'filled');hold on;   %离散图
mesh(X1FIT,X2FIT,YFIT);    %网格图。
hold off;
xlabel('Weight');
ylabel('Horsepower');
zlabel('MPG');
view(50,10);

注意:这里x1fit=min(x1):100:max(x1);   x2fit=min(x2):10:max(x2);   只是取了一些x1 和x2 的点,并不是将原来矩阵里 x1 和 x2一一对应起来。取了这些点以后,再将x1 和 x2 进行网格。再用 YFIT=b(1)+b(2)*X1FIT+b(3)*X2FIT;   求出 YFIT

Interpolation vs Regression

Interpolation 会把每个点到点的线段连起来

Regression 则是找一个大概的拟合曲线

Interpolation's methods

vq = interp1(x,v,xq)一维数据插值(表查找) 使用线性插值返回一维函数在特定查询点的插入值。向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标。
p = pchip(x,y,xq)分段三次 Hermite 插值多项式 (PCHIP)返回与 xq 中的查询点对应的插值 p 的向量。p 的值由 x 和 y 的保形分段三次插值确定。
s = spline(x,y,xq) 三次方样条数据插值返回与 xq 中的查询点对应的插值 s 的向量。s 的值由 x 和 y 的三次样条插值确定。
pp = mkpp(breaks,coefs) 生成分段多项式 根据其间断数和系数生成分段多项式 pp。使用 ppval 计算特定点处的分段多项式,或使用 unmkpp 提取有关分段多项式的详细信息。

 

%%
clear all; clc; %38分钟练习
x=linspace(0,2*pi,40);  x_m=x;
x_m([11:13, 28:30])=NaN;    %将x_m 向量的 11-13,28-30的数设为不是数
y_m=sin(x_m);
plot(x_m,y_m,'ro','MarkerFaceColor','r');
xlim([0 2*pi]); ylim([-1.2 1.2]);   box on;
m_i=~isnan(x_m);    %利用了isnan()函数, 如果为NaN,则此处返回1,而这里又是非,所以 NaN的地方返回0
y_i=interp1(x_m(m_i),y_m(m_i),x);  %这里x_m(m_i),因为m_i是一个逻辑矩阵,而为0的地方,则不返回数,所以x_m(m_i)比原有的x少了6个数据。
                                   %接着再利用 interp1()函数描绘缺失的图
hold on;
plot(x,y_i,'-b');
hold off;

 

 

 

 

 

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值