IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数学建模——基于 最小二乘法 的 回归分析 →预测问题(工具:matlab,线性回归和非线性回归通用) -> 正文阅读

[数据结构与算法]数学建模——基于 最小二乘法 的 回归分析 →预测问题(工具:matlab,线性回归和非线性回归通用)


我尽量用通俗的语言来描述。

虽然这道题是 非线性回归 的问题,但其 做题步骤做题思想 和 线性回归 是相似的,也可作参考。


一、最小二乘法是什么?

??最小二乘法(又称最小平方法)是一种数学优化技术。它通过 最小化误差的平方 和寻找数据的最佳函数匹配。

??利用最小二乘法可以简便地求得 未知 的数据,并使得这些求得的 数据与实际数据 之间 误差的平方和 为最小 。

??曲线拟合 可用最小二乘法来进行进行 参数估计 (即用来估计斜率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

??并找到合适的参数 a0 、 a1 、 a2
??使得
在这里插入图片描述

??达到最小值。


第三步:模型的求解


??这一步相当于要求我们找到三个参数来求 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,如下如所示:

在这里插入图片描述
??如想知道为什么要这么做,知其具体原理,详见参考附录[6]

??用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绘出 ε ε ε 的概率分布图 :

在这里插入图片描述
??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.


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:26:57  更:2021-07-22 14:28:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:21:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计