线性最小二乘回归的目的是用直线拟合一组成对出现的观测值:
,
直线的数学表示为:,和表示截距和斜率;是模型和观测值之间的误差或残差,。
最佳拟合条件为:
对上式求导:
联立求解得:,
实例:
在流体力学中,物体所受阻力与其速度的平方成正比:,在一风动实验中力和速度的测量数据如下:
v(m/s) | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 |
F(N) | 25 | 70 | 380 | 550 | 610 | 1220 | 830 | 1450 |
x = [10 20 30 40 50 60 70 80];
y = [25 70 380 550 610 1220 830 1450];
n = length(x);
a1 = (n*sum(x.*y)-sum(x)*sum(y)) / (n*sum(x.^2)-(sum(x))^2);
ybar = sum(y) / n;
xbar = sum(x) / n;
a0 = ybar - a1*xbar;
plot(x, y, '*')
hold on
xhat = linspace(0, 80, 100);
yhat = a0 + a1*xhat;
plot(xhat, yhat)
xlabel('v(m/s)')
ylabel('F(N)')
set(gca, 'Fontname', 'Times', 'Fontsize', 9)
结果分析:
- 令:,其中称为估计值的标准误差,此处除数为n-2,在上一篇文章中,我们讨论了为什么统计量中的标准差除数为n-1,这里估计值的标准差自由度为n-2,另外,如果只有两个数据点,那么所求直线即为过这两个点的直线,也就不存在“数据分散”的问题了。“标准差”表示数据沿均值周围的分散情况,而“估计值的标准差”表示数据沿回归线周围的分散情况。
- ,r为相关系数,对于一次完美的拟合,有,直线百分百反映数据的变化情况,若,表示直线拟合的结果与均值相比没有任何提高。
非线性关系的线性化:
指数模型:,两边同时取自然对数:
幂方程:,两边同时取对数:
饱和增长率方程:,两边同时取倒数:
将实例中的模型改为幂方程:
x0 = [10 20 30 40 50 60 70 80];
y0 = [25 70 380 550 610 1220 830 1450];
x = log10(x0);
y = log10(y0);
n = length(x);
a1 = (n*sum(x.*y)-sum(x)*sum(y)) / (n*sum(x.^2)-(sum(x))^2);
ybar = sum(y) / n;
xbar = sum(x) / n;
a0 = ybar - a1*xbar;
subplot(2, 1, 1)
xhat = linspace(10, 80, 100);
xhat = log10(xhat);
yhat = a0 + a1*xhat;
plot(x, y, '*', xhat, yhat)
xlabel('log(v)')
ylabel('log(F)')
set(gca, 'Fontname', 'Times', 'Fontsize', 9)
subplot(2, 1, 2)
xhat = linspace(0, 80, 100);
yhat = 10^a0 * xhat.^(a1);
plot(x0, y0, '*', xhat, yhat)
xlabel('v(m/s)')
ylabel('F(N)')
set(gca, 'Fontname', 'Times', 'Fontsize', 9)
总评:
在Matlab中,内置函数polyfit可计算数据的n次多项式最小二乘拟合多项式,用法为:p = polyfit(x, y, n),其中x和y分别为自变量和应变量,n为多项式的次数,返回值p中记录了多项式的系数,(幂次递减的形式)
x = [10 20 30 40 50 60 70 80];
y = [25 70 380 550 610 1220 830 1450];
% 拟合
p = polyfit(x, y, 1);
% 绘图
xhat = linspace(0, 80, 100);
yhat = polyval(p, xhat);
plot(x, y, '*', xhat, yhat)
xlabel('v(m/s)')
ylabel('F(N)')
set(gca, 'Fontname', 'Times', 'Fontsize', 9)
在线性最小二乘回归中,隐藏了许多假设:
- 每一个x的值都已固定,它不是随机的,而且不带有任何误差;
- y是独立随机变量,而且y的所有分量具有同样的方差;
- 给定x值后,y值的分布必须服从正态分布。