详解多元线性回归,并分别用标准方程法以及梯度下降法,通过Python编程求解
什么是多元线性回归?
如何实现多元线性回归?
现在,我们只需要让代价函数Jθ最小,就能得到最优的θ参数。那么,要怎样才能使Jθ最小呢?有两个办法,一个是梯度下降法(gradient descent),一个是标准方程法(norm equation)。
Jθ在样本数据X确定时,是关于θ的一个函数,而θ是一个(n+1)维的列向量,也就是说Jθ其实是一个(n+1)元函数。学过微积分的人应该知道,要求一个多元函数的极值,可以令多元函数对每个未知元的偏导数为0,从而求出未知元,再代入函数中,便可求出函数的极值。同样地,我们现在要求Jθ的极值,那么就要先使Jθ关于θ的偏导数,或者说关于θ0、θ1、θ2、...、θn的偏导数都为0。
注意:在第四步中,两边左乘一个XT是为了在左边获得一个方阵(XTX),因为只有方阵才有逆矩阵。
在Python中,只需要两步便可实现这个算法:
1 from numpy.linalg import pinv
2 theta = pinv(X.T.dot(X)).dot(X.T).dot(y)
梯度下降法(Gradient Descent)
标准方程法虽然实现起来很简单,但是在面对十万甚至是百万级别的数据样本量时,求解一个如此大的矩阵的逆需要花费大量的时间,这时候就需要考虑梯度下降法了。梯度下降法的思想是一点点、逐步靠近极小值,通过多次迭代,不断更新θ的值,让代价函数Jθ收敛于极小值。迭代的公式为:
我们已经知道了如何求Jθ关于θ的偏导数,只要一直迭代下去,直到Jθ等于0或者足够的小(比如小于1e-5),最后我们便得到了想要的θ值。
以下我用Python实现了用梯度下降法求θ:
1 import numpy as np
2
3 def partial_derivative(X, theta, y):
4 derivative = X.T.dot(X.dot(theta) - y) / X.shape[0]
5 return derivative
6
7
8 def gradient_descent(X, y, alpha=0.1):
9 theta = np.ones(shape=y.shape, dtype=float)
10 partial_derivative_of_J = partial_derivative(X, theta, y)
11 while any(abs(partial_derivative_of_J) > 1e-5):
12 theta = theta - alpha * partial_derivative_of_J
13 partial_derivative_of_J = partial_derivative(X, theta, y)
14 return theta