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; 再去设置。
有关可以设置的内容可以见下网:
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的系数估计值,用于对矩阵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 的保形分段三次插值确定。 |
| 三次方样条数据插值 | 返回与 xq 中的查询点对应的插值 s 的向量。s 的值由 x 和 y 的三次样条插值确定。 |
| 生成分段多项式 | 根据其间断数和系数生成分段多项式 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;