1 最小二乘法

1.1 解释“最小二乘法”

        我们以最简单的一元线性模型来解释最小二乘法。什么是一元线性模型呢? 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。对于二维空间线性是一条直线;对于三维空间线性是一个平面,对于多维空间线性是一个超平面...

         对于一元线性回归模型,假设从总体中获取了n组观察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。对于平面中的这n个点,可以使用无数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。 选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。有以下三个标准可以选择,以确定直线位置:

(1) “残差和最小”

        缺点是“残差和”之间存在相互抵消的问题,会影响最终的“残差和”

最小二乘 python代码_拟合

(2) “残差绝对值和最小”

最小二乘 python代码_多项式_02

        缺点是绝对值在计算上比较麻烦,增加了计算复杂度

(3) “残差平方和最小”

        这个思想就是“最小二乘法”的原则,既可以避免残差之间互相抵消的问题,也可以降低计算复杂度。这种方法对异常值十分敏感

        使用最多的是“普通最小二乘法OLS(Ordinary Least Square)”:其回归模型应该能够使得训练集的“残差平方和”达到最小。Q为残差平方和-代价函数,也叫平方损失函数

1.2 最小二乘法的定义:

        对于给定的数据,在取定的假设空间H中,求解h(x)∈H,使得残差的最小,即

最小二乘 python代码_多项式_03


1.3 最小二乘法的解

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

h(x)一般情况下是一条多项式的曲线:

最小二乘 python代码_最小二乘 python代码_04

        这里h(x,w)是一个n次多项式,w是其参数。也就是说,最小二乘法就是要找到这样一组

最小二乘 python代码_最小二乘法_05

,使得

最小二乘 python代码_多项式_06

最小。

1.4 求解最小二乘法

        以一个比较简单的线性函数举例:

        

最小二乘 python代码_多项式_07

求解最小二乘法实质就是找出这么一组w,使得残差平方和最小

        

最小二乘 python代码_多项式_08

 

        这里令

最小二乘 python代码_多项式_09

为样本

最小二乘 python代码_多项式_10

的平方损失函数

        这里的Q(w)即为我们要进行最优化的风险函数。这是一个典型的求解极值的问题,只需要分别W0,W1对求偏导数,然后令偏导数为0,即可求解出极值点,即:

        

最小二乘 python代码_拟合_11



1.5 python实现

# _*_ coding: utf-8 _*_

import numpy as np  # 引入numpy

import scipy as sp

import pylab as pl

from scipy.optimizeimport leastsq  # 引入最小二乘函数

 

n = 9  # 多项式次数 

# 目标函数y=sin(2πx)

def real_func(x):

    return np.sin(2 * np.pi * x)

# 多项式函数

def fit_func(p, x):

    f = np.poly1d(p)

    return 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 =[np.random.normal(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数

p_init =np.random.randn(n)  # 随机初始化多项式参数

plsq =leastsq(residuals_func, p_init, args=(y1, x))

print 'FittingParameters: ', 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()