matlab拟合算法

Dear-linko 68 0 本文共2505个字
前言

与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)

插值与拟合的区别

插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是拟合的思想。(拟合的结果是得到一个确定的曲线)

这里的拟合算法是基于最小二乘法实现

最小二乘法的几何解释

假设给定一组样本点,确定的拟合曲线是:\(y=kx+b\)

使用\(\hat{k},\hat{b}=arg_{k,b}\min \left( \sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2} \right) \)确定\(k,b\)的值

求解最小二乘法

\(\hat{k},\hat{b}=arg_{k,b}\min \left( \sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2} \right) =arg_{k,b}\min \left( \sum_{i=1}^n{\left( y_i-kx_i-b \right) ^2} \right) \)

令:\(L=\sum_{i=1}^n{\left( y_i-kx_i-b \right)}^2\),要找\(k,b\)使得\(L\)最小

最后求解得:

\(\hat{k}=\frac{n\sum_{i=1}^n{x_iy_i-\sum_{i=1}^n{y_i\sum_{i=1}^n{x_i}}}}{n\sum_{i=1}^n{x_{i}^{2}-\sum_{i=1}^n{x_i\sum_{i=1}^n{x_i}}}}\)

\(\hat{b}=\frac{\sum_{i=1}^n{x_{i}^{2}\sum_{i=1}^n{y_i}-\sum_{i=1}^n{x_i\sum_{i=1}^n{x_iy_i}}}}{n\sum_{i=1}^n{x_{i}^{2}-\sum_{i=1}^n{x_i\sum_{i=1}^n{x_i}}}}\)

matlab求解最小二乘法

x = [4.2,5.9,2.7,3.8,3.8,5.6,6.9,3.5,3.6,2.9,4.2,6.1,5.5,6.6,2.9,3.3,5.9,6,5.6];
y = [8.4,11.7,4.2,6.1,7.9,10.2,3.2,6.6,6,4.6,8.4,12,10.3,13.3,4.6,6.7,10.8,11.5,9.9];
plot(x,y,'o')
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))

当然我们可以画出拟合曲线看看效果[aru_19]

hold on % 继续在之前的图形上来画图形
grid on % 显示网格线
xx = 2.5: 0.1 :7  % 间隔设置的越小画出来的图形越准确
yy = k * xx + b  % k和b都是已知值
plot(xx,yy,'-')

结果如图:


matlab拟合算法

还可以使用匿名函数进行画图

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) 将匿名函数f在指定区间xinterval绘图。xinterval =  [xmin xmax] 表示定义域的范围

拟合效果好坏的依据

拟合优度(可决系数)\(R^2\)

总体平方和:\(SST=\sum_{i=1}^n{\left( y_i-\bar{y} \right)}^2\)

误差平方和:\(SSE=\sum_{i=1}^n{\left( y_i-\hat{y}_i \right)}^2\)

回归平方和:\(SSR=\sum_{i=1}^n{\left( \hat{y}_i-\bar{y} \right)}^2\)

可以证明:\(SST=SSE+SSR\)

MATLAB因为浮点数的影响,有时候会有误差

拟合优度:\(0\le R^2=\frac{SSR}{SST}=\frac{SST-SSE}{SST}=1-\frac{SSE}{SST}\le 1\)

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

那么什么是线性函数呢?[aru_14],我们这里说的线性函数是指对参数为线性;通俗的来讲就是在函数中,参数仅以一次方出现,且不能乘以或除以其他任何的参数,并不能出现参数的复合函数形式。[aru_2]

matlab拟合优度代码

y_hat = k*x+b; % y的拟合值
SSR = sum((y_hat-mean(y)).^2)  % 回归平方和
SSE = sum((y_hat-y).^2) % 误差平方和
SST = sum((y-mean(y)).^2) % 总体平方和
SST-SSE-SSR   % 5.6843e-14  =   5.6843*10^-14   matlab浮点数计算的一个误差
R_2 = SSR / SST

当然matlab还为我们提供了拟合工具箱cftool(提供图片基本教程)

matlab拟合算法

发表评论 取消回复
表情 图片 链接 代码

分享