最小二乘法
拟合算法和插值算法比较相似,
插值算法所得到的函数必须经过每一个点
但拟合算法是要求误差较小,不必要经过所有的已知点
最小二乘法的核心
最小二乘法是用线性拟合的方法以最小的误差得到近似曲线
最小二乘法判断样本点和拟合曲线最接近
预测值和真实值的差的平方和最小
这就是最小二乘法的核心思想
额外说一下,学过概率论的话我们可以知道最小二乘法和极大似然估计求解是一样的。
求解k和b
在这个公式中k和b作为未知参数来求解,一般我们求解的方法就是一次函数求导令其等于零,然后解出未知参数,这里我们可以当这是一个二元函数,分别对k和b求偏导,令各自的偏导数为零,这样的话两个未知数和两个方程就可以求解出我们想要的结果了
求解的最终结果应该为:
当然这里要说明一下:
严格的来说一阶导数为零并不能证明在此处求得的函数值就为极小值,必须通过
判断二阶导数来进一步判断,但此处就不做过多的讨论了,已经得证这样计算出来的k和b就是我们想要的结果
如何评判拟合效果呢?
一般的我们用拟合优度来评价拟合效果的好坏
这里涉及到三个定义:
这里的SST=SSE+SSR
R^2 越接近1说明拟合效果越好
拟合疑问
1.在这里刚开始的时候大家可能会像我一样有一个疑问,按照公式来说的话只要误差平方和越小即SSE越小,拟合效果不就越好吗?没有必要关注其他两个呀。
这里解释一下,如果只关注SSE会存在量纲的问题,所以需要去量纲来得到一个统一的标准。
2.如果SSE越小越好的话就是让SSE为0最好,如果你学过数值计算方法的话,这里我们可以用插值法,就可以经过所有的插值点从而使得误差平方和为0,不久没有误差了,这样不就是最优解了吗?这么说的话我们是不是可以用插值法去解决所有的拟合问题,拟合方法的存在就没有意义了。
其实不是那样的,你可以去看一些关于拟合的解释的书本,你会发现,拟合其实是为了使用一种简单的函数去完成特定的表示,换句话说,如果对于n+1个样本点如果你去构造了一个n次的多项式,经过了所有的n+1个点,这样的话你的误差平方和一定为0,但这样得到的函数太过于复杂,不利于我们接下来对问题的解决,而拟合就是为了能够用较低的幂次的函数或者形式较为简单的函数去解决我们接下来面对的问题。
实例
对于这样的一组x和y用线性拟合的方法确定函数
clear;clc
load test_data
plot(x,y,'o')
xlabel('x的值') %给横坐标赋予名字
ylabel('y的值') %给纵坐标赋予名字
n = size(x,1); %计算x的大小,因为x是行向量所以计算x的行数即可
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]); %从2.5到7画线
legend('样本数据','拟合函数','location','SouthEast') %注解说明
%%这里说明一下隐匿函数 @后面的括号中是自变量 括号后面是表达式 f是自变量
%%接下来计算拟合优度
y_hat = k*x+b;
SSR = sum((y_hat-mean(y)).^2); %mean函数是求均值的函数
SSE = sum((y_hat-y).^2);
SST = sum((y-mean(y)).^2);
SST-SSE-SSR
R_2 = SSR/SST
这个是用matlab实现的代码
这个是运行结果。
本次的介绍就到这里了。
还有一个彩蛋,你真的知道什么是线性函数吗,y=a+bx^2是不是线性函数呢???