从机器学习到无人驾驶
上QQ阅读APP看书,第一时间看更新

3.3 最小二乘法模型实例

本节展示使用Python进行最小二乘法求得线性回归模型的过程,为了使运算简洁,我们使用NumPy这个著名的Python矩阵和数学运算的利器。NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy的前身Numeric最早是由Jim Hugunin与其他协作者共同开发的,2005年,Travis Oliphant在Numeric中结合了另一个同性质的程序库Numarray的特色,并加入了其他扩展而开发了NumPy。NumPy是开放源代码的,并且由许多协作者共同维护开发。

NumPy是一个运行速度非常快的数学库,主要用于数组计算,而且包含线性代数、傅里叶变换、随机数生成等功能。NumPy的程序接口API设计十分优秀,兼顾了功能性和易用性两方面,TensorFlow在API设计中也大量借鉴了NumPy的API设计思想,我们在TensorFlow的实例中可以逐渐体会。

   import numpy as np
   from numpy.linalg import inv
   from numpy import dot
   from numpy import mat

   #y=2x
   X = mat([1,2,3]).reshape(3, 1)
   Y = 2*X


   theta = dot(dot(inv(dot(X.T, X)), X.T), Y)
   print(theta)

在代码中首先引入NumPy工具库,大多数语言的工具库引入都支持两种方式:整包引入或者部分引入。整包引入会包含整个API功能集合,引入的时候一般会指定别名,例如import numpy as np,整包引入了NumPy并指定别名为np。调用相应功能模块使用“别名+.+函数名称”,例如np.sum。模块引入时使用from包import函数名称,例如实例中的这两个语句:

   from numpy.linalg import inv
   from numpy import dot

引用完成后,在代码中直接使用方法名称来调用相应的方法,首先构建数据集合:

X = mat([1,2,3]).reshape(3, 1)

Y = 2*X

为了能够清楚地反映整个最小二乘法的过程,使用了一个简单的一元线性回归数据集合,X是正整数1,2,3,Y符合方程Y=2X,因此Y的值就是2,4,6。这里使用了NumPy的reshape方法,reshape方法是NumPy矩阵操作最大的利器。numpy.reshape函数可以在不改变数据的条件下修改数组矩阵形状,格式为:numpy.reshape(arr, newshape, order='C')。

  • arr:要修改形状的数组。
  • newshape:整数或者整数数组,新的形状应当兼容原有形状。
  • order:'C'为按行,'F'为按列,'A'为原顺序,'k'为元素在内存中出现的顺序。而且TensorFlow中的reshape操作和NumPy保持操作的一致性,比如:
   import tensorflow as tf
   t = tf.range(start=1,limit=13,delta=1)
     t = tf.reshape(t, [3, 4])
     t = tf.reshape(t, [-1])
     t = tf.reshape(t, [-1, 6])
     t = tf.reshape(t, [-1])
     t = tf.reshape(t, [3, -1, 2])

回到实例中,接下来的一行代码使用NumPy进行矩阵运算求解参数,也就是求解直线的斜率的过程。

theta = dot(dot(inv(dot(X.T, X)), X.T), Y)

在代码中,dot方法为矩阵的点乘,inv方法是矩阵的求逆运算,.T为矩阵的转置。通过矩阵运算可以迅速得出theta的值是2.0。