最⼩⼆乘法及其python实现详解
最⼩⼆乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马⾥·勒让德于1806年提出)。它通过最⼩化误差的平⽅和寻数据的最佳函数匹配。利⽤最⼩⼆乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平⽅和为最⼩。最⼩⼆乘法还可⽤于曲线拟合。其他⼀些优化问题也可通过最⼩化能量或最⼤化熵⽤最⼩⼆乘法来表达。
那什么是最⼩⼆乘法呢?别着急,我们先从⼏个简单的概念说起。
假设我们现在有⼀系列的数据点,那么由我们给出的拟合函数h(x)得到的估计量就是,那么怎么
评估我们给出的拟合函数与实际待求解的函数的拟合程度⽐较⾼呢?这⾥我们先定义⼀个概念:残差,我们估计拟合程度都是在残差的基础上进⾏的。下⾯再介绍三种范数:
• ∞-范数:残差绝对值的最⼤值,即所有数据点中残差距离的最⼤值
• 1-范数:绝对残差和,即所有数据点残差距离之和
• 2-范数:残差平⽅和
前两种范数是最容易想到,最⾃然的,但是不利于进⾏微分运算,在数据量很⼤的情况下计算量太⼤,不具有可操作性。因此⼀般使⽤的是2-范数。
说了这么多,那范数和拟合有什么关系呢?拟合程度,⽤通俗的话来讲,就是我们的拟合函数h(x)与待求解的函数y之间的相似性。那么2-范数越⼩,⾃然相似性就⽐较⾼了。
由此,我们可以写出最⼩⼆乘法的定义了:
对于给定的数据,在取定的假设空间H中,求解h(x)∈H,使得残差的2-范数最⼩,即
从⼏何上讲,就是寻与给定点距离平⽅和最⼩的曲线y=h(x)。h(x)称为拟合函数或者最⼩⼆乘解,求解拟合函数h(x)的⽅法称为曲线拟合的最⼩⼆乘法。
那么这⾥的h(x)到底应该长什么样呢?⼀般情况下,这是⼀条多项式曲线:
这⾥h(x,w)是⼀个n次多项式,w是其参数。
也就是说,最⼩⼆乘法就是要到这样⼀组,使得最⼩。
那么如何到这样的w,使得其拟合函数h(x)与⽬标函数y具有最⾼拟合程度呢?即最⼩⼆乘法如何求解呢,这才是关键啊。
假设我们的拟合函数是⼀个线性函数,即:
(当然,也可以是⼆次函数,或者更⾼维的函数,这⾥仅仅是作为求解范例,所以采⽤了最简单的线性函数)那么我们的⽬标就是到这样的w,
这⾥令为样本的平⽅损失函数
这⾥的Q(w)即为我们要进⾏最优化的风险函数。
学过微积分的同学应该⽐较清楚,这是⼀个典型的求解极值的问题,只需要分别对 18 求偏导数,然后令偏导数为0,即可求解出极值点,即:
接下来只需要求解这个⽅程组即可解出w_i 的值
============ 分割分割 =============
上⾯我们讲解了什么是最⼩⼆乘法,以及如何求解最⼩⼆乘解,下⾯我们将通过Python来实现最⼩⼆乘法。
这⾥我们把⽬标函数选为y=sin(2πx),叠加上⼀个正态分布作为噪⾳⼲扰,然后使⽤多项式分布去拟合它。
代码:
# _*_ coding: utf-8 _*_
# 作者: yhao
# 博客: blog.csdn/yhao2014
# 邮箱: yanhao07@sina
import numpy as np # 引⼊numpy
import scipy as sp
import pylab as pl
from scipy.optimize import leastsq # 引⼊最⼩⼆乘函数
n = 9 # 多项式次数
# ⽬标函数
def real_func(x):
return np.sin(2 * np.pi * x)
# 多项式函数
def fit_func(p, x):
f = np.poly1d(p)
正则化的最小二乘法曲线拟合pythonreturn f(x)
# 残差函数
def residuals_func(p, y, x):
ret = fit_func(p, x) - y
return ret
x = np.linspace(0, 1, 9) # 随机选择9个点作为x
x_points = np.linspace(0, 1, 1000) # 画图时需要的连续点
y0 = real_func(x) # ⽬标函数
y1 = [al(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数
p_init = np.random.randn(n) # 随机初始化多项式参数
plsq = leastsq(residuals_func, p_init, args=(y1, x))
print 'Fitting Parameters: ', plsq[0] # 输出拟合参数
pl.plot(x_points, real_func(x_points), label='real')
pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')
pl.plot(x, y1, 'bo', label='with noise')
pl.legend()
pl.show()
输出拟合参数:
图像如下:
从图像上看,很明显我们的拟合函数过拟合了,下⾯我们尝试在风险函数的基础上加上正则化项,来降低过拟合的现象:
为此,我们只需要在残差函数中将lambda^(1/2)p加在了返回的array的后⾯
regularization = 0.1 # 正则化系数lambda
# 残差函数
def residuals_func(p, y, x):
ret = fit_func(p, x) - y
ret = np.append(ret, np.sqrt(regularization) * p) # 将lambda^(1/2)p加在了返回的array的后⾯
return ret
输出拟合参数:
图像如下:
很明显,在适当的正则化约束下,可以⽐较好的拟合⽬标函数。
注意,如果正则化项的系数太⼤,会导致⽋拟合现象(此时的惩罚项权重特别⾼)
如,设置regularization=0.1时,图像如下:
此时明显⽋拟合。所以要慎重进⾏正则化参数的选择。
以上这篇最⼩⼆乘法及其python实现详解就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。