标签归档:线性回归

python中几种自动微分库

  简单介绍下python的几个自动求导工具,tangent、autograd、sympy;
  在各种机器学习、深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法、数值微分法、符号微分法、自动微分法,这里分别简单走马观花(hello world式)的介绍下下面几种微分框架;

sympy 强大的科学计算库,使用的是符号微分,通过生成符号表达式进行求导;求得的导数不一定为最简的,当函数较为复杂时所生成的表达式树异常复杂;

autograd自动微分先将符号微分用于基本的算子,带入数值并保存中间结果,后应用于整个函数;自动微分本质上就是图计算,容易做很多优化所以广泛应用于各种机器学习深度学习框架中;

tangent源到源(source-to-source)的自动微分框架,在计算函数f微分时他通过生成新函数f_grad来计算该函数的微分,与目前所存在的所有自动微分框架都有所不同;由于它是通过生成全新的函数来计算微分所以具有非常搞的可读性、可调式性这也是官方所说的与当前自动微分框架的重大不同;

sympy 求导

 def grad():
     # 定义表达式的变量名称
     x, y = symbols('x y')
     # 定义表达式
     z = x**2 +y**2
     # 计算z关于y对应的偏导数
     return diff(z, y)

 func = grad()

输出结果表达式z的导函数z‘=2*y

 print(func) 

把y 等于6 带入计算 结果 为12

 print(func.evalf(subs ={'y':3}))

Autograd求偏导

 import autograd.numpy as np
 from autograd import grad

 #表达式 f(x,y)=x^2+3xy+y^2
 #df/dx = 2x+3y
 #df/dy = 3x+2y
 #x=1,y=2
 #df/dx=8
 #df/dy=7
 def fun(x, y):
   z=x**2+3*x*y+y**2
   return z

 fun_grad = grad(fun)
 fun_grad(2.,1.)

输出:7.0

tangent求导

 import tangent
 def fun(x, y):
   z=x**2+3*x*y+y**2
   return z

默认为求z关于x的偏导数

 dy_dx = tangent.grad(fun)

输出偏导数值为 8 ,z’ = 2 * x,此处x传任何值都是一样的

 df(4, y=1)

可通过使用wrt参数指定求关于某个参数的偏导数,下面为求z关于y的偏导数

 df = tangent.grad(funs, wrt=([1]))

输出值为10 ,z’ = 2 *y,此处x传任何值都是一样的

 df(x=0, y=5)

上面说了那么多也没体现出tangent的核心:源到源(source-to-source)

在生成导函数的时候加入verbose=1参数,即可看到tangent为我们生成的用于计算导数的函数,默认情况下该值为0所以我们没感觉到tangent的求导与别的自动微分框架有什么区别;

 def df(x):
     z = x**2
     return z

 df = tangent.grad(df, verbose=1)
 df(x=2)

在执行完上述代码后,我们看到了tangent为我们所生成用于求导数的函数:

  def ddfdx(x, bz=1.0):
    z = x ** 2
    assert tangent.shapes_match(z, bz), 'Shape mismatch between return value (%s) and seed derivative (%s)' % (numpy.shape(z), numpy.shape(bz))
 # Grad of: z = x ** 2
  _bx = 2 * x * bz
  bx = _bx
  return bx

  ddfdx函数就是所生成的函数,从中我们也可以看到表达式z的导函数z’=2 * x,tangent就是通过执行该函数用于求得导数的;

  sympy 中的自动微分只是它强大的功能之一,autograd 从名字也可知它就是为了自动微分而生的,tangent初出茅庐2017年底Google才发布的自动微分方法也比较新颖,从17年发v0.1.8版本后也没见发版,源码更新也不够活跃;sympy、autograd比较成熟,tangent还有待观察;

线性回归——最大似然法

