我尽量用通俗的语言来描述。
虽然这道题是 非线性回归 的问题,但其 做题步骤、做题思想 和 线性回归 是相似的,也可作参考。
数学建模系列文章——总结篇:《数模美一国一退役选手的经验分享[2021纪念版]》.
最小二乘法(又称最小平方法)是一种数学优化技术。它通过 最小化误差的平方 和寻找数据的最佳函数匹配。
利用最小二乘法可以简便地求得 未知 的数据,并使得这些求得的 数据与实际数据 之间 误差的平方和 为最小 。
曲线拟合 可用最小二乘法来进行进行 参数估计 (即用来估计斜率k和截距b)。最小二乘法也可用于其他 优化问题。
非线性回归是回归函数关于未知回归系数具有 非线性结构 的回归。常用的处理方法有回归函数的线性迭代法、分段回归法、迭代最小二乘法等。非线性回归分析的主要内容与线性回归分析相似。
“ 最小二乘法 ” 只是 回归分析 中的一种方法,同样地,和最小二乘法相对应的还有:最小绝对值法 等。
更多概念区分详见链接:https://blog.csdn.net/Wang_Dou_Dou_/article/details/118739458?spm=1001.2014.3001.5501.
举一个简单的栗子:有个房地产投资商,给你一张表如下。然后让你来预测2010年该地区的房价。
要预测2010年该地区的房价,首先必须要找到一个年份与房价之间的函数表达式,使其能够比较好的 “贴近” 这些样本数据点,并且达到误差最小。
要实现这一点,我们首先要确定使用怎样的一个函数。
为了找到这样一个函数,我们先用最简单的函数试一下,即线性函数或二次函数。利用MATLAB的数据拟合功能,分别对数据点进行线性和二次拟合,在这里我们只是想 直观地 看一看,用线性或者二次函数能不能较好第 “贴近” 这些数据点。
% x是年份,以2007年为第0年,y是房价
x = 0:2009 - 1997;
y = [767 895 995 1117 1261 1437 1640 1957 2244 2489 2801 3096 3500];
fy1 = polyfit(x,y,1); % 线性拟合
fy2 = polyfit(x,y,2); % 二次拟合
t = 0:0.1:2009 - 1997
y1 = zeros( size(t) ); % 初始化
y2 = zeros( size(t) ); % 初始化
y1 = polyval(fy1,t); % 得到线性拟合的纵坐标值
y2 = polyval(fy2,t); % 得到二次拟合的纵坐标值
plot(x,y,'*',t,y1,'--',t,y2,'-');
xlabel('时间/年(记2007年为第0年)');
ylabel('房价/元');
legend('原始数据','一维拟合','二维拟合');
运行结果如下:
从上图中可以直观地看出,房价和时间(年份)的关系更加接近于一个二次函数、由此分析,我们应该为此建立一个二次函数的回归模型。
我们所要建立的二次函数的回归模型,应该能够使得函数能够 “最好的” 表现房价y 和 年份x 的关系。而什么才算 “最好的” 的呢? 这个时候,就用上 最小二乘法 了。其 核心思想 就是,让 函数上的值 与 实际值 之间的差别最小。
在建立数学模型之前,首先要明确一下变量:y 是指房屋的价格, x 是指时间(年份),而 y ^ \hat y y^ 是由函数 y ^ ( x ) \hat y(x) y^(x) 所确定的房价y的 估计值 。
即设: y ^ ( x ) \hat y(x) y^(x) = a0 + a1x + a2x2
达到最小值。
这一步相当于要求我们找到三个参数来求 y ^ ( x ) \hat y(x) y^(x) ,并要求使得 上面的(1)式 达到最小。由于 y ^ ( x ) \hat y(x) y^(x) = a0 + a1x + a2x2 ,其中 x 和 y 的数据都已知。则具体步骤如下:
--------------------------分割线----------------------------
Step1:显然 该函数【说的是(1)式】的变量有三个【注:我没有展开(1)式的 y ^ ( x ) \hat y(x) y^(x)】,即 a0 、 a1 、 a2 ,要求函数的最小值,则需分别对三个变量求偏导,并令其等于0,如下如所示:
用matlab来求解这个方程组。
clc,clear,close all;
x = 0:2009 - 1997;
y = [767 895 995 1117 1261 1437 1640 1957 2244 2489 2801 3096 3500];
x_new = zeros(length(x),3);
% 因为用的是二维拟合,则 x_new 应该为 3*13 的矩阵,第一列为 1 ,第二列为 x ,第三列为 x^2
x_new(:,1) = 1;
x_new(:,2) = x';
x_new(:,3) = (x.^2)';
[b,bint,r,rint,stats] = regress(y',x_new) % 调用回归函数regress
plot(x,y,'bo');
hold on;
y2 = b(3,1) * x.^2 + b(2,1) * x + b(1,1); % 非线性回归结果
plot(x,y2,'r*');
t = 0:0.01:12;
xian_y = b(3,1) * t.^2 + b(2,1) * t + b(1,1); % 回归曲线
plot(t,xian_y,'-');
legend('原始数据','非线性回归结果','回归曲线');
xlabel('时间/年(记2007年为第0年)');
ylabel('房价/元');
运行结果如下:
a0 = 779.2418
a1 = 75.4540
a2 = 12.5899
结果图为:
--------------------------分割线----------------------------
Step2:只是求出了这三个参数还不够。我们还要分析一下在 1 - α = 0.95 的置信水平下,参数 a0 、 a1 和 a2 的置信区间是多少。我们利用matlab提供的 “[b, bint, r, rint, stats] = regress(因变量y, 自变量x, 显著性水平α)” ,即可以得到如下数据:
说明:
①regress()中的 α 为显著性水平(缺省时默认为0.05)
②b,bint 为 回归系数估计值 和 它们的置信区间
③r,rint 为 残差(向量) 及其 置信区间
④stats 是用于检验回归模型的统计量,有4个数值,第一个是拟合优度 R2,第二个是 对方程整体显著性检验 的 F检验 ,第三个是 p值,第四个是 误差方差的估计值 s 2 s^2 s2 。
整理运行结果后得到下面这张表:
由上表可知,R2=0.9989 表示因变量y(房价)的99.89%可由模型确定,F值 远远超过 F检验的临界值,p 远小于 α,因而该回归模型从整体来看是可用的。
补充: F检验 、 p值 、误差方差s2 的原理详见文章最后的参考附录[2]、[3]、[4]。
--------------------------分割线----------------------------
Step3:
得到最终表达式如下:
并将 y = 2010 - 2007 = 13 带入此方程,得到2010年估计的房价 y ^ ( 13 ) = 3887 ( 元 ) \hat y(13)=3887(元) y^(13)=3887(元)。
注:如果这道题单纯的只是个 回归分析问题 ,那么做到这里就可以了。顶多再加一张 残差分析图 ,利用 matlab 的函数 rcoplot(r,rint) 即可。如下图所示,最后再加一点文字分析即可。
注:因为这是 预测问题 ,所以还要继续做下去。
为了分析该结果的 合理性 和 准确性 ,我们还应该考虑这样的问题:如果说房价与年份之间有这么一个不为人知的 但是具有 “确定性” 的函数关系 y = y ( x ) y= y(x) y=y(x) ,而得到的函数 y = y ^ ( x ) y=\hat y(x) y=y^(x) 和它之间肯定具有一定的误差。我们不妨将此误差设为 ε ε ε ,则我么能得到一个关系式如下:
y = y ^ ( x ) + ε y=\hat y(x) + ε y=y^(x)+ε 而如果 ε ε ε 满足某个分布的话,我们就可以估计2010年房价的一个合适的范围,而不是 前面得到的 “3887” 这么一个 “光秃秃、干巴巴” 的值。
经过整理后,我们得到下表:
假设 ε ε ε 服从正态分布,即 ε ~ N( μ, σ2 ) ,不妨使用 矩估计 的方法来确定参数 μ ^ \hat μ μ^ 和 σ ^ \hat σ σ^ 的值,于是得到下面这个方程组:
手算后解得: μ ^ ≈ 0 \hat μ≈0 μ^≈0, σ ^ = 102 \hat σ=102 σ^=102。
由此可用matlab绘出 ε ε ε 的概率分布图 :
clc;clear;close all;
x = -300:1:300;
y = zeros(length(x));
miu = 0;
sigma = 102;
y = 1/(sqrt(2*pi)*sigma) * exp(-(x-miu).^2/(2*sigma.^2)) * 100;
plot(x,y)
ylabel('ε出现的概率(%)');
xlabel('房价(元)');
title('房价误差的正态分布图');
对于 ε ε ε 的概率分布图,我们希望找到一个 ε ε ε 的阈值 ε ′ ε' ε′ ,使得当 ∣ ε ∣ ≤ ε ′ |ε|≤ε' ∣ε∣≤ε′ 时, P ( ∣ ε ∣ ≤ ε ′ ) ≥ 0.7 P(|ε|≤ε')≥0.7 P(∣ε∣≤ε′)≥0.7 。这样做的目的是,我们希望得到一个房价区间,使2010年的 真实房价 落在这个区间的内的概率比较大(这里的 “比较大” 就是指取的 0.7 )。
由概率论可知,正态分布曲线是对称的。则由 P ( ε ≥ ε ′ ) = 1 2 × [ 1 − P ( ∣ ε ∣ ≤ ε ′ ) ] = 0.15 P(ε≥ε')=\frac {1}{2} \times [1-P(|ε|≤ε')]=0.15 P(ε≥ε′)=21×[1−P(∣ε∣≤ε′)]=0.15 ,可得 P ( ε ≤ ε ′ ) = 1 − P ( ε ≥ ε ′ ) = 0.85 P(ε≤ε')=1-P(ε≥ε')=0.85 P(ε≤ε′)=1−P(ε≥ε′)=0.85 。而 P ( ε ≤ ε ′ ) = Φ ( ε ′ − 0 102 ) P(ε≤ε')=Φ( \frac {ε'-0}{102}) P(ε≤ε′)=Φ(102ε′−0)。
查表 得出 Φ ( 1.04 ) = 0.85 Φ( 1.04) =0.85 Φ(1.04)=0.85,所以我们得到 ε ε ε 的阈值 ε ′ ε' ε′ 约为 100 (元)。【注:100 是由 ε ′ − 0 102 = 1.04 \frac {ε'-0}{102}=1.04 102ε′−0=1.04 解得到的】
综上所述,我们用 最小二乘法 的出 y ^ ( x ) \hat y(x) y^(x) 的表达式,并用此来预测了2010年的房价,同时分析了 y ^ ( x ) \hat y(x) y^(x) 和 y ( x ) y(x) y(x) 的误差 ε ε ε ,并得出结论:
在 70%的精确度 下,2010年的房价应该在 3887±100 元之内。
第一步:问题的分析(画散点图)
第二步:模型的建立(直观地找出适合的回归函数)
第三步:模型的求解(最小二乘法回归+检验+分析)
第四步:结果的分析及验证(额外内容,预测问题就要多做这一步)
最后,我没有详细地阐述其原理,只阐述了有什么用、怎么用。如要了解详细的原理,可以看看文章最后的 参考附录 吧。
[1] 《数学建模——区分“拟合、插值、多元线性回归、逻辑回归、逐步回归、最小二乘法”等概念【概念篇】》
链接: https://blog.csdn.net/Wang_Dou_Dou_/article/details/118739458?spm=1001.2014.3001.5501.
[2] 《F检验》
链接: https://baike.baidu.com/item/F%E6%A3%80%E9%AA%8C/9910842?fr=aladdin.
[3] 《P值》
链接: https://baike.baidu.com/item/P%E5%80%BC.
[4] 《如何用stata求误差方差 s2 的估计值》 看追问的那条回复即可
链接: https://zhidao.baidu.com/question/397143810094044805.html.
[5] 《最小二乘法多元线性回归_使用Matlab解决多元线性回归问题》这里面有教如何清理异常数据
链接: https://blog.csdn.net/weixin_39636645/article/details/112712714.
[6] 《数学建模之数据拟合(3):最小二乘法》看完这个视频,你可以 更友好地理解 最小二乘法
链接: https://www.bilibili.com/video/BV1q741177US?from=search&seid=12421359005753840035.
数学建模系列文章——总结篇:《数模美一国一退役选手的经验分享[2021纪念版]》.
⭐️ ⭐️