拟合算法 (matlab工具箱)
拟合算法:
1线性最小二乘法拟合
使用matlab进行求解
拟合优度:R^2
拟合优度的matlab代码:
2,Matlab工具箱的教学
一些函数:
拟合算法:
插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象
尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到-个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是拟合的思想。(拟合的结果是得到一个确定的曲线)
1线性最小二乘法拟合
原理:假设数据点(Xi,Yi),i=1,2.....,n.我们希望找到一条直线y=ax+b来最佳拟合这些数据。最佳拟合的标准是使各数据点到直线的纵向距离的平方和最小,即最小化目标函数
通过对a和b求偏导数,并令偏导数为 0,可得到关于a和b的方程组,解方程组即可求得a和b的值。(让s最小)
这个S在机器学习中也叫损失函数,在回归中被叫做残差平方和
a就是,b就是
使用matlab进行求解
clear;clc
load data1
plot(x,y,'o')
% 给x和y轴加上标签
xlabel('x的值')
ylabel('y的值')
n = size(x,1);%有多少个x就有多少个样本
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
%x.*y后求和,表示∑xi*yi,后面的依次是∑yi和∑xi
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')
% fplot函数可用于画出匿名一元函数的图形。
% fplot(f,xinterval) 将匿名函数f在指定区间xinterval绘图。xinterval = [xmin xmax] 表示定义域的范围
拟合优度:R^2
下面的表示实际值,表示平均值,表示拟合值
总体平方和SST:
误差平方和SSE:
回归平方和SSR:
这里的SST==SSE+SSR
拟合优度R^2:
这里的R^2越接近1越好,同理,可以简单的说SSE占比SST越小越好
这里的R^&2只能拟合线性函数(这里的线性指的是a和b是线性,而不是x),否则建议给SSE
拟合优度的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
2,Matlab工具箱的教学
左上角选择数据
下面是自动拟合的
它告诉我们使用的是
一些其他数据
可以我们自己选择拟合的函数
如果选择的是指数,就会是这样
也可以二次函数拟合
下面是例题
下表给出了近2个世纪的美国人口统计数据(单位:百万人),请使用最下面给定的拟合函数预测后30年的美国人口。
这里的xm和r是两个拟合的参数,t表示年份,x(t)表示第t年的人口
在cftool中导入数据后,自定义函数
发现图像没收敛
这里的问题是拟合起点有问题,需要我们更改拟合的起点
更改后就可以发现拟合就比较好了
之后直接导出使用就好了
一些函数:
% (1)randi : 产生均匀分布的随机整数(i = int)
%产生一个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