多项式曲线拟合(线性回归拟合)
polyfit函数
拟合一次函数 实例代码:
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 means the max Order number, here is y=ax+b
% here fit(1)=a fit(2)=b
% plot now
xfit = x(1):0.1:x(end);
yfit = fit(1) * xfit + fit(2);
plot(x,y,'ro',xfit,yfit);
set(gca,'FontSize',14);
legend('Location','northwest');
legend('data points','best-fit');
散点图和线性相关系数
scatter(x,y)
绘制散点图
corrcoef()
线性相关系数r (r属于-1到1)。当r接近1时,呈正相关;当r接近-1时,呈负相关
例如
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];
scatter(x, y);
box on;
axis square;
corrcoef(x, y)
结果
ans =
1.0000 0.9202
0.9202 1.0000
可知,线性相关系数是0.9202,具有较高的线性相关性。
higher order polynomials
实例代码
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]);
% try different high order
N = 3;
for i = 1:N
subplot(1, N, i);
p = polyfit(x, y, i);
xfit = x(1):0.1:x(end);
yfit = polyval(p, xfit); % p: all coefficients
plot(x, y, 'ro', xfit, yfit);
set(gca, 'FontSize', 14);
ylim([-17, 11]);
legend('Data points', 'Fitted curve', 'Location', 'southeast');
end
这里用polyval
将polyfit拟合好的多项式系数用xfit代入,以产生yfit
结果(分别是一次拟合、二次拟合、三次曲线拟合)
多元线性回归
regress()
测试数据集
load carsmall
实例程序
load carsmall;
y = MPG;
x1 = Weight;
x2 = Horsepower;
X = [ones(length(x1), 1) x1 x2];
b = regress(y, X);
x1fit = min(x1):100:max(x1);
x2fit = min(x2):10:max(x2);
[X1FIT, X2FIT] = meshgrid(x1fit, x2fit);
YFIT = b(1) + b(2) * X1FIT + b(3) * X2FIT;
scatter3(x1, x2, y, 'filled');
hold on;
mesh(X1FIT, X2FIT, YFIT);
hold off;
xlabel('Weight');
ylabel('Horsepower');
zlabel('MPG');
view(50, 10);
这里用regress函数来拟合,其中,常数项通过ones(length(x1), 1)
来处理
曲线拟合工具 cftool
为了拟合非线性函数,我们可以选择cftool工具箱
在matlab命令窗口中输入cftool
以打开cftool
在cftool中可以选择工作区中已有的变量数据。
例如,我们用上一节carsmall的数据,通过这个工具箱来fit曲线。
Interpolation内差
hermite和spline两种拟合
spline做二维内差
2D Interpolation Using spline
在interp2的最后一个参数中传入'cubic'
即可。
这样就是光滑拟合了
实例程序
xx = -2:0.5:2;
yy = -2:0.5:3;
[X, Y] = meshgrid(xx, yy);
Z = X .* exp(-X.^2 - Y.^2);
xx_i = -2:0.1:2;
yy_i = -2:0.1:3;
[X_i, Y_i] = meshgrid(xx_i, yy_i);
Z_c = interp2(xx, yy, Z, X_i, Y_i, 'cubic');
surf(X_i, Y_i, Z_c);
hold on;
plot3(X, Y, Z + 0.01, 'ok', 'MarkerFaceColor', 'r');
hold off;
Spline
如果要线性拟合,只要把上面的Z_c = interp2(xx, yy, Z, X_i, Y_i, 'cubic');
改为Z_c = interp2(xx, yy, Z, X_i, Y_i);
,可得:
网友评论