请数模之神不要放弃我-拟合算法

拟合算法[清风正4]

拟合的结果是得到一个确定的曲线(不一定过每一个样本点

理论知识:最小二乘法
  1. \hat{k},\hat{b}= arg min\left ( \sum_{i=1}^{n}\left | y_{i}-\hat{y_{i}} \right | \right )        存在绝对值,不易求导,不用这个
  2. \hat{k},\hat{b}= arg min\left ( \sum_{i=1}^{n}\left ( y_{i}-\hat{y_{i}} \right )^{2} \right )     ​​​​​​[k,b使得后面括号内函数最小] 用这个

故令L= \sum_{i=1}^{n}\left ( y_{i}-kx_{i}-b \right )^{2}最小,求导,令一阶导数为0

k=... b=...

对应MATLAB代码:

% 工作区新建变量,复制导入数据,完成导入后,可将所有数据变量保存为当前文件夹下的.mat

% 再次加载数据
load data

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 % 显示网格图

% 匿名函数 handle=@(arglist)anonymous_function    
% eg: z=@(x,y)x^2+y^2;
% z(1,2)
%% ans = 5
f=@(x)k*x+b;

% fplot 可用于画匿名一元函数
fplot(f[2.5,7]); % 画出2.5到7上的一元函数
% 设置图例,SouthEast在右下角,其他同理
legend('样本数据','拟合函数’,‘location','SouthEast') 
拟合优度(可决系数)R²(评价拟合的好坏

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

误差平方和SSE:\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^{2}

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

SST = SSE - SSR

拟合优度:0 <= R² = SSR/SST = 1 - SSE/SST <= 1

R²越接近1,说明误差平方和越接近0,误差越小,拟合程度越好

注:R²只能用于拟合函数是线性函数时评价

线性函数与其他函数(如指数函数)比较拟合好坏时,直接看SSE即可

但直接看SSE时,要考虑到量纲的统一问题

关于线性函数的定义

这里的线性函数是对参数为线性(线性于参数)

对参数为线性即,Y的条件期望E(Y|Xi)是参数的一个线性函数,它可以是或不是变量X的线性函数

eg:y = a + bx²是线性函数,假设x = 3,E(Y|X=3) = a + 9b,是线性函数,可以用R²评价拟合好坏

参数仅以一次方出现,不能乘除其他参数,也不能出现参数的复合函数形式。

对应代码:

y_hat = k*x+b;
SSR = sum((y_hat-mean(y)).^2)
SSE = sum((y_hat-y).^2)
SST = sum((y-mean(y)).^2)

R_2 = SSR/SST

MATLAB曲线拟合工具箱

多项式比较好用

中心化可以去除量纲

图像导出时如果不够清晰记得改分辨率

拟合不收敛时,考虑更改起始点

模拟数据
% (1)randi : 产生均匀分布的随机整数
%产生一个1至10之间的随机整数矩阵,大小为2x5;
s1 = randi(10,2,5)
%产生一个-5至5之间的随机整数矩阵,大小为1x10;
s2 = randi([-5,5],1,10)

%  (2) rand: 产生0至1之间均匀分布的随机数
%产生一个0至1之间的随机矩阵,大小为1x5;
s3 = rand(1,5)
%产生一个a至b之间的随机矩阵,大小为1x5;  % a + (b-a) * rand(1,5); 如:a,b = 2,5
s4= 2 + (5-2) * rand(1,5)

% (3)normrnd:产生正态分布的随机数
%产生一个均值为0,标准差(方差开根号)为2的正态分布的随机矩阵,大小为3x4;
s5 = normrnd(0,2,3,4)

% (4)roundn—任意位置四舍五入
% 0个位 1十位  2百位 -1小数点后一位  
a = 3.1415
roundn(a,-2)    % ans   =  3.1400
roundn(a,2)      % ans   =  0
a =31415
roundn(a,2)   % ans  = 31400
roundn(5.5,0)  %6
roundn(5.5,1) %10

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值