拟合算法[清风正4]
拟合的结果是得到一个确定的曲线(不一定过每一个样本点
理论知识:最小二乘法
- 存在绝对值,不易求导,不用这个
- [k,b使得后面括号内函数最小] 用这个
故令最小,求导,令一阶导数为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:
误差平方和SSE:
回归平方和SSR:
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