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平方来评价。
其他:函数形式应当越简单越好。