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。