ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数学建模4 拟合算法

2020-01-31 18:07:12  阅读:360  来源: 互联网

标签:函数 sum 曲线 建模 平方和 算法 拟合 SSE


1、插值与拟合

插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。尽管我们可以选择分段的方法避免这种现象,但是更多时候我们倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但是只要保证误差足够小即可。
拟合算法:与插值算法不同,在拟合问题中不需要曲线一定经过给定的点,拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。

即插值算法得到的曲线过样本的所有已知点,拟合算法得到的曲线不需要过所有的数据点。

插值问题和拟合问题如何选择? 样本量多优先选拟合
当样本已知数据点小于30时,用插值算法,大于30个点时(大样本)使用拟合算法(曲线及置信区间)。

2、举例:找出x和y之间的拟合曲线

在这里插入图片描述
步骤一:根据表格数据做散点图
代码如下:

clear;clc
load  data1
plot(x,y,'o')
% 给x和y轴加上标签
xlabel('x的值')
ylabel('y的值')

在这里插入图片描述
步骤二:由散点图分布可知,可用直线拟合数据点
设拟合曲线y=kx+b,但是当k和b取何值时,样本点和拟合曲线最为接近。
在这里插入图片描述
但是我们如何去定义这个接近呢?
即所求数据点到直线的距离之和应该最小,距离有两种方式表示,绝对值和平方和表示。
两种定义方法如下:
数学中 arg min的意思:argmin 就是使后面这个式子达到最小值时的k,b的取值。
在这里插入图片描述
第一种带绝对值求解不方便,不容易求导,因此计算比较复杂。所以我们往往使用第二种定义,这也正是最小二乘的思想,也就是真实值和拟合值的所有的差值之和最小。
最小二乘法证明过程:
在这里插入图片描述
我们即可解出k,b的值,并在图中画出拟合直线,完整代码如下:

clear;clc
load  data1
plot(x,y,'o')
% 给x和y轴加上标签
xlabel('x的值')
ylabel('y的值')
n = size(x,1);
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x))
hold on % 继续在之前的图形上来画图形
grid on % 显示网格线

% % 画出y=kx+b的函数图像 plot(x,y)
% % 传统的画法:模拟生成x和y的序列,比如要画出[0,5]上的图形
% x = 0: 0.1 :5  % 间隔设置的越小画出来的图形越准确
% y = k * x + b  % k和b都是已知值
% plot(x,y,'-')

f=@(x) k*x+b;
fplot(f,[min(x)-1,max(x)+1]);
legend('样本数据','拟合函数','location','SouthEast')

matlab匿名函数用法:

% 匿名函数的基本用法。
% handle = @(arglist) anonymous_function
% 其中handle为调用匿名函数时使用的名字。
% arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。
% anonymous_function为匿名函数的表达式。
% 举个小例子
% % >> z=@(x,y) x^2+y^2; 
% % >> z(1,2) 
% % ans =  5
% fplot函数可用于画出匿名函数的图形。
% fplot(f,xinterval) 将在指定区间绘图。将区间指定为 [xmin xmax] 形式的二元素向量。

在这里插入图片描述
步骤三:评价拟合好坏
在这里插入图片描述
证明SST=SSE+SSR(可以忽略)
在这里插入图片描述
mean是求均值的函数

y_hat = k*x+b; % y的拟合值
SSR = sum((y_hat-mean(y)).^2)  % 回归平方和
% mean()用于求均值
SSE = sum((y_hat-y).^2) % 误差平方和
SST = sum((y-mean(y)).^2) % 总体平方和
SST-SSE-SSR
R_2 = SSR / SST

R的平方越接近1,说明误差平方和越接近0,误差越小,说明拟合越好。
注意:R的平方只能用于拟合函数是线性函数时,拟合结果的评价。线性函数和其他函数(指数函数)比较拟合的好坏,直接看SSE即可。R的平方可能是负数。

3、通过cftool matlab自带的拟合工具箱来进行数据拟合

在窗口中输入cftool,打开拟合工具箱。
评价拟合模型的好坏:
主要
1.看指数平方和:SSE的值越小越好。
2.拟合的简洁性原则。就是尽量保证拟合的函数简洁更好。

具体过程如图:
在这里插入图片描述
界面说明
在这里插入图片描述
例题2:已知30个数据点,横坐标x由(0,10)之间的随机数,纵坐标服从,在这里插入图片描述
代码

clear;clc 
x = rand(30,1) * 10;
y = 3 * exp(0.5*x) -5 + normrnd(0,1,30,1);
cftool

在这里插入图片描述
图上所示:设置x data(横坐标数据源)为x ,Y data(纵坐标数据源)为Y,设置拟合函数为指数形式,且为1次函数。此时误差平方和SSE:243.7 对应的函数形式为f(x)=2.434exp(0.521X)
通过调节函数形式得到不同的函数
当设置函数为指数,一元二次函数形式
在这里插入图片描述
SSE为:27.28,相比一元一次函数,一元二次函数的误差更小,且原函数也为指数函数。则选择此函数形式

f(x)=3.232exp(0.4933x)-4.851*exp(0.0628x)

总结:
函数选择原则:
当散点图走势是直线,优先选线性拟合,评价指标为SSE和R平方,SSE越小越好,R平方越大越好。
其他的函数选择条件是SSE越小越好,且不是线性拟合时不能用R平方来评价。
其他:函数形式应当越简单越好。

old sweet ᝰ 发布了41 篇原创文章 · 获赞 2 · 访问量 886 私信 关注

标签:函数,sum,曲线,建模,平方和,算法,拟合,SSE
来源: https://blog.csdn.net/weixin_43444687/article/details/104123929

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有