使用目标:
与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟 合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所 有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。
最基础的一次函数拟合
plot(x,y,'o') % 给x和y轴加上标签 xlabel('x的值') ylabel('y的值')
<注:代码文件:code1.m >数据文件:data1.xlsx
将数据导入到matlab时,我们是分别创建了两个变量:x和y,每个变量仅保存一列数据。(指建立了两列,一列x,一列y)
最小二乘法
问题:
设这些样本点为
我们设置的拟合曲线为
问:k和b取何值的时候,样本点和拟合曲线最接近
定义:
求解(计算过程太复杂了...略)
代码
文件: code1.m
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 % 显示网格线 f=@(x) k*x+b; fplot(f,[2.5,7]); legend('样本数据','拟合函数','location','SouthEast')
判断拟合好坏
拟合优度(可决系数): | |
总体平方和SST: | |
回归平方和SSR: | |
SST=SSE+SSR | |
R^2越接近1,说明误差平方和越接近0,误差越小说明拟合的越好 |
线性函数在此指的是对参数为线性,意思是参数都是一次的
在函数中,参数仅以一次方出现,且不能乘以或除以其他任何的参数,并不 能出现参数的复合函数形式。
拟合优度的代码
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 R_2 = SSR / SST
文件:code1.m (mean()是求均值的函数)
matlab拟合工具箱
命令窗口输入cftool
注:cftool可以做出三维图,十分高级
自己模拟数据进行演示
randi : 产生均匀分布的随机整数
%产生一个1至10之间的随机矩阵,大小为2x5; s1 = randi(10,2,5); %产生一个-5至5之间的随机矩阵,大小为1x10; s2 = randi([-5,5],1,10);rand: 产生均匀分布的随机数
%产生一个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);normrnd:产生正态分布的随机数
%产生一个均值为0,标准差为2的正态分布的随机矩阵,大小为3x4; s5 = normrnd(0,2,3,4);roundn—任意位位置四舍五入
a = 3.1415 roundn(a,-2) % ans = 3.1400 roundn(a,2) % ans = 0 a =31415 roundn(a,2) % ans = 31400代码文件:code2
附注:代码文件code3.m用于自己模拟数据进行演示