似然函数

  似然函数与概率非常类似但又有根本的区别,概率为在某种条件(参数)下预测某事件发生的可能性;而似然函数与之相反为已知该事件的情况下推测出该事件发生时的条件(参数);所以似然估计也称为参数估计,为参数估计中的一种算法; 下面先求抛硬币的似然函数,然后再使用似然函数算出线性回归的参数;
  假如有一枚硬币我们现在不知道它是否为正常硬币(正反面出现概率各位50%),所以想通过抛10次然后通过硬币正反面出现的概率分布判断该硬币是否正常;当抛完10次时出现5次正面向上、5次反面向上,正反面出现的概率符合正常硬币的预期,这时我们可以判断该硬币是正常的;

  抛硬币符合二项分布所以下面计算出概率分布情况:
  enter image description here

  如图:
    enter image description here

    上图中x轴为正面出现的次数,y轴为上述函数的结果

  上面式子中w为正反面出现的比例,y为正面出现的次数;

使用最大似然法求硬币问题

  似然函数为知道了结果求条件,概率问题为知道了条件求概率,在这个问题中就是知道了硬币是正常的,求正反面出现的比例w为何值时该结果最靠谱;所以似然函数等于:

    enter image description here

  函数左边的值并非条件概率中的条件而是该函数的依赖值,似然函数L为在给定结果y的情况下参数w的取值情况,概率函数L为知道了参数w求得y的取值;有了抛硬币情况的概率分布这里就可以给出似然函数

  enter image description here

  似然函数求的是在给定样本向量y的情况下,符合该概率分布的参数向量w取值可能性;该似然函数求的是在w取何值时y=5的可能性更高;就问题而言就是求w取何值时enter image description here的最大值,就如之前梯度下降法一样,求该函数的偏导数就可以求得极大值; 由于直接求偏导数比较复杂,通常情况下都会求对数似然函数,对数函数为单调递增的所以与似然函数具有同样的最大值,该对数似然函数为:

  enter image description here

  下面对该似然对数进行求关于w的偏导数:

  enter image description here

  要求其最大值就是求该导数的拐点,也就是令函数等于0;

  enter image description here

  通过求L关于w的偏导数求得w=0.5,于我们上面概率中的w时一致的,也就是说当w=0.5时y正面出现的次数等于5的可能性是最高的;

线性回归

  通过前面几篇文章我们知道了线性回归的模型为:

  enter image description here

  enter image description here为误差值,所以我们也可以变为:

  enter image description here

  enter image description here代表的是误差,我们知道模型与实际的结果值时一个连续随机变量,也就是说损失函数(loss function)的值时连续随机变量,也就是,模型不可能考虑到所有的特征那也可能就过拟合了所以就会存在噪音,一般来说多种噪音叠加会呈现出正态分布的所以这里假设是正态分布的,训练模型的数据集中肯定不止一条记录,但结果只有一个,所以可以假设每条记录误差都是独立同分布的;

  所以线性回归的概率密度函数为:

  enter image description here

  则似然函数为:

  enter image description here

  上面假设过每条记录误差都是独立同分布的,所以数据集的联合密度为:
  enter image description here
  按照惯例直接求解似然函数比较麻烦所以求解对数似然函数:

  enter image description here
  enter image description here
  enter image description here
  enter image description here

  然后求L关于w的偏导数,令其等于0求拐点enter image description here
  enter image description here

  把式子转为向量形式:
  有:
  所以
  enter image description here

  到这一步我们已经求得到了enter image description here,这与前面我们通过最小二乘法求得的矩阵方程一样,所以w也一定是我们这里求得的w正确解;

  使用最大似然法求解问题的步骤为:
    一、确定问题的随机变量类型是离散随机变量还是连续随机变量
    二、得出问题的概率分布
    三、概率函数转为似然函数
    四、似然函数取对数
    五、求关于某变量的偏导数
    六、解似然方程

参考资料:
http://zh.wikipedia.org/zh-hans/%E4%BC%BC%E7%84%B6%E5%87%BD%E6%95%B0
a first course in machine learning