最小二乘法及其python实现详解

  • A+
所属分类:技术教程
最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小

最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。MUC无言之家
它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。MUC无言之家
最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。MUC无言之家

那什么是最小二乘法呢?别着急,我们先从几个简单的概念说起。MUC无言之家

假设我们现在有一系列的数据点最小二乘法及其python实现详解MUC无言之家
那么由我们给出的拟合函数h(x)得到的估计量就是最小二乘法及其python实现详解MUC无言之家
那么怎么评估我们给出的拟合函数与实际待求解的函数的拟合程度比较高呢?MUC无言之家
这里我们先定义一个概念:残差最小二乘法及其python实现详解 MUC无言之家
MUC无言之家
我们估计拟合程度都是在残差的基础上进行的。下面再介绍三种范数:MUC无言之家
 MUC无言之家

• ∞-范数:残差绝对值的最大值 最小二乘法及其python实现详解 ,即所有数据点中残差距离的最大值MUC无言之家

• 1-范数:绝对残差和最小二乘法及其python实现详解 ,即所有数据点残差距离之和MUC无言之家

• 2-范数:残差平方和 最小二乘法及其python实现详解MUC无言之家
MUC无言之家
 MUC无言之家

前两种范数是最容易想到,最自然的,但是不利于进行微分运算,在数据量很大的情况下计算量太大,不具有可操作性。因此一般使用的是2-范数。MUC无言之家

说了这么多,那范数和拟合有什么关系呢?拟合程度,用通俗的话来讲,就是我们的拟合函数h(x)与待求解的函数y之间的相似性。那么2-范数越小,自然相似性就比较高了。MUC无言之家

由此,我们可以写出最小二乘法的定义了:MUC无言之家

对于给定的数据 最小二乘法及其python实现详解 MUC无言之家
在取定的假设空间H中,求解h(x)∈HMUC无言之家
使得残差 最小二乘法及其python实现详解 的2-范数最小,MUC无言之家
最小二乘法及其python实现详解MUC无言之家

从几何上讲,就是寻找与给定点 MUC无言之家
 MUC无言之家
距离平方和最小的曲线y=h(x)。h(x)称为拟合函数或者最小二乘解,求解拟合函数h(x)的方法称为曲线拟合的最小二乘法。MUC无言之家

那么这里的h(x)到底应该长什么样呢?一般情况下,这是一条多项式曲线:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

这里h(x,w)是一个n次多项式,w是其参数。MUC无言之家

也就是说,最小二乘法就是要找到这样一组 MUC无言之家
最小二乘法及其python实现详解 MUC无言之家
使得 最小二乘法及其python实现详解 最小。MUC无言之家

那么如何找到这样的w,使得其拟合函数h(x)与目标函数y具有最高拟合程度呢?即最小二乘法如何求解呢,这才是关键啊。MUC无言之家

假设我们的拟合函数是一个线性函数,即:MUC无言之家
最小二乘法及其python实现详解MUC无言之家

(当然,也可以是二次函数,或者更高维的函数,这里仅仅是作为求解范例,所以采用了最简单的线性函数)那么我们的目标就是找到这样的w,MUC无言之家

最小二乘法及其python实现详解MUC无言之家

这里令 最小二乘法及其python实现详解 为样本 最小二乘法及其python实现详解 的平方损失函数MUC无言之家

这里的Q(w)即为我们要进行最优化的风险函数。MUC无言之家

学过微积分的同学应该比较清楚,这是一个典型的求解极值的问题,只需要分别对 18 求偏导数,然后令偏导数为0,即可求解出极值点,即:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

接下来只需要求解这个方程组即可解出w_i 的值MUC无言之家

============ 分割分割 =============MUC无言之家

上面我们讲解了什么是最小二乘法,以及如何求解最小二乘解,下面我们将通过Python来实现最小二乘法。MUC无言之家

这里我们把目标函数选为y=sin(2πx),叠加上一个正态分布作为噪音干扰,然后使用多项式分布去拟合它。MUC无言之家

代码:

# _*_ coding: utf-8 _*_MUC无言之家

# 作者: yhaoMUC无言之家
# 博客: http://blog.csdn.net/yhao2014MUC无言之家
# 邮箱: yanhao07@sina.comMUC无言之家
  MUC无言之家
import numpy as np # 引入numpyMUC无言之家
import scipy as spMUC无言之家
import pylab as plMUC无言之家
from scipy.optimize import leastsq # 引入最小二乘函数MUC无言之家
  MUC无言之家
n = 9 # 多项式次数MUC无言之家
  MUC无言之家
  MUC无言之家
# 目标函数MUC无言之家
def real_func(x):MUC无言之家
 return np.sin(2 * np.pi * x)MUC无言之家
  MUC无言之家
  MUC无言之家
# 多项式函数MUC无言之家
def fit_func(p, x):MUC无言之家
 f = np.poly1d(p)MUC无言之家
 return f(x)MUC无言之家
  MUC无言之家
  MUC无言之家
# 残差函数MUC无言之家
def residuals_func(p, y, x):MUC无言之家
 ret = fit_func(p, x) - yMUC无言之家
 return retMUC无言之家
  MUC无言之家
  MUC无言之家
x = np.linspace(0, 1, 9) # 随机选择9个点作为xMUC无言之家
x_points = np.linspace(0, 1, 1000) # 画图时需要的连续点MUC无言之家
  MUC无言之家
y0 = real_func(x) # 目标函数MUC无言之家
y1 = [np.random.normal(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数MUC无言之家
  MUC无言之家
p_init = np.random.randn(n) # 随机初始化多项式参数MUC无言之家
  MUC无言之家
plsq = leastsq(residuals_func, p_init, args=(y1, x))MUC无言之家
  MUC无言之家
print 'Fitting Parameters: ', plsq[0] # 输出拟合参数MUC无言之家
  MUC无言之家
pl.plot(x_points, real_func(x_points), label='real')MUC无言之家
pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')MUC无言之家
pl.plot(x, y1, 'bo', label='with noise')MUC无言之家
pl.legend()MUC无言之家
pl.show()

输出拟合参数:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

图像如下:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

从图像上看,很明显我们的拟合函数过拟合了,下面我们尝试在风险函数的基础上加上正则化项,来降低过拟合的现象:MUC无言之家
最小二乘法及其python实现详解MUC无言之家
为此,我们只需要在残差函数中将lambda^(1/2)p加在了返回的array的后面MUC无言之家

regularization = 0.1 # 正则化系数lambdaMUC无言之家
  MUC无言之家
# 残差函数MUC无言之家
def residuals_func(p, y, x):MUC无言之家
 ret = fit_func(p, x) - yMUC无言之家
 ret = np.append(ret, np.sqrt(regularization) * p) # 将lambda^(1/2)p加在了返回的array的后面MUC无言之家
 return retMUC无言之家

 MUC无言之家

输出拟合参数:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

图像如下:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

很明显,在适当的正则化约束下,可以比较好的拟合目标函数。MUC无言之家

注意,如果正则化项的系数太大,会导致欠拟合现象(此时的惩罚项权重特别高)MUC无言之家

如,设置regularization=0.1时,图像如下:MUC无言之家

最小二乘法及其python实现详解MUC无言之家

此时明显欠拟合。所以要慎重进行正则化参数的选择。MUC无言之家

以上这篇最小二乘法及其python实现详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持无言之家。MUC无言之家

发表评论