python函数拟合误差 python拟合曲线误差分析( 二 )


将点(2,3),(5,8)(2,3),(5,8)带入方程,可以得到3个方程 , 
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
联立这三个方程求解,发现有无穷多的解,只能得到3w1+21w2=53w1+21w2=5 , 这三个方程是线性相关的,故没有唯一解 。
??该方法通过求偏导,再联立方程求解 , 比较复杂,看着也很不美观 。那么有没有更加方便的方法呢?
3.2 最小二乘法
?? 其实求解该最优化问题(平方和的最小值)一般会采用最小二乘法(其实最小二乘法和求偏导再联立方程求解的方法无本质区别,求偏导也是最小二乘法,只是这里介绍最小二乘的矩阵形式而已) 。最小二乘法(least squares),从英文名非常容易想到,该方法就是求解平方和的最小值的方法 。
??可以将误差函数以矩阵的表示(NN个点,最高MM阶)为:
∥Xw?y∥2
‖Xw?y‖2
其中 , 把偏置bb融合到了参数ww中 , 
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX则表示输入矩阵,
??????11...1x1x2...xNx21x22...x2N............xM1xM2...xMN??????
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy则表示标注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最优化问题可以重新表示为
minw∥Xw?y∥2
minw‖Xw?y‖2
对其求导,
?∥Xw?y∥2?w=?(Xw?y)T(Xw?y)?w=?(wTXT?yT)(Xw?y)?w=?(wTXTXw?yTXw?wTXTy+yTy)?w
?‖Xw?y‖2?w=?(Xw?y)T(Xw?y)?w=?(wTXT?yT)(Xw?y)?w=?(wTXTXw?yTXw?wTXTy+yTy)?w
在继续对其求导之前,需要先补充一些矩阵求导的先验知识(常见的一些矩阵求导公式可以参见转载的博客),如下:
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
根据上面的矩阵求导规则,继续进行损失函数的求导
?∥Xw?y∥2?w=?(wTXTXw?yTXw?wTXTy+yTy)?w=XTXw+(XTX)Tw?(yTX)T?XTy=2XTXw?2XTy
?‖Xw?y‖2?w=?(wTXTXw?yTXw?wTXTy+yTy)?w=XTXw+(XTX)Tw?(yTX)T?XTy=2XTXw?2XTy
其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求导结果等于0,即可以求导问题的最小值 。
2XTXw?2XTy=0w=(XTX)?1XTy
2XTXw?2XTy=0w=(XTX)?1XTy
??再利用最小二乘法的矩阵形式对前面的例子进行求解,用二阶多项式拟合即两个点(2,3),(5,8)(2,3),(5,8) 。
表示输入矩阵 XX和标签向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
计算XTXXTX
XTX=???272972913329133641???
XTX=[272972913329133641]
矩阵求逆,再做矩阵乘法运算
但 XTXXTX不可逆 , 故无唯一解 。
??关于矩阵的逆是否存在,可以通过判断矩阵的行列式是否为0(det(A)=?0det(A)=?0 来判断,也可以通过初等行变换,观察矩阵的行向量是否线性相关,在这个例子下,矩阵不可逆 , 故有无穷多解 。但如果新增一个点(4,7)(4,7) , 则就可以解了 。
??其实这和数据集的点数和选择的阶数有关,如果点数小于阶数则会出现无穷解的情况 , 如果点数等于阶数,那么刚好有解可以完全拟合所有数据点 , 如果点数大于阶数 , 则会求的近似解 。
??那么对于点数小于阶数的情况,如何求解?在python的多项式拟合函数中是可以拟合的,而且效果不错 , 具体算法不是很了解,可以想办法参考python的ployfit()函数的实现 。
4. 拟合阶数的选择
?? 在前面的推导中,多项式的阶数被固定了,那么实际场景下应该如何选择合适的阶数MM呢?
一般会选择阶数MM小于点数NN
把训练数据分为训练集合验证集,在训练集上,同时用不同的MM值训练多个模型,然后选择在验证集误差最小的阶数script type="math/tex" id="MathJax-Element-5573"M/script

推荐阅读